diff --git a/.circleci/config.yml b/.circleci/config.yml index 24551bd24f34..6f545dc011d1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -77,6 +77,13 @@ commands: name: Restore playwright cache keys: - v6-playwright-{{ arch }}-{{ checksum "/tmp/playwright_info.json" }} + - when: + condition: + not: << parameters.browsers >> + steps: + # See https://stackoverflow.com/a/73411601 + - run: corepack enable --install-directory ~/bin + - run: name: View install environment command: | @@ -193,7 +200,7 @@ jobs: test_browser: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.43.1-focal + - image: mcr.microsoft.com/playwright:v1.44.1-focal environment: NODE_ENV: development # Needed if playwright is in `devDependencies` steps: @@ -226,7 +233,7 @@ jobs: test_e2e: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.43.1-focal + - image: mcr.microsoft.com/playwright:v1.44.1-focal environment: NODE_ENV: development # Needed if playwright is in `devDependencies` steps: @@ -239,7 +246,7 @@ jobs: test_e2e_website: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.43.1-focal + - image: mcr.microsoft.com/playwright:v1.44.1-focal environment: NODE_ENV: development # Needed if playwright is in `devDependencies` steps: @@ -254,7 +261,7 @@ jobs: test_regressions: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.43.1-focal + - image: mcr.microsoft.com/playwright:v1.44.1-focal environment: NODE_ENV: development # Needed if playwright is in `devDependencies` steps: @@ -270,7 +277,7 @@ jobs: run_danger: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.43.1-focal + - image: mcr.microsoft.com/playwright:v1.44.1-focal environment: NODE_ENV: development # Needed if playwright is in `devDependencies` steps: diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json index cadf03b4f49f..8b8c292b1594 100644 --- a/.codesandbox/ci.json +++ b/.codesandbox/ci.json @@ -11,6 +11,7 @@ "packages/x-date-pickers", "packages/x-date-pickers-pro", "packages/x-charts", + "packages/x-charts-pro", "packages/x-tree-view" ], "publishDirectory": { @@ -22,6 +23,7 @@ "@mui/x-date-pickers": "packages/x-date-pickers/build", "@mui/x-date-pickers-pro": "packages/x-date-pickers-pro/build", "@mui/x-charts": "packages/x-charts/build", + "@mui/x-charts-pro": "packages/x-charts-pro/build", "@mui/x-tree-view": "packages/x-tree-view/build", "@mui/x-tree-view-pro": "packages/x-tree-view-pro/build" }, diff --git a/.eslintrc.js b/.eslintrc.js index 90ac7f719031..b764cbf2b770 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,36 @@ const baseline = require('@mui/monorepo/.eslintrc'); const path = require('path'); +// Enable React Compiler Plugin rules globally +const ENABLE_REACT_COMPILER_PLUGIN = process.env.ENABLE_REACT_COMPILER_PLUGIN ?? false; + +// Enable React Compiler Plugin rules per package +const ENABLE_REACT_COMPILER_PLUGIN_CHARTS = + process.env.ENABLE_REACT_COMPILER_PLUGIN_CHARTS ?? false; +const ENABLE_REACT_COMPILER_PLUGIN_DATA_GRID = + process.env.ENABLE_REACT_COMPILER_PLUGIN_DATA_GRID ?? false; +const ENABLE_REACT_COMPILER_PLUGIN_DATE_PICKERS = + process.env.ENABLE_REACT_COMPILER_PLUGIN_DATE_PICKERS ?? false; +const ENABLE_REACT_COMPILER_PLUGIN_TREE_VIEW = + process.env.ENABLE_REACT_COMPILER_PLUGIN_TREE_VIEW ?? false; + +const isAnyReactCompilerPluginEnabled = + ENABLE_REACT_COMPILER_PLUGIN || + ENABLE_REACT_COMPILER_PLUGIN_CHARTS || + ENABLE_REACT_COMPILER_PLUGIN_DATA_GRID || + ENABLE_REACT_COMPILER_PLUGIN_DATE_PICKERS || + ENABLE_REACT_COMPILER_PLUGIN_TREE_VIEW; + +const addReactCompilerRule = (packagesNames, isEnabled) => + !isEnabled + ? [] + : packagesNames.map((packageName) => ({ + files: [`packages/${packageName}/src/**/*{.ts,.tsx,.js}`], + rules: { + 'react-compiler/react-compiler': 'error', + }, + })); + // TODO move this helper to @mui/monorepo/.eslintrc // It needs to know about the parent "no-restricted-imports" to not override them. const buildPackageRestrictedImports = (packageName, root, allowRootImports = true) => [ @@ -55,6 +85,10 @@ const buildPackageRestrictedImports = (packageName, root, allowRootImports = tru name: '@mui/x-charts', message: 'Use deeper import instead', }, + { + name: '@mui/x-charts-pro', + message: 'Use deeper import instead', + }, { name: '@mui/x-codemod', message: 'Use deeper import instead', @@ -85,7 +119,11 @@ const buildPackageRestrictedImports = (packageName, root, allowRootImports = tru module.exports = { ...baseline, - plugins: [...baseline.plugins, 'eslint-plugin-jsdoc'], + plugins: [ + ...baseline.plugins, + 'eslint-plugin-jsdoc', + ...(isAnyReactCompilerPluginEnabled ? ['eslint-plugin-react-compiler'] : []), + ], settings: { 'import/resolver': { webpack: { @@ -99,6 +137,7 @@ module.exports = { */ rules: { ...baseline.rules, + ...(ENABLE_REACT_COMPILER_PLUGIN ? { 'react-compiler/react-compiler': 'error' } : {}), // TODO move to @mui/monorepo/.eslintrc, codebase is moving away from default exports 'import/prefer-default-export': 'off', // TODO move rule into the main repo once it has upgraded @@ -207,6 +246,7 @@ module.exports = { }, }, ...buildPackageRestrictedImports('@mui/x-charts', 'x-charts', false), + ...buildPackageRestrictedImports('@mui/x-charts-pro', 'x-charts-pro', false), ...buildPackageRestrictedImports('@mui/x-codemod', 'x-codemod', false), ...buildPackageRestrictedImports('@mui/x-data-grid', 'x-data-grid'), ...buildPackageRestrictedImports('@mui/x-data-grid-pro', 'x-data-grid-pro'), @@ -217,5 +257,19 @@ module.exports = { ...buildPackageRestrictedImports('@mui/x-tree-view', 'x-tree-view', false), ...buildPackageRestrictedImports('@mui/x-tree-view-pro', 'x-tree-view-pro', false), ...buildPackageRestrictedImports('@mui/x-license', 'x-license'), + + ...addReactCompilerRule(['x-charts', 'x-charts-pro'], ENABLE_REACT_COMPILER_PLUGIN_CHARTS), + ...addReactCompilerRule( + ['x-data-grid', 'x-data-grid-pro', 'x-data-grid-premium', 'x-data-grid-generator'], + ENABLE_REACT_COMPILER_PLUGIN_DATA_GRID, + ), + ...addReactCompilerRule( + ['x-date-pickers', 'x-date-pickers-pro'], + ENABLE_REACT_COMPILER_PLUGIN_DATE_PICKERS, + ), + ...addReactCompilerRule( + ['x-tree-view', 'x-tree-view-pro'], + ENABLE_REACT_COMPILER_PLUGIN_TREE_VIEW, + ), ], }; diff --git a/.github/workflows/add-release-reviewers.yml b/.github/workflows/add-release-reviewers.yml index 598b3459f2b1..93526bfe46a8 100644 --- a/.github/workflows/add-release-reviewers.yml +++ b/.github/workflows/add-release-reviewers.yml @@ -1,9 +1,10 @@ name: Add reviewers to release PRs on: - pull_request_target: - branches: ['master', 'next'] - types: ['labeled'] + # pull_request_target: + # branches: ['master', 'next'] + # types: ['labeled'] + workflow_dispatch: permissions: {} diff --git a/.github/workflows/cherry-pick-master-to-v6.yml b/.github/workflows/cherry-pick-master-to-v6.yml index 6d1d08e55cad..e994f648ee92 100644 --- a/.github/workflows/cherry-pick-master-to-v6.yml +++ b/.github/workflows/cherry-pick-master-to-v6.yml @@ -18,7 +18,7 @@ jobs: if: ${{ contains(github.event.pull_request.labels.*.name, 'needs cherry-pick') && github.event.pull_request.merged == true }} steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: fetch-depth: 0 - name: Cherry pick and create the new PR diff --git a/.github/workflows/cherry-pick-next-to-master.yml b/.github/workflows/cherry-pick-next-to-master.yml index 20f0f827b8b4..d4d3aaaa82e0 100644 --- a/.github/workflows/cherry-pick-next-to-master.yml +++ b/.github/workflows/cherry-pick-next-to-master.yml @@ -18,7 +18,7 @@ jobs: if: ${{ contains(github.event.pull_request.labels.*.name, 'needs cherry-pick') && github.event.pull_request.merged == true }} steps: - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: fetch-depth: 0 - name: Cherry pick and create the new PR diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4d698485e3c2..63bcd837e21f 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -16,10 +16,10 @@ jobs: security-events: write steps: - name: Checkout repository - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 + uses: github/codeql-action/init@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # v3.25.8 with: languages: typescript # If you wish to specify custom queries, you can do so here or in a config file. @@ -29,4 +29,4 @@ jobs: # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 + uses: github/codeql-action/analyze@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # v3.25.8 diff --git a/.github/workflows/l10n.yml b/.github/workflows/l10n.yml index 8e49e1b7ce70..b038b57f64b4 100644 --- a/.github/workflows/l10n.yml +++ b/.github/workflows/l10n.yml @@ -17,10 +17,9 @@ jobs: issues: write steps: - run: echo "${{ github.actor }}" - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - - uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 + - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 with: - version: 8 run_install: false - name: Use Node.js 20.x uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 diff --git a/.github/workflows/maintenance.yml b/.github/workflows/maintenance.yml index 5442f8e19417..fbc180ead348 100644 --- a/.github/workflows/maintenance.yml +++ b/.github/workflows/maintenance.yml @@ -25,7 +25,7 @@ jobs: pull-requests: write steps: - name: check if prs are dirty - uses: eps1lon/actions-label-merge-conflict@e62d7a53ff8be8b97684bffb6cfbbf3fc1115e2e # v3.0.0 + uses: eps1lon/actions-label-merge-conflict@1b1b1fcde06a9b3d089f3464c96417961dde1168 # v3.0.2 with: dirtyLabel: 'PR: out-of-date' repoToken: '${{ secrets.GITHUB_TOKEN }}' diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 8d45e4dae6be..64aeb90e6107 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -23,12 +23,12 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: persist-credentials: false - name: Run analysis - uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 + uses: ossf/scorecard-action@dc50aa9510b46c811795eb24b2f1ba02a914e534 # v2.3.3 with: results_file: results.sarif results_format: sarif @@ -44,6 +44,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 + uses: github/codeql-action/upload-sarif@2e230e8fe0ad3a14a340ad0815ddb96d599d2aff # v3.25.8 with: sarif_file: results.sarif diff --git a/.github/workflows/vale-action.yml b/.github/workflows/vale-action.yml index e47135018906..0ff551052faa 100644 --- a/.github/workflows/vale-action.yml +++ b/.github/workflows/vale-action.yml @@ -12,7 +12,7 @@ jobs: contents: read pull-requests: write steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - uses: errata-ai/vale-action@38bf078c328061f59879b347ca344a718a736018 # v2.1.0 with: reporter: github-pr-review diff --git a/.gitignore b/.gitignore index a10ee92e04cf..ca6bf0461cd6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ __diff_output__ /docs/.next /docs/pages/playground/* !/docs/pages/playground/tsconfig.json +/docs/.env.local /docs/export /test/regressions/screenshots build diff --git a/.mocharc.js b/.mocharc.js index f53ea7795363..e45e0484ca48 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -9,6 +9,7 @@ module.exports = { 'docs/.next/**', // x-charts requires 'tsx/cjs' which conflict with the babel date-fns override for picker tests 'packages/x-charts/**', + 'packages/x-charts-pro/**', ], recursive: true, timeout: (process.env.CIRCLECI === 'true' ? 5 : 2) * 1000, // Circle CI has low-performance CPUs. diff --git a/CHANGELOG.md b/CHANGELOG.md index c6b23f8db707..e2b8914d6b6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,243 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 7.6.2 + +_Jun 6, 2024_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 📚 Adds Date and Time Pickers accessibility page +- 🐞 Bugfixes +- 📚 Documentation improvements + + + +### Data Grid + +#### `@mui/x-data-grid@7.6.2` + +- [DataGrid] Add the `areElementSizesEqual` utility to improve code readability (#13254) @layerok +- [DataGrid] Clean up IE remnants from the codebase (#13390) @MBilalShafi + +#### `@mui/x-data-grid-pro@7.6.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@7.6.2`. + +#### `@mui/x-data-grid-premium@7.6.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@7.6.2`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@7.6.2` + +- [fields] Fix `PageUp` and `PageDown` editing on letter sections (#13310) @arthurbalduini +- [pickers] Fix `AdapterDayjs` timezone behavior (#13362) @LukasTy +- [pickers] Use `useRtl` instead of `useTheme` to access direction (#13363) @flaviendelangle + +#### `@mui/x-date-pickers-pro@7.6.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@7.6.2`. + +### Charts + +#### `@mui/x-charts@7.6.2` + +- [charts] Add `Initializable` type and behaviour to allow checking if a complex context has been initialized. (#13365) @JCQuintas +- [charts] Fix some props not working in `xAxis` and `yAxis` (#13372) @Valyok26 +- [charts] Harmonize charts types (#13366) @alexfauquette +- [charts] Introduce plugins system (#13367) @alexfauquette +- [charts] Simplify plugin types (#13396) @JCQuintas + +### Docs + +- [docs] Add badges like in Material UI @oliviertassinari +- [docs] Update twitter.com to x.com @oliviertassinari +- [docs] Fix the description of `tickInterval` (#13355) @alexfauquette +- [docs] Adjust the code example for `quickFilterValues` (#12919) @michelengelen +- [docs] Create Pickers accessibility page (#13274) @arthurbalduini + +### Core + +- [core] Comment on `CSS.escape` for the future @oliviertassinari +- [core] Fix `l10n` action setup (#13382) @LukasTy +- [core] Fixes in preparation for React 18.3 (#13378) @LukasTy +- [core] Remove explicit `marked` dependency (#13383) @LukasTy +- [core] Remove unused `@types/prettier` dependency (#13389) @LukasTy +- [core] Add `docs/.env.local` to `.gitignore` (#13377) @KenanYusuf + +## 7.6.1 + +_May 31, 2024_ + +We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: + +🐞 Address the `@mui/internal-test-utils` added as a direct dependency to `@mui/x-data-grid` by mistake. + + + +### Data Grid + +#### `@mui/x-data-grid@7.6.1` + +- [DataGrid] Fix column resize not working with special character (#13069) @oukunan +- [DataGrid] Move `@mui/internal-test-utils` to dev dependency (#13318) @LukasTy + +#### `@mui/x-data-grid-pro@7.6.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@7.6.1`. + +#### `@mui/x-data-grid-premium@7.6.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@7.6.1`. + +## 7.6.0 + +_May 30, 2024_ + +We'd like to offer a big thanks to the 14 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Allow to define and customize the indentation of nested items in the Tree View +- ✨ Allow charts highlights to be controlled +- 🌍 Improve Persian (fa-IR) locale on the Data Grid +- 🐞 Bugfixes +- 📚 Documentation improvements + + + +### Data Grid + +#### `@mui/x-data-grid@7.6.0` + +- [DataGrid] Avoid re-rendering all cells on column change (#12980) @romgrk +- [DataGrid] Export `GridColumnHeadersProps` (#13229) @cherniavskii +- [DataGrid] Fix header filters' issue with custom filters (#13255) @MBilalShafi +- [DataGrid] Remove dead logic to support Safari < 13 (#13249) @oliviertassinari +- [l10n] Improve Persian (fa-IR) locale (#12994) @amiryxe + +#### `@mui/x-data-grid-pro@7.6.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@7.6.0`. + +#### `@mui/x-data-grid-premium@7.6.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@7.6.0`, plus: + +- [DataGridPremium] Fix excel export causing column with wrong width (#13191) @romgrk + +### Date and Time Pickers + +#### `@mui/x-date-pickers@7.6.0` + +- [pickers] Fix `DateBuilderReturnType` when the date is `undefined` (#13244) @alexey-kozlenkov + +#### `@mui/x-date-pickers-pro@7.6.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@7.6.0`. + +### Charts + +#### `@mui/x-charts@7.6.0` + +- [charts] Allow charts highlights to be controlled (#12828) @JCQuintas +- [charts] Refactor axis band scaleType check (#13295) @JCQuintas +- [charts] Refactor checkScaleErrors to improve readability and simplify axis message logic (#13305) @JCQuintas + +### Tree View + +#### `@mui/x-tree-view@7.6.0` + +- [TreeView] Add JSDoc to every instance method (#13219) @flaviendelangle +- [TreeView] Allow to customize the indentation of nested items (#13225) @flaviendelangle +- [TreeView] Allow to define indentation at the item level (#13126) @flaviendelangle + +### Docs + +- [docs] Add Bulk editing demo for the Community plan (#12800) @cherniavskii +- [docs] Add conditional label formatting on tooltip page and link to label page (#13235) @JCQuintas +- [docs] Add information about key combinations on a11y sections (#13234) @arthurbalduini +- [docs] Cleanup of the Tree View demos (#13237) @flaviendelangle +- [docs] Document how to customize a subsection of a line chart (#13210) @alexfauquette +- [docs] Fix Pickers FAQ callout (#13238) @LukasTy +- [docs] Fix Vale errors @oliviertassinari +- [docs] Fix a small typo in property comment (#13245) @Janpot +- [docs] Improve the Data Grid FAQ page (#13258) @MBilalShafi +- [docs] Removes unused lines in TreeItem2 styling (#13264) @arthurbalduini +- [docs] Small improvements on accessibility data grid doc (#13233) @arthurbalduini +- [docs] Update Pickers demo configurations (#13303) @LukasTy + +### Core + +- [core] Add comment on why logic to sync column header (#13248) @oliviertassinari +- [core] Fix `l10n` script execution with arguments (#13297) @LukasTy +- [core] Prevent "Add reviewers" workflow from triggering since it doesn't work (#13236) @JCQuintas +- [docs-infra] Fix `@mui/material` version used in sandboxes (#13260) @LukasTy +- [test] Use `describeTreeView` for keyboard navigation tests on disabled items (#13184) @flaviendelangle +- [test] Use `describeTreeView` for remaining items tests (#13262) @flaviendelangle +- [test] Use test-utils from npm (#12880) @michaldudak +- [typescript] Remove duplicate `DateRangePosition` type in favor of `RangePosition` (#13288) @LukasTy + +## v7.5.1 + +_May 23, 2024_ + +We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: + +- 🧰 Improve tree view testing +- 📊 Add `label` to be displayed in BarChart + +### Data Grid + +#### `@mui/x-data-grid@7.5.1` + +- [DataGrid] Escape formulas in CSV and Excel export (#13115) @cherniavskii + +#### `@mui/x-data-grid-pro@7.5.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@7.5.1`. + +#### `@mui/x-data-grid-premium@7.5.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@7.5.1`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@7.5.1` + +- [pickers] Fix `disableOpenPicker` prop behavior (#13212) @LukasTy + +#### `@mui/x-date-pickers-pro@7.5.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@7.5.1`. + +### Charts + +#### `@mui/x-charts@7.5.1` + +- [charts] Add `label` to be displayed inside bars in BarChart (#12988) @JCQuintas +- [charts] Setup the repository for charts-pro (#13182) @alexfauquette + +### Docs + +- [docs] Clean the pages in the navbar (#13192) @flaviendelangle +- [docs] Improve Tree View selection doc (#13105) @flaviendelangle +- [docs] Unify Tree View `apiRef` methods doc examples (#13193) @flaviendelangle + +### Core + +- [core] Remove `raw-loader` package (#13160) @LukasTy +- [core] Remove outdated prop-types (#13181) @flaviendelangle +- [core] Rename `yarn` to `pnpm` in `PropTypes` comment (#13167) @LukasTy +- [core] Use `describeTreeView` for items test (partial) (#12893) @flaviendelangle +- [core] Use `describeTreeView` for keyboard selection tests (#13164) @flaviendelangle +- [core] Use `describeTreeView` for navigation tests (#12907) @flaviendelangle +- [core] Use `describeTreeView` for items rendering edge-case tests (#13168) @flaviendelangle +- [core] Add `test:coverage:inspect` to allow easier debugging (#13198) @JCQuintas +- [core] Fix `yarn proptypes` vs `pnpm proptypes` (#13199) @JCQuintas +- [code-infra] Run corepack enable on all CI jobs (#13205) @Janpot +- [code-infra] Use `nx` for lerna tasks (#13166) @LukasTy + ## v7.5.0 _May 17, 2024_ @@ -279,7 +516,7 @@ Same changes as in `@mui/x-date-pickers@7.3.1`. ### Core - [core] Fix `l10n` GH workflow (#12895) @LukasTy -- [core] Match Base UI and Toolpad @oliviertassinari +- [core] Match Base UI and Toolpad @oliviertassinari - [core] Remove redundant `setupFiles` entries in `package.json` (#12899) @LukasTy - [core] Use `describeTreeView` for focus tests (#12698) @flaviendelangle - [core] Use `describeTreeView` for type-ahead tests (#12811) @flaviendelangle @@ -3417,5422 +3654,6 @@ Here is an example of the renaming for the `` component. - [core] Update release instructions as per v7 configuration (#10962) @MBilalShafi - [license] Correctly throw errors (#10924) @oliviertassinari -## 6.19.12 - -_May 17, 2024_ - -We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: - -- 🐞 Bugfixes - -### Date Pickers - -#### `@mui/x-date-pickers@6.19.12` - -- [pickers] Fix `AdapterMomentJalaali` regression (#13150) @LukasTy - -#### `@mui/x-date-pickers-pro@6.19.12` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.12`. - -### Docs - -- [docs] Use MUI X v6 in Codesandbox and Stackblitz demos (#12838) @cherniavskii - -## 6.19.11 - -_Apr 18, 2024_ - -We'd like to offer a big thanks to the 1 contributor who made this release possible. Here are some highlights ✨: - -- 🐞 Bugfixes - -### Data Grid - -#### `@mui/x-data-grid@6.19.11` - -- [DataGrid] Fix virtualization memory leak (#12812) @romgrk - -#### `@mui/x-data-grid-pro@6.19.11` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.11`. - -#### `@mui/x-data-grid-premium@6.19.11` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.11`. - -## 6.19.10 - -_Apr 12, 2024_ - -We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: - -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.19.10` - -- [DataGrid] Do not escape double quotes when copying to clipboard (#12734) @cherniavskii -- [DataGrid] Fix bug in suspense (#12754) @cherniavskii - -#### `@mui/x-data-grid-pro@6.19.10` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.10`. - -#### `@mui/x-data-grid-premium@6.19.10` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.10`. - -### Core - -- [core] Update the docs release source branch (#12685) @LukasTy - -## 6.19.9 - -_Apr 5, 2024_ - -We'd like to offer a big thanks to the 3 contributors who made this release possible. Here are some highlights ✨: - -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.19.9` - -- [DataGrid] Remove legacy editing API event: `rowEditCommit` (#12087) @MBilalShafi - -#### `@mui/x-data-grid-pro@6.19.9` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.9`. - -#### `@mui/x-data-grid-premium@6.19.9` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.9`. - -### Date Pickers - -#### `@mui/x-date-pickers@6.19.9` - -No changes. - -#### `@mui/x-date-pickers-pro@6.19.9` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -- [DateRangePicker] Fix selection behavior with single input field when `readOnly` (#12605) @LukasTy - -### Docs - -- [docs] Add a recipe for the `checkboxSelectionVisibleOnly` prop (#12667) @michelengelen -- [docs] Explain the use of `_action: 'delete'` in `processRowUpdate` (#12673) @michelengelen - -### Core - -- [core] Use Circle CI context (#12607) @cherniavskii - -## 6.19.8 - -_Mar 20, 2024_ - -We'd like to offer a big thanks to the 3 contributors who made this release possible. - -### Data Grid - -#### `@mui/x-data-grid@6.19.8` - -- [DataGrid] Fix `ElementType` usage (#12505) @cherniavskii -- [DataGrid] Fix cell value formatting on copy (#12483) @sai6855 -- [DataGrid] Fix checkbox selection when filtering (#12485) @g1mishra - -#### `@mui/x-data-grid-pro@6.19.8` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.8`. - -#### `@mui/x-data-grid-premium@6.19.8` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.8`, plus: - -- [DataGridPremium] Add support for confirmation before clipboard paste (#12466) @cherniavskii - -### Docs - -- [docs] Update links to v7 (#12495) @cherniavskii - -## 6.19.7 - -_Mar 14, 2024_ - -We'd like to offer a big thanks to @LukasTy who made this release possible. - -### Date Pickers - -#### `@mui/x-date-pickers@6.19.7` - -- [pickers] Keep the existing time when looking for closest enabled date (#12410) @LukasTy - -#### `@mui/x-date-pickers-pro@6.19.7` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.7`. - -### Docs - -- [docs] Add Pickers custom start of week section (#12425) @LukasTy - -## 6.19.6 - -_Mar 1, 2024_ - -We'd like to offer a big thanks to the 4 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Korean (ko-KR) and Chinese (zh-CN) locales on the Pickers -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.19.6` - -- [DataGrid] Fix error when existing rows are passed to `replaceRows` (@martijn-basesoft) - -#### `@mui/x-data-grid-pro@6.19.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.6`. - -#### `@mui/x-data-grid-premium@6.19.6` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.6`, plus: - -- [DataGridPremium] Make clipboard copy respect the sorting during cell selection (#12255) @MBilalShafi - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.19.6` - -- [l10n] Improve Chinese (zh-CN) locale (#12250) @headironc -- [l10n] Improve Korean (ko-KR) locale (#12186) @Luzi - -#### `@mui/x-date-pickers-pro@6.19.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.6`. - -### Docs - -- [docs] Update lazy loading demo to show skeleton rows during initial rows fetch (#12062) @cherniavskii - -## 6.19.5 - -_Feb 23, 2024_ - -We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: - -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.19.5` - -- [DataGrid] Fix styling grid filter input single select (#12079) @FreakDroid - -#### `@mui/x-data-grid-pro@6.19.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.5`. - -#### `@mui/x-data-grid-premium@6.19.5` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.5`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.19.5` - -- [pickers] Fix `referenceDate` day calendar focus (#12136) @LukasTy -- [pickers] Fix styling props propagation to `DateTimePickerTabs` (#12131) @LukasTy - -#### `@mui/x-date-pickers-pro@6.19.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.5`. - -### Charts / `@mui/x-charts@6.19.5` - -- [charts] Allow to skip animation on sparkline bar (#12160) @alexfauquette - -### Docs - -- [docs] Clarify Pickers 'Component composition' section (#12147) @LukasTy -- [docs] Fix 301 redirection to StackBlitz @oliviertassinari -- [docs] Fix 301 to Material UI @oliviertassinari -- [docs] Fix 301 to Material UI @oliviertassinari -- [docs] Fix 404 links to translation source @oliviertassinari -- [docs] Fix dead link to translations @oliviertassinari -- [docs] Fix the Treemap illustration (#12189) @danilo-leal -- [docs] Fix typo for `AdapterDateFnsV3` (#12037) @flaviendelangle -- [docs] Improve performance on Charts entry point @oliviertassinari -- [docs] Move Heatmap to Pro (#12170) @alexfauquette -- [docs] Remove Charts installation next tag call-out (#12133) @LukasTy -- [docs] Removed `focused` prop from demo (#12126) @michelengelen -- [docs] Add missing Heatmap Pro icon @oliviertassinari -- [docs] Add more illustrations to the Overview page (#12041) @danilo-leal -- [docs] Avoid use of shorthand (#12009) @oliviertassinari - -### Core - -- [core] Fix CI @oliviertassinari -- [core] Fix docs link check (#12137) @LukasTy - -## 6.19.4 - -_Feb 9, 2024_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Danish (da-DK) locale on the Data Grid (#11972) @ShahrazH -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.19.4` - -- [DataGrid] Add support for dialogs in menu actions (#11937) @cherniavskii -- [DataGrid] Allow passing readonly arrays to `pageSizeOptions` prop (#11992) @pcorpet -- [DataGrid] Fix row reorder with cell selection (#11878) @PEsteves8 -- [DataGrid] Replace `eval` with `new Function` (#11962) @cherniavskii -- [l10n] Improve Danish (da-DK) locale (#11972) @ShahrazH - -#### `@mui/x-data-grid-pro@6.19.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.4`. - -#### `@mui/x-data-grid-premium@6.19.4` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.4`, plus: - -- [DataGridPremium] Fix autosize grouping cell (#11990) @romgrk -- [DataGridPremium] Fix error after closing print export (#11889) @cherniavskii - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.19.4` - -- [pickers] Avoid relying on locale in Luxon `isWithinRange` method (#11940) @LukasTy - -#### `@mui/x-date-pickers-pro@6.19.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.4`. - -### Charts / `@mui/x-charts@6.19.4` - -- [charts] Add `reverse` property to axes (#11959) @alexfauquette -- [charts] Allow series ids to be numbers (#11960) @alexfauquette -- [charts] Fix Proptypes error by supporting string values for axes (#11953) @alexfauquette - -### Docs - -- [docs] Add a note about `AdapterDateFnsV3` on the Getting Started page (#11987) @flaviendelangle -- [docs] Avoid the use of MUI Core @oliviertassinari -- [docs] Fix API links (#11930) @alexfauquette -- [docs] Fix `ChartsTooltip` typo (#11967) @thisisharsh7 -- [docs] Refactor `Localization` documentation sections (#11997) @LukasTy -- [code] Simplify bug reproduction (#11932) @alexfauquette - -## 6.19.3 - -_Feb 1, 2024_ - -We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Hebrew (he-IL) locale (#11831) @danielmishan85 -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.19.3` - -- [l10n] Improve Hebrew (he-IL) locale (@danielmishan85) (#11831) - -#### `@mui/x-data-grid-pro@6.19.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.3`. - -#### `@mui/x-data-grid-premium@6.19.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.3`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.19.3` - -- [TimePicker] Add missing toolbar classes descriptions (#11862) @LukasTy - -#### `@mui/x-date-pickers-pro@6.19.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.3`. - -### Charts / `@mui/x-charts@6.19.3` - -- [charts] Document how to modify color according to values (#11854) @alexfauquette - -### Docs - -- [docs] Add a general uplift to the whats new page (#11883) @danilo-leal -- [docs] Fix 404 (#11852) @alexfauquette -- [docs] Fix generation (#11825) @alexfauquette -- [docs] Fix docs:api when typo in slots typing (#11861) @alexfauquette -- [docs] Improve Support page (#11556) @oliviertassinari -- [docs] Sync support page with core @oliviertassinari -- [docs] These API don't exist in MUI X v6 @oliviertassinari -- [docs] Update whats new page with v7 Beta blogpost content (#11886) @joserodolfofreitas - -## 6.19.2 - -_Jan 25, 2024_ - -We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Apply the `layout.tabs` class to `Tabs` slot (@LukasTy) (#11782) -- 🐞 Bugfixes - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.19.2` - -- [pickers] Apply the `layout.tabs` class to `Tabs` slot (@LukasTy) (#11782) - -#### `@mui/x-date-pickers-pro@6.19.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.2`, plus: - -- [DateRangePicker] Remove `calendars` prop on `Mobile` (@LukasTy) (#11771) - -### Data Grid - -#### `@mui/x-data-grid@6.19.2` - -- [DataGrid] Fix support for tree with more than 50,000 children (@zenazn) (#11808) - -#### `@mui/x-data-grid-pro@6.19.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.2`. - -#### `@mui/x-data-grid-premium@6.19.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.2`. - -## 6.19.1 - -_Jan 19, 2024_ - -We'd like to offer a big thanks to the 1 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Add Croatian (hr-HR), Portuguese (pt-PT), and Chinese (Hong Kong) (zh-HK) locales (#11717) @BCaspari -- 🐞 Bugfixes - -### Data Grid - -#### `@mui/x-data-grid@6.19.1` - -- [l10n] Add Croatian (hr-HR), Portuguese (pt-PT), and Chinese (Hong Kong) (zh-HK) locales (#11717) @BCaspari - -#### `@mui/x-data-grid-pro@6.19.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.19.1`. - -#### `@mui/x-data-grid-premium@6.19.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.19.1`. - -### Charts / `@mui/x-charts@6.19.1` - -- [charts] Add `arcLabelRadius` property (#11563) @alexfauquette -- [charts] Do not propagate `innerRadius` and `outerRadius` to the DOM (#11719) @alexfauquette -- [charts] Fix default `stackOffset` for `LineChart` (#11703) @alexfauquette - -## 6.19.0 - -_Jan 11, 2024_ - -We'd like to offer a big thanks to the 3 contributors who made this release possible. Here are some highlights ✨: - -- ⏰ Support date-fns v3 (#11659) @LukasTy - Pickers support both v2 and v3 of date-fns. For v3 use `AdapterDateFnsV3`. - ```js - // with date-fns v2.x - import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; - import de from 'date-fns/locale/de'; - ``` - ```js - // with date-fns v3.x - import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'; - import { de } from 'date-fns/locale/de'; - ``` - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.19.0` - -- [pickers] Add date-fns@3.x adapter (#11659) @LukasTy -- [pickers] Fix clearable behavior blocking focus return to `OpenPickerButton` (#11643) @noraleonte -- [l10n] Add missing Danish (da-DK) locale export (#11641) @etlos - -#### `@mui/x-date-pickers-pro@6.19.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.19.0`. - -### Docs - -- [docs] Add missing component @oliviertassinari -- [docs] Fix parsing of `x-date-pickers-pro` demo adapter imports (#11637) @LukasTy -- [docs] Push up the MUI X brand (#11533) @oliviertassinari -- [docs] Improve Server-side data grid docs (#11589) @oliviertassinari -- [docs] Add demo to the charts overview page (#11586) @danilo-leal -- [docs] Fix 404 links in the docs @oliviertassinari -- [docs] Improve landing page (#11570) @oliviertassinari -- [docs] Give a general revision to the docs (#11249) @danilo-leal - -## 6.18.7 - -_Jan 5, 2024_ - -We'd like to offer a big thanks to the 4 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Czech (cs-CZ) locale on Data Grid (#11429) @wensiet -- 🐞 Bugfixes - -### Data Grid - -#### `@mui/x-data-grid@6.18.7` - -- [DataGrid] Don't evaluate `hasEval` when `disableEval` is set (#11553) @reihwald -- [l10n] Update Czech (cs-CZ) locale (#11498) @fdebef - -#### `@mui/x-data-grid-pro@6.18.7` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.7`. - -#### `@mui/x-data-grid-premium@6.18.7` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.7`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.7` - -- [pickers] Fix views management (@LukasTy) (#11572) - -#### `@mui/x-date-pickers-pro@6.18.7` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.7`. - -### Charts / `@mui/x-charts@6.18.7` - -- [charts] Fix `null` in line chart using dataset (@alexfauquette) (#11561) - -### Docs - -- [docs] Clarify Pickers usage with Luxon (#11566) @LukasTy - -## 6.18.6 - -_Dec 22, 2023_ - -We'd like to offer a big thanks to the 5 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Russian (ru-RU) locale (#11429) @wensiet -- 🐞 Bugfixes - -### Data Grid - -#### `@mui/x-data-grid@6.18.6` - -- [DataGrid] Fix typos in the JSDoc (#11475) @flaviendelangle -- [l10n] Improve Russian (ru-RU) locale (#11429) @wensiet - -#### `@mui/x-data-grid-pro@6.18.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.6`. - -#### `@mui/x-data-grid-premium@6.18.6` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.6`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.6` - -- [fields] Fix section pasting (#11467) @LukasTy - -#### `@mui/x-date-pickers-pro@6.18.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.6`. - -### Charts / `@mui/x-charts@6.18.4` - -- [charts] Allow percentage values for pie chart center and radius (#11464) @alexfauquette -- [charts] Make error message more explicit (#11457) @alexfauquette -- [charts] Make the helper `ChartsText` component public (#11370) @alexfauquette -- [charts] Improve dataset typing (#11372) @alexfauquette -- [charts] Fix size overflow (#11385) @alexfauquette - -### Docs - -- [docs] Document false default values for boolean props (#11489) @cherniavskii -- [docs] Improve Pickers `name` prop examples (#11442) @LukasTy -- [docs] Limit `date-fns` package to v2 in codesandbox (#11478) @LukasTy -- [test] Reload the page if its blank and there are no links to the remaining tests (#11471) @cherniavskii - -## 6.18.5 - -_Dec 14, 2023_ - -We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Swedish (sv-SE) and Urdu (ur-PK) locales on the Data Grid -- 🐞 Bugfixes - -### Data Grid - -#### `@mui/x-data-grid@6.18.5` - -- [l10n] Improve Swedish (sv-SE) locale (#11379) @fredrikcarlbom -- [l10n] Improve Urdu (ur-PK) locale for data grid (#11409) @MBilalShafi - -#### `@mui/x-data-grid-pro@6.18.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.5`. - -#### `@mui/x-data-grid-premium@6.18.5` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.5`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.5` - -- [pickers] Fix field types to avoid error on latest `@types/react` version (#11398) @LukasTy -- [pickers] Support name prop (#11380) @gitstart - -#### `@mui/x-date-pickers-pro@6.18.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.5`, plus: - -- [DateRangePicker] Fix `autoFocus` behavior (#11376) @kealjones-wk - -### Docs - -- [docs] Respect GoT books (#11294) @janoma -- [test] Fix flaky screenshots (#11391) @cherniavskii - -## 6.18.4 - -_Dec 8, 2023_ - -We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: - -- 📚 Add [Pickers FAQ page](https://mui.com/x/react-date-pickers/faq/) -- 🌍 Improve Danish (da-DK) locale on Data Grid -- 🐞 Bugfixes - -### Data Grid - -#### `@mui/x-data-grid@6.18.4` - -- [DataGrid] Fix cell slot style override (#11215) @oliviertassinari -- [l10n] Improve Danish (da-DK) locale (#11346) @goibon - -#### `@mui/x-data-grid-pro@6.18.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.4`. - -#### `@mui/x-data-grid-premium@6.18.4` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.4`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.4` - -- [pickers] Fix `MultiSectionDigitalClock` issues (#11308) @LukasTy - -#### `@mui/x-date-pickers-pro@6.18.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.4`. - -### Docs - -- [docs] Fix typo (#11323) @cadam11 -- [docs] Add FAQ page (#11347) @noraleonte - -## 6.18.3 - -_Dec 4, 2023_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 📈 Fix a lot of Charts package issues -- 🌍 Improve Bulgarian (bg-BG) locale on Data Grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.18.3` - -- [DataGrid] Fix cell editing adding a leading "v" on paste (#11166) @prasad5795 -- [DataGrid] Fix handling of event target in portal (#11209) @cherniavskii -- [DataGrid] Fix `onFilterModelChange` being fired with stale field value (#11244) @gitstart -- [l10n] Improve Bulgarian (bg-BG) locale (#10856) (#11206) @Kristiqn95 - -#### `@mui/x-data-grid-pro@6.18.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.3`. - -#### `@mui/x-data-grid-premium@6.18.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.3`, plus: - -- [DataGridPremium] Fix aggregated column ignoring column definition changes (#11176) @cherniavskii -- [DataGridPremium] Fix custom filter operators not working on aggregated column (#11201) @cherniavskii - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.3` - -- [pickers] Correctly format `MultiSectionDigitalClock` number sections (#11297) @LukasTy -- [pickers] Expand field placeholder methods flexibility by providing `format` parameter (#11254) @LukasTy - -#### `@mui/x-date-pickers-pro@6.18.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.3`. - -### Charts / `@mui/x-charts@6.18.3` - -- [charts] Adjusted `defaultizeValueFormatter` util to accept an optional `series.valueFormatter` value (#11213) @michelengelen -- [charts] Apply `labelStyle` and `tickLabelStyle` props on `<ChartsYAxis />` (#11180) @akamfoad -- [charts] Fix TS config (#11259) @alexfauquette -- [charts] Fix error with empty dataset (#11063) @alexfauquette -- [charts] Fix export strategy (#11235) @alexfauquette - -### Docs - -- [docs] Add LTS section to support page (#11300) @joserodolfofreitas -- [docs] Add end v6 blogpost to whats new page (#11299) @joserodolfofreitas -- [docs] Document charts composition (#10710) @alexfauquette -- [docs] Fix version links (#11167) @LukasTy -- [docs] Improve Data Grid togglable columns example (#11241) @MBilalShafi -- [docs] Split charts overview and getting started in distinct pages (#10910) @alexfauquette - -## 6.18.2 - -_Nov 23, 2023_ - -We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Arabic (ar-SD), Czech (cs-CZ), and Hebrew (he-IL) locales on Data Grid -- 🌍 Add Basque (eu) and Macedonian (mk) locales on Pickers -- 🌍 Improve German (de-DE) and Spanish (es-ES) locales on Pickers -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.18.2` - -- [l10n] Improve Arabic (ar-SD) locale (#11096) @OmarWebDev -- [l10n] Improve Czech (cs-CZ) locale (#10968) @luborepka -- [l10n] Improve Hebrew (he-IL) locale (#11056) @LironKiloma - -#### `@mui/x-data-grid-pro@6.18.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.2`. - -#### `@mui/x-data-grid-premium@6.18.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.2`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.2` - -- [l10n] Add Basque (eu) locale and improve Spanish (es-ES) locale (#10985) @lajtomekadimon -- [l10n] Add Macedonian (mk) locale (#11155) @brsnik -- [l10n] Improve German (de-DE) locale (#11104) @jho-vema -- [pickers] Deprecate `defaultCalendarMonth` prop (#11138) @flaviendelangle -- [pickers] Fix `DateCalendar` crashing when given an invalid value (#11101) @flaviendelangle - -#### `@mui/x-date-pickers-pro@6.18.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.2`. - -### Charts / `@mui/x-charts@6.18.2` - -- [charts] Fix `ChartsTooltip` component setup (#11157) @LukasTy -- [charts] Remove outdated prop-types (#10998) @alexfauquette - -### Docs - -- [docs] Fix incoherent naming of a component in `Custom slots and subcomponents` page (#11003) @lhilgert9 -- [test] Skip flaky e2e test in webkit (#11115) @cherniavskii -- [test] Wait for images to load (#11109) @cherniavskii - -## 6.18.1 - -_Nov 9, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- ✨ Fix aggregation label not showing when `renderHeader` is used (#10961) @cherniavskii -- 📘 Server side data source [early documentation](https://mui.com/x/react-data-grid/server-side-data/) published -- 📈 `<ChartsReferenceLine />` component is now available -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.18.1` - -- [DataGrid] Fix cell value type in quick filtering v7 (#10884) @cherniavskii -- [DataGrid] Fix keyboard navigation for actions cell with disabled buttons (#10947) @michelengelen -- [DataGrid] Fix `undefined` slot values (#10934) @romgrk - -#### `@mui/x-data-grid-pro@6.18.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.1`, plus: - -- [DataGridPro] Add data source interface and basic documentation (#10543) @MBilalShafi - -#### `@mui/x-data-grid-premium@6.18.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.1`, plus: - -- [DataGridPremium] Render aggregation label when `renderHeader` is used (#10961) @cherniavskii - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.1` - -- [fields] Fix multi input date time field section selection (#10915) @noraleonte -- [pickers] Always use up-to-date `defaultView` (#10889) @LukasTy - -#### `@mui/x-date-pickers-pro@6.18.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.1`. - -### Charts / `@mui/x-charts@6.18.1` - -- [charts] Add `<ChartsReferenceLine />` component (#10597) @wascou -- [charts] Improve properties JSDoc (#10931) @alexfauquette - -### Docs - -- [docs] Fix charts docs as stable (#10888) @alexfauquette -- [docs] Document how to hide the legend (#10954) @alexfauquette - -### Core - -- [core] Adds new alpha version to version select on the docs (#10944) @michelengelen -- [core] Fix GitHub title tag consistency @oliviertassinari - -## 6.18.0 - -_Nov 3, 2023_ - -We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 The Charts package is now officially stable! -- 🥧 Pie charts are now animated. -- 📈 Line charts now support partial data, and can interpolate missing data https://mui.com/x/react-charts/lines/#skip-missing-points. - - <img src="https://github.com/mui/mui-x/assets/3165635/d2d50b1b-ee29-4e4c-9ebe-629c06f3093e" width="683" height="436" alt="Charts partial data" /> - -- ✨ The data grid allows to ignore [diacritics](https://en.wikipedia.org/wiki/Diacritic) when filtering. -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.18.0` - -- [DataGrid] Allow to ignore [diacritics](https://en.wikipedia.org/wiki/Diacritic) when filtering (#10569) @cherniavskii -- [DataGrid] Fix a typo in `gridFilterApi` (#10786) @vu-dao-93 -- [DataGrid] Fix `undefined` row id (#10670) @romgrk -- [DataGrid] Make column autosizing work with dynamic row height (#10693) @cherniavskii -- [l10n] Allow to customize sorting label per column (#10839) @JerryWu1234 - -#### `@mui/x-data-grid-pro@6.18.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.18.0`. - -#### `@mui/x-data-grid-premium@6.18.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.18.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.18.0` - -- [pickers] Add reference links to calendar components (#10644) @michelengelen - -#### `@mui/x-date-pickers-pro@6.18.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.18.0`. - -### Charts / `@mui/x-charts@6.18.0` - -- [charts] Add animation on pie chart (#10782) @alexfauquette -- [charts] Add reference links to shared/misc chart components (#10660) @michelengelen -- [charts] Allows to connect nulls (#10803) @alexfauquette -- [charts] Fix axis highlight in dark mode (#10820) @LukasTy - -### Docs - -- [docs] Add a data grid recipe for autosizing columns after fetching row-data (#10822) @michelengelen -- [docs] Add a data grid recipe showing how to remove cell outline on `focus` (#10843) @michelengelen -- [docs] Add demo about how to use charts margin (#10886) @alexfauquette -- [docs] Improve custom field input demos readability (#10559) @LukasTy - -### Core - -- [core] Generate `slot` API descriptions based on `slots` or `components` (#10879) @LukasTy - -## 6.17.0 - -_Oct 27, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 The Tree View package is now officially stable! - -![tree-view-example](https://github.com/mui/mui-x/assets/550141/77d1fe66-d912-49ba-b38f-b853fb90446a) - -- ✨ Improve the handling of non-numeric values by Data Grid aggregation -- 🚀 Support lines with different domains on the line charts -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.17.0` - -- [DataGrid] Allow custom debounce time for row positions calculation (#10708) @cherniavskii -- [DataGrid] Persist stable row index for focused row (#10674) @cherniavskii - -#### `@mui/x-data-grid-pro@6.17.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.17.0`, plus: - -- [DataGridPro] Fix `undefined` values passed to `valueFormatter` for tree leaf nodes (#10748) @cherniavskii - -#### `@mui/x-data-grid-premium@6.17.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.17.0`, plus: - -- [DataGridPremium] Fix `avg` aggregation to ignore non-numeric values (#10787) @cherniavskii -- [DataGridPremium] Fix `size` aggregation to ignore `undefined` values (#10745) @cherniavskii -- [DataGridPremium] Fix `sum` aggregation to ignore non-numeric values (#10730) @cherniavskii -- [DataGridPremium] Fix cell selection throwing index error on second page and beyond (#10784) @MBilalShafi - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.17.0` - -- [fields] POC: Use `contentEditable` on `FakeTextField` (#10779) @flaviendelangle -- [pickers] Fix weekday label localization (#10809) @LukasTy - -#### `@mui/x-date-pickers-pro@6.17.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.17.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.17` - -- [charts] Fix text position in Safari (#10815) @lhilgert9 -- [charts] Support lines with different domains (#10801) @alexfauquette - -### Tree View / `@mui/x-tree-view@6.17.0` - -No change - -### Docs - -- [docs] Correct editing related props' description (#10798) @MBilalShafi -- [docs] Fix RTL data grid demo (#10728) @oliviertassinari -- [docs] Fix unclosed warning (#10796) @flaviendelangle -- [docs] Improve performance of `Save and restore the state from external storage` recipe (#10811) @michelengelen - -- [test] Add missing type on `cleanText` utility function (#10780) @flaviendelangle - -## 6.16.3 - -_Oct 20, 2023_ - -We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Add a Data Grid recipe for saving & restoring state -- 💫 Support animations on the bar chart -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.16.3` - -- [DataGrid] Allow passing readonly arrays to `columns` and `sortingOrder` props (#10686) @pcorpet - -#### `@mui/x-data-grid-pro@6.16.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.16.3`. - -#### `@mui/x-data-grid-premium@6.16.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.16.3`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.16.3` - -- [fields] Correctly respect leading zeroes on seconds section (#10713) @flaviendelangle -- [fields] Use `onChange` instead of `onKeyPress` for Backspace editing (#10494) @flaviendelangle -- [pickers] Add reference links to DatePicker components (#10626) @michelengelen -- [pickers] Add reference links to clock components (#10645) @michelengelen -- [pickers] Add reference links to misc picker components (#10647) @michelengelen -- [pickers] Add reference links to toolbar components (#10646) @michelengelen -- [pickers] POC: Change the props received by the `FakeTextField` component (#10687) @flaviendelangle - -#### `@mui/x-date-pickers-pro@6.16.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.16.3`, plus: - -- [DateRangePicker] Fix touch based range dragging (#10664) @michelengelen - -### Charts / `@mui/x-charts@6.0.0-alpha.16` - -- [charts] Add reference links to area + bar chart components (#10652) @michelengelen -- [charts] Add reference links to line chart + sparkline components (#10650) @michelengelen -- [charts] Add reference links to pie + scatter chart components (#10653) @michelengelen -- [charts] Render only when `width` and `height` are resolved (#10714) @alexfauquette -- [charts] Support animation on `BarChart` (#9926) @alexfauquette -- [charts] Use new text component to avoid tick label overflow on x-axis (#10648) @alexfauquette - -### Docs - -- [docs] Add a recipe for saving and restoring `state` externally (#10722) @michelengelen -- [docs] Add example about how to add an axis (#10709) @alexfauquette -- [docs] Customization Playground - fix DesktopDatePicker sx props and styled examples (#10665) @noraleonte -- [docs] Improve meta description @oliviertassinari -- [docs] Make overview demo work in codesandbox (#10661) @alexfauquette - -### Core - -- [core] Update React renovate group with `@types` (#10723) @LukasTy -- [core] Update `styled-components` (#10733) @LukasTy - -## 6.16.2 - -_Oct 12, 2023_ - -We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: - -- 📊 Chart's legend text management has been reworked and contains breaking changes (#10138) @alexfauquette -- 📝 Add [Bulk editing](https://mui.com/x/react-data-grid/recipes-editing/#bulk-editing) demo (#10333) @cherniavskii -- 🚀 Column grouping now works smoothly with column pinning (#10518) @MBilalShafi -- 🌍 Improve Arabic (ar-SD) and Spanish (es-ES) locales -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.16.2` - -- [DataGrid] Fix `LazyLoading` demo crash (#10621) @MBilalShafi -- [DataGrid] Fix cells overlapping the scrollbar in iOS Safari (#10633) @cherniavskii -- [DataGrid] Fix `getRowId is not defined` error (#10613) @romgrk -- [DataGrid] Get quick filter to work OOTB with `date` and `dateTime` fields (#10636) @MBilalShafi -- [DataGrid] Make cursor for selectable cells to be `default` unless editable (#9997) @gitstart -- [DataGrid] Remove unnecessary syntax in JSDoc (#10567) @Lev-Shapiro -- [DataGrid] Update row hover behavior to match native hover (#10623) @cherniavskii -- [l10n] Improve Arabic (ar-SD) locale (#10625) @alabenyahia - -#### `@mui/x-data-grid-pro@6.16.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.16.2`, plus: - -- [DataGridPro] Improve column grouping and column pinning friendship (#10518) @MBilalShafi - -#### `@mui/x-data-grid-premium@6.16.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.16.2`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.16.2` - -- [DateTimePicker] Add support for `DigitalClock` view renderer (#10624) @LukasTy -- [fields] Bootstrap the multi-HTML input component (#10638) @flaviendelangle -- [pickers] Fix timezone `UTC` false positive (#10586) @alexfauquette -- [l10n] Improve Spanish (es-ES) locale (#10588) @eduardodallmann - -#### `@mui/x-date-pickers-pro@6.16.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.16.2`. - -### Charts / `@mui/x-charts@6.0.0-alpha.15` - -#### Breaking changes - -The charts have a new text display mechanism. -It adds line break support and avoids overlapping text in the legend. -This comes with some breaking changes. - -- The DOM structure is modified. An intermediary `<tspan />` element has been added. This can impact how your style is applied. - - ```diff - - <text>The label</text> - + <text><tspan>The label</tspan></text> - ``` - -- The top margin has been reduced from 100 to 50 to benefit from the denser legend. - -- To accurately compute the text size and then place it, styling should be provided as a JS object. For example, to set the legend font size, you should do: - ```jsx - <PieChart - {/** ... */} - slotProps={{ - legend: { - labelStyle: { - fontSize: 16, - }, - }, - }} - /> - ``` - Support for other text elements (axis labels and tick labels) will be implemented in follow-up PR. - -#### Changes - -- [charts] Fix typo between internal/external variable (#10640) @alexfauquette -- [charts] Improve the management of the text (#10138) @alexfauquette - -### Docs - -- [docs] Add bulk editing demo (#10333) @cherniavskii -- [docs] Add reference links to DateRangePicker components (#10629) @michelengelen -- [docs] Add reference links to DateTimePicker components (#10628) @michelengelen -- [docs] Add reference links to picker field components (#10631) @michelengelen -- [docs] Added reference links to TimePicker components (#10627) @michelengelen -- [docs] Avoid Pickers playground error due to empty views (#10654) @LukasTy -- [docs] Fix DataGrid[Pro/Premium] reference links (#10620) @michelengelen - -### Core - -- [core] Bump monorepo (#10619) @alexfauquette -- [core] Update `no-response` workflow (#10491) @MBilalShafi -- [core] Update the issue templates to reflect the new support workflow (#10651) @MBilalShafi -- [test] Fix `testEval` not invoking test assertions (#10587) @cherniavskii -- [test] Fix dev mode warning (#10610) @oliviertassinari -- [test] Set UUID chance seed in visual tests (#10609) @oliviertassinari - -## 6.16.1 - -_Oct 6, 2023_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 🥧 Support interaction with pie chart -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.16.1` - -- [DataGrid] Add a new demo with sparklines (#9228) @flaviendelangle -- [DataGrid] Fix autosize missing a few pixels (#10471) @romgrk -- [DataGrid] Make `disableColumnSelector` demo idempotent (#10548) @MBilalShafi - -#### `@mui/x-data-grid-pro@6.16.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.16.1`. - -#### `@mui/x-data-grid-premium@6.16.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.16.1`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.16.1` - -- [pickers] Avoid calendar layout shifting when changing views (#10541) @LukasTy -- [pickers] Fix clearable behavior when disabled (#10542) @noraleonte -- [pickers] Improve customization playground examples (#10544) @noraleonte - -#### `@mui/x-date-pickers-pro@6.16.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.16.1`, plus: - -- [DateRangePicker] Fix `InputProps` propagation in multi input (#10564) @alexfauquette - -### Charts / `@mui/x-charts@6.0.0-alpha.14` - -- [charts] Display cursor pointer for pie chart only if `onClick` is provided (#10551) @giladappsforce -- [charts] Add `onClick` prop to PieChart (#10506) @giladappsforce -- [charts] Support `slots`/`slotProps` for the tooltip (#10515) @alexfauquette - -### Docs - -- [docs] Add `DateRangePicker` example with a `Button` trigger (#10485) @LukasTy -- [docs] Add section about disabling columns panel (#10328) @MBilalShafi -- [docs] Add section about overriding slots to base concepts (#10421) @noraleonte -- [docs] Add "What's new" page listing all release announcements (#9727) @joserodolfofreitas -- [docs] Update RTL Support section of the grid localization docs (#10561) @MBilalShafi - -### Core - -- [core] Fix casing consistency with legal and marketing content @oliviertassinari -- [core] Revert the link in the priority support ticket description (#10517) @michelengelen -- [changelog] Polish image @oliviertassinari - -## 6.16.0 - -_Sep 29, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Add a clearable behavior to all the single input pickers and fields (#9095) @noraleonte - - The pickers and fields now have an out-of-the box implementation for clearing the field value. You can see the documentation for this behavior on the [Date Picker documentation](https://mui.com/x/react-date-pickers/date-picker/#clearing-the-value). - - <img width="337" height="139" alt="Clearable behavior" src="https://github.com/mui/mui-x/assets/3165635/a5407cb6-0b8a-443c-b4b9-1f81ceb4d087"> - -- 💫 Add Date Picker customization playground (#9581) @noraleonte - - You can play around with style customization options on the [Date Picker documentation](https://mui.com/x/react-date-pickers/date-picker/#customization). - - We are thrilled to hear your feedback about this functionality! - -- 🚀 Fix header filters menu auto closing on render (#10483) @MBilalShafi -- 🎯 Fix column headers scroll when theme scoping is used (#10437) @cherniavskii -- 🌍 Improve Russian (ru-RU) locale on the data grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.16.0` - -- [DataGrid] Fix column headers scroll when theme scoping is used (#10437) @cherniavskii -- [DataGrid] Rename `global` to `globalScope` due to Jest issue (#10470) @romgrk -- [l10n] Improve Russian (ru-RU) locale (#10464 and #10407) @NKodos - -#### `@mui/x-data-grid-pro@6.16.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.16.0`, plus: - -- [DataGridPro] Fix header filters menu auto closing on render (#10483) @MBilalShafi - -#### `@mui/x-data-grid-premium@6.16.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.16.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.16.0` - -- [pickers] Add warning to `shouldDisableDate` validation (#10502) @michelengelen -- [pickers] Implement `clearable` field behavior (#9095) @noraleonte -- [pickers] Refactor `dayOfWeekFormatter` (#10345) @michelengelen - -#### `@mui/x-date-pickers-pro@6.16.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.16.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.13` - -- [charts] Share upfront future Pro features (#10465) @oliviertassinari - -### Tree View / `@mui/x-tree-view@6.0.0-beta.0` - -- [TreeView] Do not try to focus a collapsed node when re-focusing the TreeView (#10422) @flaviendelangle -- [TreeView] Fix the typing of the `Multiple` generic (#10478) @flaviendelangle - -### Docs - -- [docs] Correct the typo in data grid api docs (#10477) @MBilalShafi -- [docs] Add customization playground (#9581) @noraleonte -- [docs] Fix Tree View product ID (#10428) @oliviertassinari -- [docs] Fix demo crashing when all rows are deleted (#10438) @cherniavskii -- [docs] Fix mobile scrollbar column resize (#10455) @oliviertassinari -- [docs] Fix usage of `GridRenderCellParams` interface (#10435) @cherniavskii - -### Core - -- [core] Fix typo in header data grid quick filter @oliviertassinari -- [core] Group D3 renovate PRs (#10480) @flaviendelangle -- [core] Link the priority support page (#10495) @michelengelen -- [core] Move the pickers describes to the test utils folder (#10490) @flaviendelangle -- [core] Priority Support casing normalization @oliviertassinari -- [core] Remove automated DataGrid performance tests (#10414) @romgrk -- [core] Sync `prism-okaidia.css` with docs-infra @oliviertassinari -- [core] Update issue actions & templates (#10375) @romgrk -- [core] Update release guide (#10468) @DanailH - -## 6.15.0 - -_Sep 22, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Implement columns auto-sizing (#10180) @romgrk -- 🎁 Add support for `getRowsToExport` option to print export on the data grid (#10084) @zreecespieces -- 🌍 Improve Finnish (fi-FI) locale -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.15.0` - -- [DataGrid] Add support for `getRowsToExport` option to print export (#10084) @zreecespieces -- [DataGrid] Fix dev warning about `InputLabelProps` (#10413) @romgrk -- [DataGrid] Refactor `GridMenu` prop `onClickAway` to `onClose` (#10411) @romgrk -- [DataGrid] Restore focus after `GridMenu` closes (#10412) @romgrk -- [DataGrid] Fix typing of `GridActionsCellItem` (#10344) @romgrk -- [DataGrid] Hide `eval` from bundlers (#10329) @romgrk -- [DataGrid] Add `border: 0` to unmounted focused cell to avoid layout shifts in that row (#10318) @lauri865 - -#### `@mui/x-data-grid-pro@6.15.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.15.0`, plus: - -- [DataGridPro] Implement columns auto-sizing (#10180) @romgrk -- [DataGridPro] Fix keyboard navigation issue in header filters (#10358) @MBilalShafi -- [DataGridPro] Add missing row hover styles (#10252) @cherniavskii -- [DataGridPro] Make default filter items have stable references in header filters (#10338) @MBilalShafi - -#### `@mui/x-data-grid-premium@6.15.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.15.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.15.0` - -- [pickers] Support tokens without spaces (#10185) @alexfauquette -- [l10n] Improve Finnish (fi-FI) locale (#10346) @samijouppila - -#### `@mui/x-date-pickers-pro@6.15.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.15.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.12` - -- [charts] Fix sparkline scale and rendering (#10402) @alexfauquette -- [charts] Remove components from `@mui/material` (#10115) @alexfauquette - -### Tree View / `@mui/x-tree-view@6.0.0-alpha.4` - -- [TreeView] Split features into plugins to prepare for Pro version (#10123) @flaviendelangle - -### Docs - -- [docs] Add charts documentation pages to complete pricing table (#10394) @alexfauquette -- [docs] Add missing MIT packages on the Licensing page (#10348) @flaviendelangle -- [docs] Clearer component pattern @oliviertassinari -- [docs] Easier to understand demo (#10370) @oliviertassinari -- [docs] Fix `301` to Material UI @oliviertassinari -- [docs] Improve the column visibility section (#10327) @MBilalShafi -- [docs] Improve the documentation section `rowIdentifier` (#10326) @MBilalShafi -- [docs] Improve pickers localization documentation (#10202) @flaviendelangle -- [docs] Polish typescript ref usage (#10359) @oliviertassinari -- [docs] Improve charts tooltip wording (#10406) @alexfauquette - -### Core - -- [core] Cleanup GitHub issues template (#10372) @romgrk -- [core] Fix Circle CI OOM (#10385) @romgrk -- [core] Improve sleep test helper @oliviertassinari -- [core] Remove unwanted prefixes @oliviertassinari -- [core] Remove duplicate label @oliviertassinari -- [core] Simplify source @oliviertassinari -- [core] Upgrade monorepo (#10425) @cherniavskii -- [core] Upgrade monorepo to have the new typescript-to-proptype (#10224) @flaviendelangle -- [test] Do not use deprecated adapter methods (#10416) @flaviendelangle -- [test] Name test suites according to sentence case (#10429) @alexfauquette - -## 6.14.0 - -_Sep 14, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Fix `YearCalendar` and `MonthCalendar` accessibility (#10312) @LukasTy - - The `YearCalendar` and `MonthCalendar` items role has been changed from `button` to `radio` in order to improve the component's a11y support. - If you were relying on the mentioned components having a `button` role for items, you will need to update your usage to expect a `radio` role instead. - -- 🌍 Improve Japanese (ja-JP), Persian (fa-IR), and Vietnamese (vi-VN) locales on the data grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.14.0` - -- [l10n] Improve Japanese (ja-JP) locale (#10299) @makoto14 -- [l10n] Improve Persian (fa-IR) locale (#10277) @aminsaedi -- [l10n] Improve Vietnamese (vi-VN) locale (#10280) @khangnguyen2100 - -#### `@mui/x-data-grid-pro@6.14.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.14.0`. - -#### `@mui/x-data-grid-premium@6.14.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.14.0`, plus: - -- [DataGridPremium] Fix clipboard import cutting off at 100 rows (#9930) @gitstart - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.14.0` - -- [pickers] Fix `YearCalendar` and `MonthCalendar` a11y (#10312) @LukasTy -- [pickers] Localize `TimeClock` meridiem text (#10324) @LukasTy - -#### `@mui/x-date-pickers-pro@6.14.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.14.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.11` - -- [charts] Add default `barGapRatio` and increase `categoryGapRatio` (#10317) @LukasTy -- [charts] Enable `eslint` on the package (#10330) @LukasTy - -### Tree View / `@mui/x-tree-view@6.0.0-alpha.3` - -- [TreeView] Fix box-sizing dependency (#10255) @oliviertassinari - -### Docs - -- [docs] Add conditional range picker props example (#10227) @LukasTy -- [docs] Add toolbar to the multi-filters demo (#10223) @MBilalShafi -- [docs] Avoid the use of "We" @oliviertassinari -- [docs] Clarify MUI vs. MUI Core difference @oliviertassinari -- [docs] Enable `ariaV7` flag for demos using `useDemoData` hook (#10204) @cherniavskii -- [docs] Fix Tree View link to API references (#10282) @oliviertassinari -- [docs] Fix image layout shift (#10313) @oliviertassinari -- [docs] Fix link to MUI X from readme logo @oliviertassinari -- [docs] Fix redirection to Base UI URLs @oliviertassinari -- [docs] Improve Tree View demos (#10268) @oliviertassinari -- [docs] Improve docs for ref type props (#10273) @michelengelen -- [docs] Improve npm package README (#10269) @oliviertassinari -- [docs] Improve the clarity of the npm links @oliviertassinari -- [docs] Keep installation readme simple @oliviertassinari -- [docs] Make each component feel more standalone @oliviertassinari - -### Core - -- [core] Add types extension for clarity @oliviertassinari -- [core] Set logo height to fix layout shift in GitHub @oliviertassinari -- [core] TrapFocus was renamed to FocusTrap @oliviertassinari - -## 6.13.0 - -_Sep 8, 2023_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Fix `anchorRef` behavior on range pickers (#10077) @LukasTy - - The range picker popup will now be anchored to the first input element and left aligned like other pickers. - -- 🌍 Improve Slovak (sk-SK) locale on the data grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.13.0` - -- [DataGrid] Allow to override the default overlay height in `autoHeight` mode (#10203) @cherniavskii -- [DataGrid] Allow to override the default row count component in footer (#10063) @hungmanhle -- [DataGrid] Fix an error when hovering on a row, the background changed to white (#10214) @chucamphong -- [DataGrid] Fix custom column docs, remove legacy `extendType` (#10175) @oliviertassinari -- [DataGrid] Make the pinned rows be on top of the no rows overlay (#9986) @DanailH -- [l10n] Improve Slovak (sk-SK) locale (#10182) @msidlo - -#### `@mui/x-data-grid-pro@6.13.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.13.0`, plus: - -- [DataGridPro] Fix column resize with pinned rows (#10229) @cherniavskii - -#### `@mui/x-data-grid-premium@6.13.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.13.0`, plus: - -- [DataGridPremium] Fix aggregated column resizing (#10079) @cherniavskii - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.13.0` - -- [pickers] Respect the adapter locale in `AdapterMoment.getWeekdays` (#10221) @flaviendelangle - -#### `@mui/x-date-pickers-pro@6.13.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.13.0`, plus: - -- [DateRangePicker] Fix `anchorRef` behavior (#10077) @LukasTy - -### Charts / `@mui/x-charts@6.0.0-alpha.10` - -- [charts] Remove require condition from package.json exports (#10272) @Janpot - -### Tree View / `@mui/x-tree-view@6.0.0-alpha.2` - -- [TreeView] Add missing export (#10245) @flaviendelangle - -### Docs - -- [docs] Add a `Getting Started` page for the Tree View (#10218) @flaviendelangle -- [docs] Add pickers `Custom opening button` page (#10200) @flaviendelangle -- [docs] Add pie chart demo with a center label (#10220) @giladappsforce -- [docs] Do not document ignored components (#10258) @flaviendelangle -- [docs] Fix charts demo using too deep import (#10263) @LukasTy -- [docs] Fix `e.g.` typo @oliviertassinari -- [docs] Fix npm package indentation @oliviertassinari -- [docs] Fix typo in tree view docs @oliviertassinari -- [docs] Improve the week picker example (#8257) @flaviendelangle -- [docs] Include code links in the data grid demo (#10219) @cherniavskii -- [docs] Polish page for SEO (#10216) @oliviertassinari -- [docs] Use `Base UI` `Portal` for the quick filter recipe (#10188) @DanailH - -### Core - -- [core] Finish migration to GA4 @oliviertassinari -- [core] Fix yarn docs:create-playground script @oliviertassinari -- [core] Move @mui/base from peer dependency to dependency (#10215) @oliviertassinari -- [core] Prevent `e.g.` typo (#10193) @oliviertassinari -- [core] Remove unused `babel-plugin-tester` package (#10243) @LukasTy - -## 6.12.1 - -_Aug 31, 2023_ - -We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: - -- 🏎️ Perf improvement for line charts -- 🎁 Add `referenceDate` prop on pickers (#9991) @flaviendelangle - Find out more about this feature in the [documentation section](https://mui.com/x/react-date-pickers/base-concepts/#reference-date-when-no-value-is-defined). -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.12.1` - -- [DataGrid] Add a recipe showing how to render components outside of the grid (#10121) @DanailH -- [DataGrid] Fix `valueFormatter` being persisted on column type change (#10041) @cherniavskii -- [DataGrid] Fix error when keyboard navigating an empty grid (#10081) @romgrk -- [DataGrid] Replace timeout with `useTimeout` (#10179) @romgrk - -#### `@mui/x-data-grid-pro@6.12.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.12.1`. - -#### `@mui/x-data-grid-premium@6.12.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.12.1`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.12.1` - -- [pickers] Add `referenceDate` on picker components (and `DateRangeCalendar`) (#9991) @flaviendelangle - -#### `@mui/x-date-pickers-pro@6.12.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.12.1`. - -### Charts / `@mui/x-charts@6.0.0-alpha.9` - -- [charts] Move the line item highligh into a dedicated component (#10117) @alexfauquette - -### Docs - -- [docs] Add `DemoContainer` and `DemoItem` JSDoc (#10186) @LukasTy -- [docs] Add link to `custom layout` page (#10184) @LukasTy -- [docs] Add tree view nav item (#10181) @LukasTy -- [docs] Fix wrong chart tooltip reference (#10169) @oliviertassinari -- [docs] Improve chart SEO (#10170) @oliviertassinari -- [docs] Precise expired license key condition (#10165) @oliviertassinari -- [docs] Reorganize the page menu (#10139) @alexfauquette - -### Core - -- [core] Update babel configs (#9713) @romgrk -- [test] Disable false positive e2e test on webkit (#10187) @LukasTy - -## 6.12.0 - -_Aug 25, 2023_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 📊 Support horizontal bar chart -- 💫 Improved animations on Android devices -- 🌍 Improve Ukrainian (uk-UA) locale on the data grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.12.0` - -- [DataGrid] Allow print export for more than 100 rows (#10045) @MBilalShafi -- [l10n] Improve Ukrainian (uk-UA) locale (#10076) @mkundos - -#### `@mui/x-data-grid-pro@6.12.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.12.0`. - -#### `@mui/x-data-grid-premium@6.12.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.12.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.12.0` - -- [fields] Do not clamp day of month (#9973) @flaviendelangle -- [pickers] Fix `ownerState` on `desktopPaper` slot props (#10103) @LukasTy -- [pickers] Fix to `transform-origin` when popper opens to `top` (#10069) @LukasTy -- [pickers] Fix `YearCalendar` scrolling (#10135) @LukasTy -- [pickers] Improve the typing of the adapter `dateWithTimezone` method (#10029) @flaviendelangle -- [pickers] Make `openPickerButton` toggle picker (#10109) @noraleonte -- [pickers] Update `reduceAnimations` default rule (#9864) @LukasTy - -#### `@mui/x-date-pickers-pro@6.12.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.12.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.8` - -- [charts] Fix import issue (#10111) @alexfauquette -- [charts] Fix `slotProps` propagation (#10105) @alexfauquette -- [charts] Support horizontal bar chart (#9992) @alexfauquette - -### Docs - -- [docs] Address charts docs feedback (#10119) @alexfauquette -- [docs] Capitalization convention pickers @oliviertassinari -- [docs] Fix a11y issue on plan links (#10026) @oliviertassinari -- [docs] Fix some charts horizontal overflow on mobile devices (#10082) @cupok -- [docs] Fix typo in quick filter @oliviertassinari -- [docs] Fix typo in the timezone page (#10073) @flaviendelangle - -### Core - -- [core] Bump monorepo (#10129) @LukasTy -- [core] Document a bit `useLazyRef` @oliviertassinari -- [core] Enable strict type checking options in the top-level tsconfig (#9925) @cherniavskii -- [core] Increase global e2e timeout (#10134) @LukasTy -- [core] Remove outdated link (#10125) @oliviertassinari -- [core] Update `no-response` workflow (#10102) @DanailH - -## 6.11.2 - -_Aug 17, 2023_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- 🏎️ Lower the filtering delay in the grid -- 🌍 Improve Spanish (es-ES) locale on the data grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.11.2` - -- [DataGrid] Fix `eval` blocked by CSP (#9863) @romgrk -- [DataGrid] Fix row id bug (#10051) @romgrk -- [DataGrid] Honor `disableExport` flag in Print Export (#10044) @MBilalShafi -- [DataGrid] Lower filter debounce delay (#9712) @romgrk -- [DataGrid] Unhide potential ref binding issue (#9965) @oliviertassinari -- [l10n] Improve Chinese (zh-CN) and Chinese(traditional) (zh-TW) locales (#9999) @MyNameIsTakenOMG -- [l10n] Improve Spanish (es-ES) locale (#10037) @Macampu420 - -#### `@mui/x-data-grid-pro@6.11.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.11.2`. - -#### `@mui/x-data-grid-premium@6.11.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.11.2`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.11.2` - -- [pickers] Fix month switcher RTL (#10003) @alexfauquette -- [pickers] Follow-up on using device motion reduction preference (#9858) @LukasTy -- [pickers] Pass the shortcut information in the `onChange` context (#9985) @flaviendelangle -- [pickers] Replace `Grid` toolbar component with a styled `div` (#10052) @LukasTy - -#### `@mui/x-date-pickers-pro@6.11.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.11.2`. - -### Docs - -- [docs] Add migration guide for the Tree View (#9987) @flaviendelangle -- [docs] Fix en-US changelog @oliviertassinari -- [docs] Update column types (#10040) @romgrk - -### Core - -- [core] Remove unnecessary Box (#9831) @oliviertassinari -- [core] Set GitHub Action top level permission @oliviertassinari -- [core] Split the pickers test utils (#9976) @flaviendelangle - -## 6.11.1 - -_Aug 11, 2023_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- 💫 Add theme augmentation to `@mui/x-tree-view` -- 📈 Enable charts customization using `slot` and `slotProps` props -- 🌍 Improve Finnish (fi-FI) and Icelandic (is-IS) locales on the pickers -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.11.1` - -- [DataGrid] `getCellAggregationResult`: Handle `null` `rowNode` case (#9915) @romgrk - -#### `@mui/x-data-grid-pro@6.11.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.11.1`. - -#### `@mui/x-data-grid-premium@6.11.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.11.1`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.11.1` - -- [fields] Use `numeric` `inputmode` instead of `tel` (#9918) @LukasTy -- [pickers] Always respect locale when formatting meridiem (#9979) @flaviendelangle -- [pickers] Call `onChange` when selecting a shortcut with `changeImportance="set"` (#9974) @flaviendelangle -- [pickers] Refactor `themeAugmentation` `styleOverrides` (#9978) @LukasTy -- [l10n] Improve Finnish (fi-FI) locale (#9795) @kurkle -- [l10n] Improve Icelandic (is-IS) locale (#9639) @magnimarels - -#### `@mui/x-date-pickers-pro@6.11.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.11.1`. - -### Charts / `@mui/x-charts@6.0.0-alpha.7` - -- [charts] Fix label and tick alignment (#9952) @LukasTy -- [charts] Remove not functional component `styleOverrides` (#9996) @LukasTy -- [charts] Set custom ticks number (#9922) @alexfauquette -- [charts] Use `slot`/`slotProps` for customization (#9744) @alexfauquette -- [charts] Extend cheerful fiesta palette (#9980) @noraleonte - -### Tree View / `@mui/x-tree-view@6.0.0-alpha.1` - -- [TreeView] Add theme augmentation (#9967) @flaviendelangle - -### Docs - -- [docs] Clarify the `shouldDisableClock` migration code options (#9920) @LukasTy - -### Core - -- [core] Port GitHub workflow for ensuring triage label is present (#9924) @DanailH -- [docs-infra] Fix the import samples in Api pages (#9898) @alexfauquette - -## 6.11.0 - -_Aug 4, 2023_ - -We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: - -- ⌚️ Move the tree view component from `@mui/lab` package - - The `<TreeView />` component has been moved to the MUI X repository. - It is now accessible from its own package: `@mui/x-tree-view`. - -- 🌍 Improve Hebrew (he-IL), Finnish (fi-FI), and Italian (it-IT) locales on the data grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.11.0` - -- [DataGrid] Add `ariaV7` experimental flag (#9496) @cherniavskii -- [DataGrid] Fix cell size when column width is set to `undefined` (#9871) @gitstart -- [l10n] Improve Hebrew (he-IL) locale (#9820) @itayG98 -- [l10n] Improve Finnish (fi-FI) locale (#9848) @sambbaahh -- [l10n] Improve Italian (it-IT) locale (#9627) @fabio-rizzello-omnia - -#### `@mui/x-data-grid-pro@6.11.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.11.0`. - -#### `@mui/x-data-grid-premium@6.11.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.11.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.11.0` - -- [fields] Correctly handle events with a complete value insertion (#9896) @LukasTy -- [fields] Fix hours editing on dayjs with timezone and DST (#9901) @flaviendelangle -- [fields] Fix section clearing with timezone (#9819) @flaviendelangle -- [pickers] Add `CalendarHeader` slot (#7784) @flaviendelangle -- [pickers] Allow to override the `InputProps` of the `TextField` using the `slotProps` (#9849) @flaviendelangle -- [pickers] Allow to override the opening aria text using the `localeText` prop on the pickers (#9870) @flaviendelangle -- [pickers] Fix `sx` and `className` props on `MobileDateRangePicker` (#9853) @flaviendelangle -- [pickers] Fix default descriptions (#9887) @LukasTy -- [pickers] Fix offset management on dayjs adapter (#9884) @flaviendelangle -- [pickers] Use device motion reduction preference (#9823) @LukasTy - -#### `@mui/x-date-pickers-pro@6.11.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.11.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.6` - -- [charts] Add TS definition to the exported elements (#9885) @alexfauquette -- [charts] Add sparkline (#9662) @alexfauquette -- [charts] Fix missing configuration types (#9886) @alexfauquette -- [charts] Introduce dataset to simplify plot of data from API (#9774) @alexfauquette - -### Tree View / `@mui/x-tree-view@6.0.0-alpha.0` - -- [TreeView] Add missing exported types (#9862) @flaviendelangle -- [TreeView] Add tree view to changelog generator script (#9903) @MBilalShafi -- [TreeView] Create the package on the X repository (#9798) @flaviendelangle -- [TreeView] Improve props typing (#9855) @flaviendelangle - -### Docs - -- [docs] Add Tree View doc (#9825) @flaviendelangle -- [docs] Add charts nav item (#9821) @LukasTy -- [docs] Add charts to MUI X introduction pages (#9704) @joserodolfofreitas -- [docs] Add example for avoiding picker views layout shift (#9781) @noraleonte -- [docs] Consistency of Next.js App Router @oliviertassinari -- [docs] Fix API page regression: bring back slots section (#9866) @alexfauquette -- [docs] Fix demo using Pro while it's MIT (#9842) @oliviertassinari -- [docs] Get ready for next docs-infra change @oliviertassinari -- [docs] Improve the slots documentation `Recommended usage` section (#9892) @flaviendelangle - -### Core - -- [core] Fix font loading issue dev-mode (#9843) @oliviertassinari -- [core] Fix pipeline (#9894) @LukasTy -- [core] Fix the link-check script on Windows (#9888) @alexfauquette -- [core] Fix v7 capitalization (#9878) @oliviertassinari -- [core] Regen doc (#9902) @flaviendelangle -- [core] Remove benchmark package (#9413) @LukasTy -- [core] Stop using the deprecated `JSX` global namespace (#9854) @flaviendelangle -- [core] Update monorepo (#9846) @flaviendelangle -- [core] Update tree data API docs (#9827) @cherniavskii -- [test] Add pickers e2e tests (#9747) @LukasTy -- [test] Data grid e2e tests follow-up (#9822) @cherniavskii - -## 6.10.2 - -_Jul 27, 2023_ - -We'd like to offer a big thanks to the 13 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Improve scatter charts performance -- 📚 Redesigned component API documentation and side navigation -- 🐞 Bugfixes - -### Data Grid - -#### `@mui/x-data-grid@6.10.2` - -- [DataGrid] Fix quick filter & aggregation error (#9729) @romgrk -- [DataGrid] Fix row click propagation causing error in nested grid (#9741) @cherniavskii -- [DataGrid] Keep focused cell in the DOM (#7357) @yaredtsy -- [l10n] Improve Finnish (fi-FI) locale (#9746) @sambbaahh - -#### `@mui/x-data-grid-pro@6.10.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.10.2`. - -#### `@mui/x-data-grid-premium@6.10.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.10.2`, plus: - -- [DataGridPremium] Allow to customize grouping cell offset (#9417) @cherniavskii - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.10.2` - -- [pickers] Remove the `endOfDate` from `DigitalClock` timeOptions (#9800) @noraleonte - -#### `@mui/x-date-pickers-pro@6.10.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.10.2`. - -### Charts / `@mui/x-charts@6.0.0-alpha.5` - -- [charts] Improve JSDoc for axis-related props (#9779) @flaviendelangle -- [charts] Improve performances of Scatter component (#9527) @flaviendelangle - -### Docs - -- [docs] Add `pnpm` in more places @oliviertassinari -- [docs] Add `pnpm` installation instructions for MUI X (#9707) @richbustos -- [docs] Align pickers "uncontrolled vs controlled" sections (#9772) @LukasTy -- [docs] Apply style guide to the data grid Layout page (#9673) @richbustos -- [docs] Differentiate between packages in `slotProps` docs (#9668) @cherniavskii -- [docs] Fix charts width in axis pages (#9801) @alexfauquette -- [docs] Fix wrong prop name in the Editing page (#9753) @m4theushw -- [docs] New component API page and side nav design (#9187) @alexfauquette -- [docs] Update overview page with up to date information about the plans (#9512) @joserodolfofreitas - -### Core - -- [core] Use PR charts version in preview (#9787) @alexfauquette -- [license] Allow overriding the license on specific parts of the page (#9717) @Janpot -- [license] Throw in dev mode after 30 days (#9701) @oliviertassinari -- [license] Only throw in dev mode (#9803) @oliviertassinari -- [test] Fail the CI when new unexpected files are created (#9728) @oliviertassinari - -## 6.10.1 - -_Jul 20, 2023_ - -We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Fix CSV export for values containing double quotes -- 🚀 Improve tree data performance -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.10.1` - -- [DataGrid] Filtering performance: compile filter applier with `eval` (#9635) @romgrk -- [DataGrid] Fix CSV export for values containing double quotes (#9667) @cherniavskii -- [DataGrid] Fix column type change not working correctly (#9594) @cherniavskii -- [DataGrid] Fix quick filter `undefined` row error (#9708) @romgrk -- [DataGrid] Prevent `viewportOuterSize.height` going negative (#9664) @gitstart -- [DataGrid] Update focused cell on page change via keyboard (#9203) @m4theushw -- [DataGrid] Wait for remote stylesheets to load before print (#9665) @cherniavskii - -#### `@mui/x-data-grid-pro@6.10.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.10.1`, plus: - -- [DataGridPro] Improve tree data performance (#9682) @cherniavskii -- [DataGridPro] Prevent affecting cells from child DataGrid when resizing a column (#9670) @m4theushw - -#### `@mui/x-data-grid-premium@6.10.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.10.1`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.10.1` - -- [fields] Fix `format` and `value` update order (#9715) @LukasTy -- [pickers] Remove `require` usage in comment (#9675) @LukasTy - -#### `@mui/x-date-pickers-pro@6.10.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.10.1`. - -### Charts / `@mui/x-charts@6.0.0-alpha.4` - -- [charts] Fix blinking in responsive charts and extremums computation for line charts (#9734) @alexfauquette -- [charts] Use ESM with imports (#9645) @alexfauquette - -### Docs - -- [docs] Add additional note for license key installation on Next.js (#9575) @joserodolfofreitas -- [docs] Add paragraph about managing focus of custom edit components (#9658) @m4theushw -- [docs] Add unsorted icon slot to the custom sort icons demo (#9169) @d4rekanguok -- [docs] Disable ad for onboarding pages (#9700) @oliviertassinari -- [docs] Disabling ads without toolbar has no effect @oliviertassinari -- [docs] Fix Date Pickers usage to Title Case (#9680) @richbustos -- [docs] Fix sorting in `CustomSortIcons` demo (#9656) @MBilalShafi -- [docs] Improve the UI for pickers introduction (#9644) @alexfauquette -- [docs] Improve the demo design @oliviertassinari -- [docs] Localization progress, polish (#9672) @oliviertassinari -- [docs] Normalize the WIP items (#9671) @oliviertassinari - -### Core - -- [core] Add `validate` command (#9714) @romgrk -- [changelog] Update generator to new format @oliviertassinari - -## 6.10.0 - -_Jul 13, 2023_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- ⚡ Improve data grid filtering performance -- 🎁 Include column groups in the CSV export -- 🌍 Improve Polish (pl-PL) locale for the data grid -- 🌍 Improve Norwegian (nb-NO) locale for the pickers - -### Data Grid - -#### `@mui/x-data-grid@6.10.0` - -- [DataGrid] Allow to exclude hidden columns from the quick filter (#9610) @cherniavskii -- [DataGrid] Filtering performance: remove indirection (#9334) @romgrk -- [DataGrid] Fix props propagation on `GridToolbarQuickFilter` component (#9633) @giladappsforce -- [DataGrid] Fix quick filter input lag (#9630) @cherniavskii -- [DataGrid] Include column groups in the CSV export (#9585) @cherniavskii -- [DataGrid] Make `rowExpansionChange` event public (#9611) @MBilalShafi -- [l10n] Improve Polish (pl-PL) locale (#9625) @ch1llysense - -#### `@mui/x-data-grid-pro@6.10.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.10.0`. - -#### `@mui/x-data-grid-premium@6.10.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.10.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.10.0` - -- [pickers] Fix date calendar issues (#9652) @LukasTy -- [l10n] Improve Norwegian (nb-NO) locale (#9608) @JosteinBrevik - -#### `@mui/x-date-pickers-pro@6.10.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.10.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.3` - -- [charts] Allow configuring bar size (#9632) @alexfauquette -- [charts] Simplify custom components creation (#9561) @alexfauquette - -### Docs - -- [docs] Add slot components usage alert (#9660) @LukasTy -- [docs] Fix casing Cell selection @oliviertassinari - -### Core - -- [core] Disambiguate eslint plugin name @oliviertassinari -- [core] Update priority support issue template and prompt (#9574) @DanailH -- [changelog] Clarify each plan (#9446) @oliviertassinari -- [license] Fix error terminology (#9614) @oliviertassinari - -## 6.9.2 - -_Jul 6, 2023_ - -We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Auto-scroll when making range selection (#8661) @m4theushw - -- 📚 New page: Components lifecycle (#8372) @flaviendelangle - - Clarify pickers events and value updates in a [single docs page](https://mui.com/x/react-date-pickers/lifecycle/). - -- 🥧 Add pie chart component - - They are fresh from the code editor. You can visit [pie charts docs](https://mui.com/x/react-charts/pie/) or their [demo page](https://mui.com/x/react-charts/pie-demo/). - - <img width="380" alt="pie-charts" src="https://github.com/mui/mui-x/assets/13808724/fe908c45-803c-4316-b913-dbd2f9f0551e"> - -- 🐞 Bugfixes - -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.9.2` - -- [DataGrid] Fix `RangeError` when using flex columns (#9554) @cherniavskii -- [DataGrid] Fix React 17 editing bug (#9530) @romgrk -- [DataGrid] Use `getRowId` in filtering (#9564) @romgrk -- [DataGrid] Correctly reflect `TablePagination`'s `rowsPerPageOptions` shape to `pageSizeOptions` (#9438) @burakkgunduzz -- [l10n] Improve Spanish (es-ES) locale (#9500) @fufex - -#### `@mui/x-data-grid-pro@6.9.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.9.2`. - -#### `@mui/x-data-grid-premium@6.9.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.9.2`, plus: - -- [DataGridPremium] Auto-scroll when making range selection (#8661) @m4theushw - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.9.2` - -- [pickers] Forward digital clock classes (#9555) @YoonjiJang -- [pickers] Rename `internal` folder to `internals` on `@mui/x-date-picker-pro` (#9571) @flaviendelangle - -#### `@mui/x-date-pickers-pro@6.9.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.9.2`. - -### Charts / `@mui/x-charts@6.0.0-alpha.2` - -- [charts] Add pie chart component (#9395) @alexfauquette - -### Docs - -- [docs] Add pickers playground (#9164) @LukasTy -- [docs] Fix API links for pickers (#9573) @alexfauquette -- [docs] Fix demos with `ToggleButtonGroup` (#9548) @flaviendelangle -- [docs] Fix typos in pagination documentation page (#9332) @RatherBeLunar -- [docs] Hide ads on paid content @oliviertassinari -- [docs] Move the charts in the sidebar (#9437) @flaviendelangle -- [docs] New page: Components lifecycle (#8372) @flaviendelangle -- [docs] Remove outdated header tag @oliviertassinari - -### Core - -- [core] Fix typo in priority support @oliviertassinari -- [core] Remove mention of Crowdin @oliviertassinari - -## 6.9.1 - -_Jun 30, 2023_ - -We'd like to offer a big thanks to the 13 contributors who made this release possible. Here are some highlights ✨: - -- 🔎 Add experimental API for faster filtering performance -- 🌍 Add Chinese (Hong Kong) (zh-HK) locale on the pickers -- 🌍 Improve Romanian (ro-RO) and Hungarian (hu-HU) translations on the pickers and the data grid -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.9.1` - -- [DataGrid] Add Joy UI `tooltip` and `loadingOverlay` slots (#9028) @cherniavskii -- [DataGrid] Add section about enabling pagination on Pro and Premium (#8759) @joserodolfofreitas -- [DataGrid] Don't forward `editCellState` prop to DOM element (#9501) @m4theushw -- [DataGrid] Add experimental API for faster filtering performance (#9254) @romgrk -- [DataGrid] Fix `nextFieldToFocus` to always be a visible column field when <kbd>Tab</kbd> key is pressed (#8314) @yaredtsy -- [DataGrid] Fix `Maximum call stack size exceeded` error when using fractional width (#9516) @cherniavskii -- [l10n] Improve Romanian (ro-RO) and Hungarian (hu-HU) translations (#9436) @noraleonte - -#### `@mui/x-data-grid-pro@6.9.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.9.1`, plus: - -- [DataGridPro] Don't throw error in column pinning (#9507) @romgrk -- [DataGridPro] Fix bug with `checkboxSelection` and treeData/grouping (#9418) @romgrk - -#### `@mui/x-data-grid-premium@6.9.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.9.1`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.9.1` - -- [DateTimePicker] Scroll to Digital Clock section only when selection changes (#9434) @LukasTy -- [pickers] Handle `keyDown` only when input is focused (#9481) @LukasTy -- [pickers] Add `referenceDate` prop on `TimeClock`, `DigitalClock` and `MultiSectionDigitalClock` (#9356) @flaviendelangle -- [l10n] Add Chinese (Hong Kong) (zh-HK) locale (#9468) @samchiu90 -- [l10n] Improve Romanian (ro-RO) translations (#9436) @noraleonte - -#### `@mui/x-date-pickers-pro@6.9.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.9.1`. - -### Charts / `@mui/x-charts@6.0.0-alpha.1` - -- [charts] Take responsive container from data grid (#9497) @alexfauquette -- [charts] Update README.md (#9426) @alexfauquette -- [charts] Fix typo and small refactor (#9526) @flaviendelangle - -### Docs - -- [docs] Add a recipe limiting to one expanded detail panel at a time (#9488) @cherniavskii -- [docs] Add missing upcoming flag without issue (#9449) @oliviertassinari -- [docs] Fix 301 when opening the charts @oliviertassinari -- [docs] Fix 404 link (#9435) @alexfauquette -- [docs] Fix `productId` logic (#9451) @oliviertassinari -- [docs] Update charts overview.md (#9429) @brentertz -- [docs] Avoid systematic usage of `"bg": "inline"` (#9499) @alexfauquette -- [docs] Display plan icon in ToC (#9490) @cherniavskii -- [docs] Remove "product" markdown header (#9517) @oliviertassinari - -### Core - -- [core] Add `edit-mode` to priority support action (#9483) @DanailH -- [core] Fix priority support prompt action (#9472) @DanailH -- [core] Update `uses` for priority support action (#9480) @DanailH -- [core] Bumb update monorepo (#9476) @alexfauquette -- [changelog] Fix media quality (#9439) @oliviertassinari -- [changelog] Remove height img attribute @oliviertassinari -- [test] Skip flaky row pinning tests in JSDOM (#9511) @cherniavskii - -## 6.9.0 - -_Jun 22, 2023_ - -We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 We released a new open-source package: `@mui/x-charts`. This package aims at simplifying the integration of charts into your dashboards. 📊 - - <img width="512" alt="charts" src="https://github.com/mui/mui-x/assets/3165635/41201d3c-16a4-442d-a230-68356e6b433d"> - - It already contains [line](https://mui.com/x/react-charts/lines/), [bar](https://mui.com/x/react-charts/bars/), and [scatter](https://mui.com/x/react-charts/scatter/) charts, with basic customization features. Check out the [documentation](https://mui.com/x/react-charts/) to see what it can do, and open issues to get the feature you need implemented. - -- 🚀 Introducing UTC and timezone support for pickers. - - <img width="774" src="https://github.com/mui/mui-x/assets/3165635/ad95a404-ee67-4aff-b996-ad6cbb322348" alt="Pickers time zone switching"> - - Visit the [documentation](https://mui.com/x/react-date-pickers/timezone/) to learn how to use it. - -- 🌍 Improve Brazilian Portuguese (pt-BR) on the data grid -- 🌍 Improve Czech (cs-CZ) locale on the pickers -- 🚅 Performance improvements -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.9.0` - -- [DataGrid] Filtering performance: use unmemoized selectors by default (#9287) @romgrk -- [DataGrid] Use container dimensions from `getComputedStyle` (#9236) @m4theushw -- [l10n] Improve Brazilian Portuguese (pt-BR) locale (#9404) @julioAz - -#### `@mui/x-data-grid-pro@6.9.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.9.0`. - -#### `@mui/x-data-grid-premium@6.9.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.9.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.9.0` - -- [fields] Ensure `minutesStep` is respected by fields arrows up/down (#9338) @alexfauquette -- [fields] Reset internal state when `referenceValue` changes (#9390) @adrianmxb -- [l10n] Improve Czech (cs-CZ) locale (#9397) @radimkafka -- [pickers] Add proper support for UTC and timezones (#8261) @flaviendelangle -- [pickers] Fix field section selection on `DateTimePicker` (#9342) @LukasTy -- [pickers] Reduce date range calendar vertical border width (#9368) @oliviertassinari -- [pickers] Reset fields internal state when pasting value (#9385) @alexfauquette - -#### `@mui/x-date-pickers-pro@6.9.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.9.0`. - -### Charts / `@mui/x-charts@6.0.0-alpha.0` - -- [charts] Allow to customize colors based on the theme mode (#9006) @alexfauquette -- [charts] Prepare the charts release (#9361) @alexfauquette -- [charts] Various improvements of charts docs (#9341) @alexfauquette - -### Docs - -- [docs] Add examples of using different time view renderers (#9360) @LukasTy -- [docs] Add recipe for single-click editing (#8365) @m4theushw -- [docs] Fix Base UI references (#9349) @oliviertassinari -- [docs] Fix random screenshot generation (#9364) @cherniavskii -- [docs] Remove random generation from chart doc example (#9343) @flaviendelangle -- [docs] Sync h1 with sidenav link (#9252) @oliviertassinari -- [docs] Use the mui-x Stack Overflow tag (#9352) @oliviertassinari - -### Core - -- [core] Add PR template and update the contributions guide (#9329) @DanailH -- [core] Bump monorepo (#9420) @LukasTy -- [core] Fix file typo (#9421) @DanailH -- [core] Fix proptypes (#9396) @LukasTy -- [core] Move old release notes in `CHANGELOG.old.md` (#9269) @flaviendelangle -- [core] Add priority support issue template (#8928) @DanailH - -## 6.8.0 - -_Jun 16, 2023_ - -We'd like to offer a big thanks to the 13 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Add Greek (el-GR) locale on Pickers and improve on Data Grid -- 🚅 Performance improvements -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.8.0` - -- [DataGrid] Add missing styles to `overridesResolver` (#9248) @mrmuhammadali -- [DataGrid] Keep column header menu icon always visible on touch devices (#9076) @cherniavskii -- [DataGrid] Correct the type for single digit edited number value (#9282) @MBilalShafi -- [DataGrid] Correct the type for single digit edited number for row edit (#9348) @MBilalShafi -- [DataGrid] Filtering performance: cache values (#9284) @romgrk -- [DataGrid] Fix tabbing between `actions` cells in edit mode (#9321) @md250721 -- [DataGrid] Make autocompletion work for `GridColDef['type']` (#9320) @cherniavskii -- [DataGrid] Polish shortcut logic (#9220) @oliviertassinari -- [DataGrid] Row reordering fix for different row heights (#7006) @yaredtsy -- [DataGrid] Scroll performance improvements (#9037) @romgrk -- [l10n] Improve Greek (el-GR) locale (#9292) @clytras - -#### `@mui/x-data-grid-pro@6.8.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.8.0`. - -#### `@mui/x-data-grid-premium@6.8.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.8.0`. - -### Date and Time Pickers - -#### `@mui/x-date-pickers@6.8.0` - -- [l10n] Add Greek (el-GR) locale (#9293) @clytras -- [pickers] Add a `referenceDate` prop on `DateCalendar`, `MonthCalendar` and `YearCalendar` (#9260) @flaviendelangle -- [pickers] Close the calendar when a shortcut is selected (#9080) @flaviendelangle -- [pickers] Fix disabling for digital clock (#9300) @alexfauquette - -#### `@mui/x-date-pickers-pro@6.8.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.8.0`. - -### Docs - -- [docs] Add header filters to the popular features demo (#9069) @MBilalShafi -- [docs] Fix `Date Calendar` dynamic data demo (#9290) @benzler -- [docs] Fix Data Grid header filter link (#9225) @oliviertassinari -- [docs] Fix missing docs version warning (#9221) @oliviertassinari -- [docs] Improve Chart overview (#9333) @oliviertassinari -- [docs] Improve Next.js license installation guide (#8975) @oliviertassinari -- [docs] Link pagination documentation to the migration guide (#9296) @MBilalShafi -- [docs] One step toward components -> slots (#9251) @oliviertassinari -- [docs] Improve and reorganize sections on editing page (#8431) @joserodolfofreitas -- [docs] Add clipboard paste to popular features demo (#9029) @cherniavskii - -### Core - -- [core] Polish event name (#9336) @oliviertassinari -- [core] Re-enable `Argos` CI step (#9301) @LukasTy -- [core] Upgrade Node.js to v18 on CircleCI, CodeSandbox and Netlify (#9319) @ZeeshanTamboli -- [core] Upgrade Node.js v18 for l10n GitHub CI (#9355) @ZeeshanTamboli -- [charts] Add demonstration pages based on Recharts demo (#9175) @alexfauquette -- [charts] Add legend (#9024) @alexfauquette -- [charts] Complete the docs to introduce charts (#9153) @alexfauquette -- [charts] Manage elements highlights (#9242) @alexfauquette -- [charts] Prefix subcomponents with `Charts` (#9314) @alexfauquette -- [license] Improve annual license expiration message (#9135) @oliviertassinari - -## 6.7.0 - -_Jun 9, 2023_ - -We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Improve the default `format` prop value on the pickers. - - Here are a few examples: - - ```tsx - <TimePicker views={['hours', 'minutes', 'seconds']} ampm /> - // Format before v6.7.0: `hh:mm aa` - // Format after v6.7.0: `hh:mm:ss aa` - - <DatePicker views={['year']} /> - // Format before v6.7.0: `MM/DD/YYYY` - // Format after v6.7.0: `YYYY` - - <DateTimePicker views={['day', 'hours', 'minutes']} ampm /> - // Format before v6.7.0: `MM/DD/YYYY hh:mm aa` - // Format after v6.7.0: `DD hh:mm aa` - ``` - -- 🌍 Add Romanian (ro-RO) locale on the pickers -- 🌍 Improve German (de-DE) locale on the pickers -- 🌍 Improve Czech (cs-CZ), German (de-DE) and Turkish (tr-TR) locales on the data grid -- 🚀 Performance improvements -- 🐞 Bugfixes -- 📚 Documentation improvements - -### Data Grid - -#### `@mui/x-data-grid@6.7.0` - -- [DataGrid] Allow overflowing grid root element (#9179) @cherniavskii -- [DataGrid] Fix module augmentation error when using `@mui/lab` (#9235) @cherniavskii -- [DataGrid] Fix row with ids matching `Object` prototype (#9265) @romgrk -- [DataGrid] Fix `sortModel` and `filterModel` resetting when columns change (#9239) @alexgonch -- [DataGrid] Improve grouping performance for large datasets (#9200) @romgrk -- [DataGrid] Increase threshold to trigger memory leak warning (#9263) @m4theushw -- [DataGrid] Update data grid migration guide to include updated type (#9272) @MBilalShafi -- [l10n] Improve Czech (cs-CZ) locale (#9266) @MartinSkarpa -- [l10n] Improve German (de-DE) locale (#9259) @ximex -- [l10n] Improve Turkish (tr-TR) locale (#9237) @MCErtan - -#### `@mui/x-data-grid-pro@6.7.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-data-grid@6.7.0`, plus: - -- [DataGridPro] Improve header filter menu visuals (#9181) @MBilalShafi - -#### `@mui/x-data-grid-premium@6.7.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') - -Same changes as in `@mui/x-data-grid-pro@6.7.0`, plus: - -- [DataGridPremium] Remove last line break on clipboard paste (#9163) @cherniavskii - -### Pickers - -#### `@mui/x-date-pickers@6.7.0` - -- [l10n] Add Romanian (ro-RO) locale (#9257) @ximex -- [l10n] Improve German (de-DE) locale (#9258) @ximex -- [pickers] Apply dynamic default format depending on views for all desktop and mobile pickers (#9126) @flaviendelangle - -#### `@mui/x-date-pickers-pro@6.7.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') - -Same changes as in `@mui/x-date-pickers@6.7.0`, plus: - -- [pickers] Update `DateRangePickerDay` props JSDoc (#9191) @stevus - -### Docs - -- [docs] Fix missing props on the `GridFilterPanel` API page (#9180) @cherniavskii -- [docs] Fix overview page typo (#9230) @LukasTy -- [docs] Fix version redirect (#9273) @alexfauquette - -### Core - -- [core] Temporarily remove the Argos upload on the regression testing (#9267) @flaviendelangle -- [charts] Add clip-path to avoid charts overflow (#9012) @alexfauquette -- [charts] Add style customization on bar (#8935) @alexfauquette -- [charts] Enforce axis `min`/`max` over the `nice()` method (#9189) @alexfauquette -- [charts] Improve axis label and ticks label alignements (#9190) @alexfauquette -- [charts] Simplify the switch between responsive and fix dimensions (#9151) @alexfauquette - -## 6.6.0 - -_Jun 1, 2023_ - -We'd like to offer a big thanks to the 15 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 New date time picking UI on [`DesktopDateTimePicker`](https://mui.com/x/react-date-pickers/date-time-picker/) - - <img src="https://github.com/mui/mui-x/assets/3165635/4e1fe9f9-03eb-4f23-99dd-80212b21fb23" width="840" height="506" alt="Desktop Date Time Picker example" /> - -- 🚀 Performance improvements -- 🐞 Bugfixes -- 📚 Documentation improvements -- 🌍 Improve Dutch (nl-NL) and French (fr-FR) locales on the data grid -- 🌍 Add Vietnamese (vi-VN) locale on the pickers - -### `@mui/x-data-grid@6.6.0` / `@mui/x-data-grid-pro@6.6.0` / `@mui/x-data-grid-premium@6.6.0` - -#### Changes - -- [DataGrid] Support data attributes (#8845) @romgrk -- [DataGrid] Avoid allocations in `hydrateRowsMeta` (#9121) @romgrk -- [DataGrid] Fix filter input select accessibility (#9018) @Jul13nT -- [DataGrid] Fix accessibility issues in panels and toolbar buttons (#8862) @romgrk -- [DataGrid] Fix `onCellEditStop` not invoked (#8857) @romgrk -- [DataGridPro] Fix auto-scroll when reordering columns (#8856) @m4theushw -- [DataGridPro] Fix row ID type casting in detail panels lookup (#8976) @minchaej -- [DataGridPro] Emit `columnWidthChange` event on `touchEnd` of column resize (#8669) @MBilalShafi -- [DataGridPro] Do not apply filters on `rowExpansionChange` (#8671) @cherniavskii -- [DataGridPro] Prevent click event on sorting after a resize (#9117) @romgrk -- [DataGridPremium] Improve Excel export interface (#9128) @TiagoPortfolio -- [l10n] Improve Dutch (nl-NL) locale (#9043) @thedutchruben -- [l10n] Improve French (fr-FR) locale (#9109) @Jul13nT - -### `@mui/x-date-pickers@6.6.0` / `@mui/x-date-pickers-pro@6.6.0` - -#### Changes - -- [fields] Allow to explicitly define the reference value and improve its default value (#9019) @flaviendelangle -- [l10n] Add Vietnamese (vi-VN) locale (#9099) @nhannt201 -- [pickers] Add `DigitalClock` to `DesktopDateTimePicker` (#8946) @LukasTy -- [pickers] Add support for timezones on the adapters (#9068) @flaviendelangle -- [pickers] Fix `MonthCalendar` and `YearCalendar` disabled validation (#9149) @LukasTy -- [pickers] Fix bug when fields have a unique section (#9110) @alexfauquette -- [pickers] Fix focus jumping on Safari (#9072) @LukasTy -- [pickers] Use the locale start of the week in `getWeekArray` (#9176) @flaviendelangle - -### Docs - -- [docs] Add single input range picker demo (#9159) @LukasTy -- [docs] Align `DateCalendar` demo views with labels (#9152) @LukasTy -- [docs] Clarify the peer dependency with React (#9067) @oliviertassinari -- [docs] Fix Norwegian locale typo (#9168) @LukasTy -- [docs] Fix column menu item demo (#9071) @MBilalShafi -- [docs] Improve localization table progress bars (#9033) @noraleonte -- [docs] Smooth performance animation (#8986) @oliviertassinari -- [docs] Use responsive time and date time pickers and the views sections (#9127) @flaviendelangle -- [docs] Reduce layout shift in grid demo (#9132) @oliviertassinari -- [docs] Fix tree data children lazy-loading demo (#8840) @yaredtsy -- [docs] Improve filtering docs discoverability (#9074) @MBilalShafi - -### Core - -- [core] Allow string literals as keys in `localesText` (#9045) @MBilalShafi -- [core] Fix `randomInt` producing values exceeding `max` value (#9086) @cherniavskii -- [core] Fix flaky test on `dateWithTimezone` adapter test (#9129) @flaviendelangle -- [core] Lock `@types/node` on v18 (#9107) @LukasTy -- [core] Remove `cross-fetch` dependency (#9108) @LukasTy -- [core] Remove `createDetectElementResize()` replaced with `ResizeObserver` (#9015) @oliviertassinari -- [core] Upgrade monorepo (#9027) @m4theushw -- [core] Upgrade monorepo (#9106) @LukasTy -- [charts] Fix proptypes (#9125) @LukasTy -- [charts] Generate the charts proptypes (#9010) @alexfauquette -- [charts] Manage series stacking (#8888) @alexfauquette -- [license] List side effects in the license package (#9092) @cherniavskii - -## 6.5.0 - -_May 19, 2023_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 💫 Introduce filtering on column headers for `DataGridPro` and `DataGridPremium`: - - <img src="https://github.com/mui/mui-x/releases/download/v6.5.0/recording.gif" width="840" height="506" alt="Filtering on column headers example" /> - - See [the documentation](https://mui.com/x/react-data-grid/filtering/header-filters/) for more information - -- 🌍 Improve Hebrew (he-IL) and Czech (cs-CZ) locales -- 📝 Support for editing on pinned rows -- 🚀 Performance improvements -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.5.0` / `@mui/x-data-grid-pro@6.5.0` / `@mui/x-data-grid-premium@6.5.0` - -#### Changes - -- [DataGrid] Fix grid size calculation when `.MuiDataGrid-main` has border (#8882) @cherniavskii -- [DataGridPro] Filtering on Column Header (#7760) @MBilalShafi -- [DataGridPro] Improve `treeData` and `rowGrouping` performance (#8990) @MBilalShafi -- [DataGridPro] Support pinned rows editing (#8921) @cherniavskii -- [l10n] Improve Hebrew (he-IL) locale (#8943) @Itzik-Tech -- [l10n] Improve Czech (cs-CZ) locale (#8829) @harastaivan -- [l10n] Improve Czech (cs-CZ) locale (#8956) @davidzemancz - -### `@mui/x-date-pickers@6.5.0` / `@mui/x-date-pickers-pro@6.5.0` - -#### Changes - -- [fields] Select the first section instead of last when clicking right of content (#9005) @noraleonte -- [fields] Refactor prop drilling in fields (#8660) @flaviendelangle -- [pickers] Allow to render the months before `currentMonth` instead of the one after (#8592) @flaviendelangle -- [pickers] Fix view management when `openTo` or `views` is modified (#8997) @alexfauquette -- [l10n] Improve Czech (cs-CZ) locale (#8829) @harastaivan - -### Docs - -- [docs] Clarify what Controlled / Uncontrolled means (#8926) @flaviendelangle -- [docs] Fix docs using wrong service worker (#9030) @cherniavskii -- [docs] Remove prop-types from JS demos (#9008) @flaviendelangle - -### Core - -- [core] Add assertion about checkbox rerenders (#8974) @oliviertassinari -- [core] Allow selecting a section by type in field tests (#9009) @flaviendelangle -- [core] Fix `yarn.lock` (#8988) @flaviendelangle -- [core] Fix flacky adapter test (#8995) @flaviendelangle -- [charts] Clean the axis rendering (#8948) @alexfauquette -- [DataGrid] Memoize root props for better performance (#8942) @romgrk -- [test] Skip flaky unit tests in JSDOM (#8994) @cherniavskii - -## 6.4.0 - -_May 12, 2023_ - -We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Introduce clipboard paste support for `DataGridPremium`: - - https://github.com/mui/mui-x/assets/13808724/abfcb5c6-9db6-4677-9ba7-ae97de441080 - - See [the documentation](https://mui.com/x/react-data-grid/clipboard/#clipboard-paste) for more information - -- 🌍 Improve French (fr-FR), German (de-DE), Portuguese (pt-BR) and Ukrainian (uk-UA) locales on the data grid -- 🌍 Add Slovak (sk-SK) locale on the pickers -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.4.0` / `@mui/x-data-grid-pro@6.4.0` / `@mui/x-data-grid-premium@6.4.0` - -#### Changes - -- [DataGrid] Fix DataGrid rendering in JSDOM (#8968) @cherniavskii -- [DataGrid] Fix layout when rendered inside a parent with `display: grid` (#8577) @cherniavskii -- [DataGrid] Add Joy UI icon slots (#8940) @siriwatknp -- [DataGrid] Add Joy UI pagination slot (#8871) @cherniavskii -- [DataGrid] Extract `baseChip` slot (#8748) @cherniavskii -- [DataGridPremium] Implement Clipboard import (#7389) @cherniavskii -- [l10n] Improve French (fr-FR) locale (#8825) @allereaugabriel -- [l10n] Improve German (de-DE) locale (#8898) @marcauberer -- [l10n] Improve Portuguese (pt-BR) locale (#8960) @Sorriso337 -- [l10n] Improve Ukrainian (uk-UA) locale (#8863) @Neonin - -### `@mui/x-date-pickers@6.4.0` / `@mui/x-date-pickers-pro@6.4.0` - -#### Changes - -- [pickers] Fix trailing zeros inconsistency in `LuxonAdapter` (#8955) @alexfauquette -- [pickers] Stop using deprecated adapter methods (#8735) @flaviendelangle -- [pickers] Strictly type the `adapterLocale` prop of `LocalizationProvider` (#8780) @flaviendelangle -- [l10n] Add Slovak (sk-SK) locale (#8875) @MatejFacko - -### Docs - -- [docs] Fix date pickers typo in the docs (#8939) @richbustos -- [docs] Fix master detail demo (#8894) @m4theushw -- [docs] Fix typo in clipboard docs (#8971) @MBilalShafi -- [docs] Reduce list of dependencies in Codesandbox/Stackblitz demos (#8535) @cherniavskii - -### Core - -- [core] Improve testing of the adapters (#8789) @flaviendelangle -- [core] Update license key for tests (#8917) @LukasTy -- [charts] Make introduction docs pages for each chart (#8869) @alexfauquette -- [charts] Document Tooltip and Highlighs (#8867) @alexfauquette -- [test] Cover row grouping regression with a unit test (#8870) @cherniavskii -- [test] Fix flaky regression tests (#8954) @cherniavskii - -## 6.3.1 - -_May 5, 2023_ - -We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: - -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.3.1` / `@mui/x-data-grid-pro@6.3.1` / `@mui/x-data-grid-premium@6.3.1` - -#### Changes - -- [DataGrid] Fix broken filtering in the value formatter demo (#8621) @cherniavskii -- [DataGrid] Fix falsy filter values not showing in filter button tooltip (#8550) @ithrforu -- [DataGrid] Fix missing watermark in Pro and Premium packages (#8797) @cherniavskii -- [DataGrid] Remove unwarranted warning log (#8847) @romgrk -- [DataGrid] Add Joy UI slots (`Select`, `SelectOption`, `InputLabel`, `FormControl`) (#8747) @cherniavskii -- [DataGridPremium] Fix expanded groups being collapsed after calling `updateRows` (#8823) @cherniavskii - -### `@mui/x-date-pickers@6.3.1` / `@mui/x-date-pickers-pro@6.3.1` - -#### Changes - -- [pickers] Fix `minutesStep` validation prop behavior (#8794) @LukasTy -- [pickers] Fix time picker `viewRenderers` overriding (#8830) @LukasTy -- [pickers] Remove last additional character when using LTR (#8848) @alexfauquette - -### Docs - -- [docs] Fix controlled mode demo on Editing page (#8800) @yaredtsy -- [docs] Fix scrolling demo not working with React 18 (#6489) @cherniavskii -- [docs] Update demo to support agregation on popular feature cell (#8617) @BalaM314 -- [docs] Clarify what `<path>` is (#8764) @alexfauquette - -### Core - -- [core] Do not include playground pages in `yarn typescript` script (#8822) @cherniavskii -- [core] Limit `typescript:ci` step memory limit (#8796) @LukasTy -- [core] Upgrade monorepo (#8835) @cherniavskii -- [test] Use `fake` clock on `MobileDateRangePicker` (#8861) @LukasTy -- [charts] Clean some styling (#8778) @alexfauquette -- [charts] Improve tooltip (#8792) @alexfauquette -- [charts] Improvement and docs on axis (#8654) @alexfauquette -- [charts] Defaultize attributes (#8788) @alexfauquette - -## 6.3.0 - -_Apr 28, 2023_ - -We'd like to offer a big thanks to the 15 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 New [time-picking UI](https://mui.com/x/react-date-pickers/digital-clock/) designed for desktops (#7958) @LukasTy - - <img src="https://user-images.githubusercontent.com/4941090/235072007-de39a397-e4a4-4c98-8e10-5ee4ad440108.gif" width="494" alt="New digital clock time picker" /> - -- ✨ Picker fields [now always include a leading zero](https://mui.com/x/react-date-pickers/adapters-locale/#respect-leading-zeros-in-fields) on digit sections (#8527) @flaviendelangle -- 🌍 Improve Chinese (zh-CN), French (fr-FR), and Turkish (tr-TR) locales -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.3.0` / `@mui/x-data-grid-pro@6.3.0` / `@mui/x-data-grid-premium@6.3.0` - -#### Changes - -- [DataGrid] Add overlay classes to `gridClasses` (#8686) @lindapaiste -- [DataGrid] Avoid passing `api` prop to div (#8679) @someden -- [DataGrid] Fix 'ResizeObserver loop limit exceeded' error (#8744) @m4theushw -- [DataGrid] Add Joy UI slots (button and switch) (#8699) @siriwatknp -- [DataGrid] Fix aggregation label alignment (#8694) @joserodolfofreitas -- [DataGridPremium] Fix infinite loop when updating grouped rows (#8693) @cherniavskii -- [DataGridPro] Fix error after updating `columns` and `columnGroupingModel` at once (#8730) @cherniavskii -- [l10n] Improve Chinese (zh-CN) locale (#8753) @SakumyZ -- [l10n] Improve French (fr-FR) locale (#8704) @Jul13nT -- [l10n] Improve Turkish (tr-TR) locale (#8783) @cccaaannn - -### `@mui/x-date-pickers@6.3.0` / `@mui/x-date-pickers-pro@6.3.0` - -#### Changes - -- [fields] Always add leading zeroes on digit sections (#8527) @flaviendelangle -- [fields] Pass the `readOnly` prop to `InputProps` instead of `inputProps` (#8659) @flaviendelangle -- [pickers] Add missing export for `caES` locale (#8782) @flaviendelangle -- [pickers] Add new `DigitalClock` desktop time picking experience (#7958) @LukasTy -- [pickers] Do not use `instanceOf DateTime` in `AdapterLuxon` (#8734) @flaviendelangle -- [pickers] Fix date calendar `selected` & `disabled` day style (#8773) @LukasTy -- [pickers] Migrate `AdapterDateFns` to our repository (#8736) @flaviendelangle -- [pickers] Migrate `AdapterLuxon` to our repository (#8600) @flaviendelangle -- [pickers] Migrate `AdapterMomentHijri` to our repository (#8776) @flaviendelangle -- [pickers] Migrate `AdapterMomentJalaali` and `AdapterDateFnsJalali` to our repository (#8741) @flaviendelangle -- [pickers] Migrate `AdapterMoment` to our repository (#8700) @flaviendelangle -- [pickers] Refactor the validation files (#8622) @flaviendelangle -- [pickers] Use `en dash` instead of `em dash` in multi input range fields (#8738) @flaviendelangle -- [l10n] Improve Chinese (zh-CN) locale (#8753) @SakumyZ -- [l10n] Improve Turkish (tr-TR) locale (#8783) @cccaaannn - -### Docs - -- [docs] Add icons for charts menu (#8752) @alexfauquette -- [docs] Document the supported formats (#8746) @flaviendelangle -- [docs] Fix Hijri demo (#8698) @alexfauquette -- [docs] Fix `x-codemod` package version in changelog (#8690) @MBilalShafi -- [docs] Fix columns special properties code example (#8414) @mikkelhl -- [docs] Fix error in `minDateTime` `validation` page section (#8777) @LukasTy -- [docs] Update custom field pickers using theme scoping (#8609) @siriwatknp -- [docs] Use community version of data grid for column grouping demo (#7346) @ASchwad -- [docs] Use new `slots` / `slotProps` props in the pickers migration guide (#8341) @flaviendelangle - -### Core - -- [core] Cleanup picker tests (#8652) @flaviendelangle -- [core] Use `adapter.lib` instead of `adapterName` in `describeAdapters` (#8779) @flaviendelangle -- [charts] Adapt line and scatter plot to the "band" scale type (#8701) @alexfauquette -- [charts] Link the Gantt Charts issue in the docs (#8739) @flaviendelangle - -## 6.2.1 - -_Apr 20, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Add virtualization to row detail panels (#7969) @yaredtsy -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.2.1` / `@mui/x-data-grid-pro@6.2.1` / `@mui/x-data-grid-premium@6.2.1` - -#### Changes - -- [DataGrid] Add `getTogglableColumns` to `Hide all` and `Show all` actions (#8496) @MBilalShafi -- [DataGrid] Add Grid + Joy UI experiment page (#8067) @cherniavskii -- [DataGrid] Fix print style when rendering inside Shadow DOM (#8656) @Bwatermelon -- [DataGrid] Replace `GridAutoSizer` with `ResizeObserver` (#8091) @m4theushw -- [DataGrid] Use stable ID for the placeholder filter item (#8603) @m4theushw -- [DataGridPro] Virtualize row detail panels (#7969) @yaredtsy - -### `@mui/x-date-pickers@6.2.1` / `@mui/x-date-pickers-pro@6.2.1` - -#### Changes - -- [pickers] Do not include the time in date components when going to today (#8657) @flaviendelangle -- [pickers] Sync internal state with controlled value (#8674) @alexfauquette - -### `@mui/x-codemod@6.2.1` - -#### Changes - -- [codemod] Avoid filter failures on object prototype properties (#8647) @LukasTy - -### Docs - -- [docs] Add no-op service worker to fix stale cache issue (#8598) @cherniavskii -- [docs] Clarify what `AdapterDayjs` is in the Getting Started page (#8219) @flaviendelangle -- [docs] Fix typo on picker page description (#8611) @maxolasersquad -- [docs] Improve section title in Getting Started page (#8648) @flaviendelangle -- [docs] Inform about input format modification (#8458) @alexfauquette - -### Core - -- [core] Fix release date (#8618) @flaviendelangle -- [core] Upgrade monorepo (#8668) @MBilalShafi -- [charts] Support Tooltip (#8356) @alexfauquette - -## 6.2.0 - -_Apr 14, 2023_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- Add `@mui/base` as a `peerDependency` of `@mui/x-date-pickers` and `@mui/x-date-pickers-pro` (#8590) @LukasTy - - Both libraries were not working correctly if used without `@mui/base`. - Most package manager should automatically use the `@mui/base` version installed for `@mui/material`. - -- The value rendered in the picker or field input no longer has spaces around the `/` characters (#8425) @flaviendelangle - - You can use the `formatDensity='spacious'` prop to add it back. - More information on [the dedicated doc section](https://mui.com/x/react-date-pickers/custom-field/#change-the-format-density) - -- 🌍 Improve French (fr-FR) and Urdu (ur-PK) and locales. -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.2.0` / `@mui/x-data-grid-pro@6.2.0` / `@mui/x-data-grid-premium@6.2.0` - -#### Changes - -- [DataGrid] Reset selection state on `checkboxSelection` toggle (#8522) @MBilalShafi -- [DataGrid] Use `baseSelect` slot instead of `baseTextField` with `select={true}` (#8110) @cherniavskii -- [l10n] Improve French (fr-FR) locale (#8537) @allereaugabriel -- [l10n] Improve Urdu (ur-PK) locale (#8513) @SFARPak - -### `@mui/x-date-pickers@6.2.0` / `@mui/x-date-pickers-pro@6.2.0` - -#### Changes - -- [DateTimePicker] Fix `TimeClock` validation ignoring date by default (#8570) @LukasTy -- [fields] Fix reliance on section order (#8545) @LukasTy -- [fields] Make the space between format separators controllable (#8425) @flaviendelangle -- [pickers] Add `@mui/base` to `peerDependencies` (#8590) @LukasTy -- [pickers] Fix JSDoc for `formatDensity` prop (#8601) @flaviendelangle -- [pickers] Improve value lifecycle on non-controlled pickers (#8312) @flaviendelangle -- [pickers] Migrate `AdapterDayjs` to our repository (#8487) @flaviendelangle - -### Docs - -- [docs] Fix "Custom day rendering" demo alignment (#8541) @LukasTy -- [docs] Fix **below** typo (#8576) @alexfauquette - -### Core - -- [core] Optimize `renovate` rules (#8575) @LukasTy -- [core] Upgrade monorepo (#8578) @cherniavskii -- [core] Update last release date (#8569) @DanailH - -## 6.1.0 - -_Apr 10, 2023_ - -We'd like to offer a big thanks to the 15 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Add Catalan (ca-ES), Kazakh (kz-KZ) and improve Spanish (es-ES), Dutch (nl-NL), Hebrew (he-IL), Hungarian (hu-HU), Japanese (ja-JP), Portuguese (pt-BR), and Russian (ru-RU) locales -- ✨ Allow to control visibility of columns shown in the columns panel (#8401) @MBilalShafi -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.1.0` / `@mui/x-data-grid-pro@6.1.0` / `@mui/x-data-grid-premium@6.1.0` - -#### Changes - -- [DataGrid] Allow to control visibility of columns shown in the `ColumnsPanel` component (#8401) @MBilalShafi -- [DataGrid] Fix filters with empty array value not being removed from the filter model (#8501) @cherniavskii -- [DataGrid] Fix memory leaks in development (#8301) @cherniavskii -- [DataGrid] Sync `date` column value when entering edit mode by pressing a digit (#8364) @m4theushw -- [DataGrid] Wrap column menu button with a tooltip (#7890) @cherniavskii -- [l10n] Improve Dutch (nl-NL) locale (#8491) @thedutchruben -- [l10n] Improve Hungarian (hu-HU) locale (#8486) @PetakCC -- [l10n] Improve Japanese (ja-JP) locale (#8462) @megos -- [l10n] Improve Portuguese (pt-BR) locale (#8480) @pwnedev -- [l10n] Improve Russian (ru-RU) locale (#8510) @alexrapro - -### `@mui/x-date-pickers@6.1.0` / `@mui/x-date-pickers-pro@6.1.0` - -#### Changes - -- [fields] Fix RTL navigation (#8490) @alexfauquette -- [fields] Fix usage of `slotProps.textField.InputProps` (#8428) @flaviendelangle -- [pickers] Fix `componentsProps.dialog` propagation (#8509) @LukasTy -- [pickers] Move `hasError` from `fieldValueManager` to `valueManager` (#8453) @flaviendelangle -- [pickers] Move the adapters interfaces to the X repository (#8412) @flaviendelangle -- [pickers] Update peer dependency versions (#8531) @LukasTy -- [pickers] Fix `isValid` regression (#8543) @LukasTy -- [l10n] Add Catalan (Spain) (ca-ES) and improve Spanish (es-ES) locales (#8498) @makenshikuro -- [l10n] Add Kazakh (kz-KZ) locale (#8451) @zhunus -- [l10n] Improve Dutch (nl-NL) locale (#8491) @thedutchruben -- [l10n] Improve Hebrew (he-IL) locale (#8464) @soris1989 -- [l10n] Improve Japanese (ja-JP) locale (#8462) @megos -- [l10n] Improve Portuguese (pt-BR) locale (#8480) @pwnedev - -### Docs - -- [docs] Fix 301 redirect (#8524) @alexfauquette -- [docs] Fix 404 links (#8454) @alexfauquette -- [docs] Fix broken API reference link (#8460) @oliviertassinari - -### Core - -- [core] Avoid 301 links (#8383) @oliviertassinari -- [core] Fix the l10n helper by using danger instead of actions (#8512) @alexfauquette -- [core] Help contributors for l10n PRs (#8503) @alexfauquette -- [core] Remove legacy token (#8457) @oliviertassinari -- [charts] Add a styling system (#8445) @alexfauquette - -## 6.0.4 - -_Mar 30, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Add Danish (da-DK), and improve Norwegian (nb-NO), Spanish (es-ES), and Swedish (sv-SE) locales -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.0.4` / `@mui/x-data-grid-pro@6.0.4` / `@mui/x-data-grid-premium@6.0.4` - -#### Changes - -- [DataGrid] Fix column header tooltip not showing when the title is truncated (#8433) @rohitnatesh -- [DataGrid] Fix filter model buttons' display condition (#8415) @MBilalShafi -- [DataGrid] Fix infinite rerender in a flex parent (#8436) @cherniavskii -- [DataGrid] Prevent reopening column menu when clicking in the button while it is open (#8286) @tanuj-22 -- [DataGrid] Rename `components` by `slots` in column menu API (#7999) @MBilalShafi -- [DataGrid] Remove hardcoded CSS classes' usages (#8444) @MBilalShafi -- [DataGridPremium] Fix aggregation initial state causing issue with quick filter (#8441) @MBilalShafi -- [l10n] Improve Danish (da-DK) locale (#8368) @BossElijah -- [l10n] Improve Danish (da-DK) locale (#8378) @BossElijah -- [l10n] Improve Norwegian (nb-NO) locale (#8367) @BossElijah -- [l10n] Improve Norwegian (nb-NO) locale (#8409) @BossElijah -- [l10n] Improve Spanish (es-ES) locale (#8420) @martjanz -- [l10n] Improve Swedish (sv-SE) locale (#8381) @BossElijah - -### `@mui/x-date-pickers@6.0.4` / `@mui/x-date-pickers-pro@6.0.4` - -#### Changes - -- [fields] Add missing tokens to `AdapterDateFnsJalali` (#8402) @flaviendelangle -- [fields] Clean the active date manager (#8370) @flaviendelangle -- [fields] Cleanup `useFieldState` (#8292) @flaviendelangle -- [fields] Only add RTL characters when needed (#8325) @flaviendelangle -- [pickers] Add support for single input fields in range pickers (#7927) @flaviendelangle -- [pickers] Allows non token characters in format (#8256) @alexfauquette -- [pickers] Avoid root imports and move public models to the models folder (#8337) @flaviendelangle -- [pickers] Update `view` when `views` or `openTo` changes (#8361) @LukasTy -- [l10n] Improve Norwegian (nb-NO) locale (#8382) @BossElijah -- [l10n] Add Danish (da-DK) locale (#8379) @BossElijah -- [l10n] Improve Swedish (sv-SE) locale (#8381) @BossElijah - -### `@mui/x-codemod@6.0.4` - -#### Changes - -- [codemod] Fix `remove-stabilized-experimentalFeatures` codemod (#8289) @alexfauquette - -### Docs - -- [docs] Fix `GridCellParams` signature in migration guide (#8427) @cherniavskii -- [docs] Fix "Custom field" demos responsive styles (#8408) @LukasTy -- [docs] Remove `label` from demos where it reduces clarity (#8416) @LukasTy -- [docs] Update slots' references in Data Grid migration guide (#8159) @MBilalShafi - -### Core - -- [charts] Work on typing (#8421) @flaviendelangle - -## 6.0.3 - -_Mar 23, 2023_ - -We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Bulgarian (bg-BG), Persian (fa-IR), Polish (pl-PL), and Dutch (nl-NL) locales -- 🐞 Bugfixes -- 📚 Documentation improvements - -### `@mui/x-data-grid@6.0.3` / `@mui/x-data-grid-pro@6.0.3` / `@mui/x-data-grid-premium@6.0.3` - -#### Changes - -- [DataGrid] Fix overflow calculation issue in column group headers (#8246) @MBilalShafi -- [DataGridPro] Fix column reorder glitches (#8335) @cherniavskii -- [l10n] Improve Bulgarian (bg-BG) locale (#8315) @todevmilen -- [l10n] Improve Persian (fa-IR) locale (#8268) @fakhamatia -- [l10n] improve Dutch (nl-NL) locale (#8317) @developenguin - -### `@mui/x-date-pickers@6.0.3` / `@mui/x-date-pickers-pro@6.0.3` - -#### Changes - -- [fields] Allow to reset the value from the outside (#8287) @flaviendelangle -- [fields] Cleanup section order generation (#8290) @flaviendelangle -- [fields] Fix Safari input selection resetting regression (#8295) @LukasTy -- [fields] Fix editing when all sections are selected (#8330) @flaviendelangle -- [fields] Fix iOS browser scroll jumping when entering data (#8328) @LukasTy -- [fields] New prop `unstableFieldRef` to imperatively interact with the selected sections (#8235) @flaviendelangle -- [pickers] Align date calendar colors (#8318) @LukasTy -- [pickers] Support invalid dates from the field (#8298) @flaviendelangle -- [l10n] Improve Persian (fa-IR) locale (#8268) @fakhamatia -- [l10n] Improve Polish (pl-PL) locale (#8344) @drmats -- [l10n] improve Dutch (nl-NL) locale (#8317) @developenguin - -### Docs - -- [docs] Create examples of pickers with custom fields (#8034) @flaviendelangle -- [docs] Fix 301 redirections @oliviertassinari -- [docs] Fix link to React's docs @oliviertassinari -- [docs] Fix Pro license links to point to the same page (#8303) @LukasTy -- [docs] Give an incentive to upgrade (#8269) @oliviertassinari -- [docs] Improve contrast on data grid navigation (#8239) @oliviertassinari -- [docs] Update shortcuts page to use slotProps (#8288) @dcorb -- [docs] Explain the `shouldDisableTime` migration in more depth (#8348) @LukasTy - -### Core - -- [core] Remove unused `visx` chart package (#8259) @LukasTy -- [core] Upgrade monorepo (#8331) @cherniavskii -- [charts] Project setup (#8308) @alexfauquette -- [test] Track visual regressions of column menu and filter/column panels (#8095) @cherniavskii - -## 6.0.2 - -_Mar 16, 2023_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Fire `onChange` when filling a partial date (#8082) @flaviendelangle -- 🎁 Support date format like `1st` (`do`) (#8188) @flaviendelangle -- 🌍 Add Hebrew (he-IL) locale (#8222) @ylarom -- 🌍 Improve Brazilian Portuguese (pt-BR), German (de-DE), and French (fr-FR) locales -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.2` / `@mui/x-data-grid-pro@6.0.2` / `@mui/x-data-grid-premium@6.0.2` - -#### Changes - -- [DataGrid] Fix <kbd>Space</kbd> triggering edit mode (#8180) @m4theushw -- [DataGrid] Remove warning when adding a custom column type (#8227) @m4theushw -- [l10n] Improve Brazilian Portuguese (pt-BR) locale (#8198) @JoaoSerafim3001 - -### `@mui/x-date-pickers@6.0.2` / `@mui/x-date-pickers-pro@6.0.2` - -#### Changes - -- [l10n] Add Hebrew (he-IL) locale (#8222) @ylarom -- [l10n] Improve German (de-DE) locale (#8204) @sebkasanzew -- [l10n] Improve French (fr-FR) locale (#8229) @marvinroger -- [DateRangePicker] Allow overriding `slotProps.textField` (#8201) @LukasTy -- [fields] Fire `onChange` when filling a partial date (#8082) @flaviendelangle -- [fields] Fix editing in shadow dom (#8254) @flaviendelangle -- [fields] Remove the duplicated warning about invalid adapter (#8187) @flaviendelangle -- [fields] Support date format like `1st` (`do`) (#8188) @flaviendelangle -- [pickers] Fix to avoid selecting sections on mobile picker field (#8228) @LukasTy -- [pickers] Inherit previous and next icons size from their parent button (#8218) @flaviendelangle - -### Docs - -- [docs] Add a warning in the migration guide for people re-enabling the clock on desktop (#8184) @flaviendelangle -- [docs] Add a warning for `luxon` macro tokens (#8245) @flaviendelangle -- [docs] Complete pickers customization pages (#8066) @alexfauquette -- [docs] Fix 301 redirection @oliviertassinari -- [docs] Fix 404 links to customization Material UI APIs (#8200) @oliviertassinari -- [docs] Fix `moment-hijri` demo (#8255) @LukasTy -- [docs] Improve migration diff (#8240) @oliviertassinari -- [docs] Change **What's new** page url to point to announcement blog post (#8186) @joserodolfofreitas -- [docs] Resolve 301 in changelog @oliviertassinari - -### Core - -- [core] Regen api docs (#8220) @flaviendelangle -- [core] Remove duplicated `/` (#8223) @alexfauquette - -## 6.0.1 - -_Mar 9, 2023_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve French (fr-FR) locale (#8122) @MaherSamiGMC -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.1` / `@mui/x-data-grid-pro@6.0.1` / `@mui/x-data-grid-premium@6.0.1` - -#### Changes - -- [DataGrid] Fix `MenuProps.onClose` being overridden for single select edit component (#8174) @rohitnatesh -- [DataGrid] Simplify `buildPrintWindow` (#8142) @oliviertassinari -- [l10n] Improve French (fr-FR) locale (#8122) @MaherSamiGMC - -### `@mui/x-date-pickers@6.0.1` / `@mui/x-date-pickers-pro@6.0.1` - -#### Changes - -- [pickers] Add a runtime warning when a `renderInput` prop is passed to a picker (#8183) @flaviendelangle -- [pickers] Don't pass `ownerState` to the `inputAdornment` slot (#8165) @flaviendelangle - -### Docs - -- [docs] Fix a typo in the migration guide (#8152) @flaviendelangle -- [docs] Fix package version used in CodeSandbox demos (#8125) @cherniavskii -- [docs] Fix typos across codebase (#8126) @stavares843 -- [docs] Improve Data Grid quick filter documentation (#8109) @MBilalShafi -- [docs] Improve link from npm to docs (#8141) @oliviertassinari -- [docs] Remove test sections (#8177) @m4theushw - -### Core - -- [core] Upgrade monorepo (#8162) @m4theushw - -## 6.0.0 - -_Mar 3, 2023_ - -We're excited to [announce the first v6 stable release](https://mui.com/blog/mui-x-v6/)! 🎉🚀 - -This is now the officially supported major version, where we'll keep rolling out new features, bug fixes, and improvements. -Migration guides are available with a complete list of the breaking changes: - -- [Data Grid](https://mui.com/x/migration/migration-data-grid-v5/) -- [Date Pickers](https://mui.com/x/migration/migration-pickers-v5/) - -We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 The row pinning is no longer experimental (#8055) @MBilalShafi - - You can now use the row pinning without the `experimentalFeatures.rowPinning` flag enabled. - - ```diff - <DataGridPro - - experimentalFeatures={{ rowPinning: true }} - /> - ``` - -- ⚡️ Improved grid performance by rows and cells memoization (#7846) @m4theushw -- ✨ Fields have a distinct visual state when empty (#8069) @LukasTy -- 🌍 Improve Czech (cs-CZ) locale (#8113) @BlastyCZ -- 🌍 Improve Arabic (ar-SD) locale (#8100) @atf98 -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0` / `@mui/x-data-grid-pro@6.0.0` / `@mui/x-data-grid-premium@6.0.0` - -#### Breaking changes - -- The `componentsProps` and `slotProps` props are now typed for better DX -- The `cellFocus`, `cellTabIndex` and `editRowsState` props are not passed to the component used in the row slot. You can use the new `focusedCell` and `tabbableCell` props instead. For the editing state, use the API methods. - The flag `experimentalFeatures.rowPinning` is no longer needed. - -#### Changes - -- [DataGrid] Add typing for `componentsProps` (#7968) @MBilalShafi -- [DataGrid] Allow multiple modules' augmentation (#8098) @MBilalShafi -- [DataGrid] Extract `BaseInputLabel` slot (#8068) @cherniavskii -- [DataGrid] Extract `BaseSelectOption` slot (#8072) @cherniavskii -- [DataGrid] Make possible to memoize rows and cells (#7846) @m4theushw -- [DataGrid] Register `getLocaleText` synchronously (#8029) @m4theushw -- [DataGrid] Start extracting material slots to a separate directory (#8004) @cherniavskii -- [DataGrid] Use `styled` from system (#8032) @siriwatknp -- [DataGridPro] Improve typing for `getColumnForNewFilter` method (#8043) @MBilalShafi -- [DataGridPro] Remove row pinning from experimental features (#8055) @MBilalShafi -- [l10n] Improve Czech (cs-CZ) locale (#8113) @BlastyCZ -- [l10n] Improve Arabic (ar-SD) locale (#8100) @atf98 - -### `@mui/x-date-pickers@6.0.0` / `@mui/x-date-pickers-pro@6.0.0` - -#### Breaking changes - -On desktop, `DateTimePicker` shows the am/pm controls in the toolbar instead of the clock by default. -It can be overridden by specifying `ampmInClock` prop. - -#### Changes - -- [DateRangePicker] Generalize the highlight between months (#8079) @alexfauquette -- [fields] Clean the order of the tokens in the `formatTokenMap` of each adapter (#8112) @flaviendelangle -- [fields] Implement empty visual state (#8069) @LukasTy -- [fields] Replace `sectionOrder` state with a memoized variable (#8090) @flaviendelangle -- [pickers] Add support for UTC on `moment` adapter (#8031) @flaviendelangle -- [pickers] Document and deprecate `onClose` callback on static pickers (#8021) @LukasTy -- [pickers] Fix am/pm buttons position and responsiveness (#5149) @alexfauquette -- [pickers] Fix layout `sx` propagation (#8064) @alexfauquette -- [pickers] Increase `moment` peer dependency minimum version (#8046) @oliviertassinari -- [pickers] Remove `WrapperVariantContext` (#8088) @LukasTy -- [pickers] Stop using `WrapperVariantContext` in `Clock` (#8083) @LukasTy - -### Docs - -- [docs] Add `aggregation` experimental flag removal to the migration guide (#8056) @MBilalShafi -- [docs] Add expansion state behavioral change to v6 migration guide (#8108) @MBilalShafi -- [docs] Change default date from 4th of April to 17th of April for readability (#8089) @flaviendelangle -- [docs] Clarify the MIT license restriction for grid pagination (#8045) @arunkp -- [docs] Fix typo replacing "bellow" by "below" (#8080) @TheBox193 -- [docs] Link `API object` in the `apiRef` sections (#8106) @MBilalShafi -- [docs] Link to demonstrations in the interfaces API docs (#8028) @cherniavskii -- [docs] Remove the `@next` tag from installation instructions (#8102) @cherniavskii -- [docs] Start enforcing consistency in documentation vocabulary (#6871) @alexfauquette -- [docs] Update accessibility guidelines (#7970) @oliviertassinari -- [docs] Update the DataGrid demo to leverage the latest features (#7863) @joserodolfofreitas -- [docs] Update migration guide for stable release (#8092) @joserodolfofreitas - -### Core - -- [core] Add modified docs page links in the PR (#7848) @alexfauquette -- [core] Add test on value timezone (#7867) @alexfauquette -- [core] Bump monorepo (#8006) @LukasTy -- [core] Change default branch back to `master` (#8081) @m4theushw -- [core] Upgrade monorepo (#8115) @MBilalShafi -- [core] Mention the use of Support key as an alternative to the OrderID (#6968) @joserodolfofreitas -- [test] Fix flaky tests (#8097) @cherniavskii - -## 6.0.0-beta.5 - -_Feb 23, 2023_ - -We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: - -- ⚡️ Add web worker support for Excel export (#7770) @m4theushw -- 🎁 Add a button to remove all filters on the data grid filter panel (#7326) @MBilalShafi -- ⚙️ Allow to customize options label and value in the data grid `singleSelect` column (#7684) @m4theushw -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-beta.5` / `@mui/x-data-grid-pro@6.0.0-beta.5` / `@mui/x-data-grid-premium@6.0.0-beta.5` - -#### Changes - -- [DataGrid] Allow to customize label and value for `singleSelect` (#7684) @m4theushw -- [DataGrid] Fix `ownerState` being `undefined` in theme style overrides (#7964) @lolaignatova -- [DataGrid] Introduce `slots` and deprecate `components` (#7882) @MBilalShafi -- [DataGridPro] Add `Remove All` option in filter panel (#7326) @MBilalShafi -- [DataGridPremium] Add web worker support for Excel export (#7770) @m4theushw - -### `@mui/x-date-pickers@6.0.0-beta.5` / `@mui/x-date-pickers-pro@6.0.0-beta.5` - -#### Breaking changes - -- The `MuiDateSectionName` type was renamed to `FieldSectionType` - -#### Changes - -- [fields] Fix multi input range fields validation when uncontrolled (#8002) @LukasTy -- [fields] Fix single input time range fields slot props (#7988) @LukasTy -- [fields] Make the `ArrowUp` / `ArrowDown` edition only impact the active section (#7993) @flaviendelangle -- [fields] Fix single input range fields clearing (#7995) @flaviendelangle -- [fields] Clean the section object (#8009) @flaviendelangle -- [pickers] Fix `textField` slot `error` prop propagation (#7987) @LukasTy - -### `@mui/x-codemod@6.0.0-beta.5` - -#### Changes - -- [codemod] Add `apiRef.current.getRowIndex` to `DataGrid` renaming codemod (#8001) @MBilalShafi - -### Docs - -- [docs] Fine tune range fields demos (#7992) @LukasTy -- [docs] Fix a few scroll issues on mobile (#7900) @oliviertassinari -- [docs] Fix inconsistency in the data grid migration guide (#7963) @MBilalShafi - -### Core - -- [core] Fix `moment` locale on adapter tests (#8020) @flaviendelangle -- [test] Support all adapters on the field tests about the formats (#7996) @flaviendelangle - -## 6.0.0-beta.4 - -_Feb 16, 2023_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- ⚡️ Improve grid performance by reducing rerenders (#7857) @cherniavskii -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-beta.4` / `@mui/x-data-grid-pro@6.0.0-beta.4` / `@mui/x-data-grid-premium@6.0.0-beta.4` - -#### Changes - -- [DataGrid] Add interface for `singleSelect` column (#7685) @m4theushw -- [DataGrid] Allow to pass props to the `FocusTrap` inside the panel wrapper (#7733) @ivek-Prajapatii -- [DataGrid] Avoid unnecessary rerenders after `updateRows` (#7857) @cherniavskii -- [DataGridPro] Change cursor when dragging a column (#7725) @sai6855 -- [DataGridPremium] Fix `leafField` to have correct focus value (#7950) @MBilalShafi - -### `@mui/x-date-pickers@6.0.0-beta.4` / `@mui/x-date-pickers-pro@6.0.0-beta.4` - -#### Changes - -- [DateRangePicker] Fix slide transition by avoiding useless component re-rendering (#7874) @LukasTy -- [fields] Support Backspace key on `Android` (#7842) @flaviendelangle -- [fields] Support escaped characters on `Luxon` (#7888) @flaviendelangle -- [pickers] Prepare new pickers for custom fields (#7806) @flaviendelangle - -### `@mui/x-codemod@6.0.0-beta.4` - -#### Changes - -- [codemod] Fix import path (#7952) @LukasTy - -### Docs - -- [docs] Add an info callout specifying the current state of desktop time view (#7933) @LukasTy -- [docs] Add missing param in `useGridApiEventHandler` examples (#7939) @flaviendelangle -- [docs] Fix markdown table alignments (#7898) @oliviertassinari -- [docs] Improve `DataGrid` migration guide (#7861) @MBilalShafi -- [docs] Update `LocalizationProvider` `dateAdapter` with a link to the doc (#7872) @LukasTy - -### Core - -- [core] Run editing field tests on all major adapters (#7868) @flaviendelangle - -## 6.0.0-beta.3 - -_Feb 9, 2023_ - -We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: - -- ⬅️ Add right-to-left support for the data grid (#6580) @yaredtsy -- ⚡️ Improve grid resize performance (#7864) @cherniavskii -- ✨ New codemods for migrating to v6 @MBilalShafi -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-beta.3` / `@mui/x-data-grid-pro@6.0.0-beta.3` / `@mui/x-data-grid-premium@6.0.0-beta.3` - -#### Changes - -- [DataGrid] Add `BaseIconButton` component slot (#7329) @123joshuawu -- [DataGrid] Allow to customize the value displayed in the filter button tooltip (#6956) @ithrforu -- [DataGrid] Improve grid resize performance (#7864) @cherniavskii -- [DataGrid] Make `apiRef.current.getRowWithUpdatedValues` stable (#7788) @m4theushw -- [DataGrid] Support RTL (#6580) @yaredtsy -- [DataGrid] Improve query selectors for selecting cell element (#7354) @yaredtsy -- [l10n] Improve Brazilian Portuguese (pt-BR) locale (#7854) @ed-ateixeira - -### `@mui/x-date-pickers@6.0.0-beta.3` / `@mui/x-date-pickers-pro@6.0.0-beta.3` - -#### Changes - -- [fields] Allow to select year 2000 on 2-digit year section (#7858) @flaviendelangle -- [fields] Fix year editing on `day.js` (#7862) @flaviendelangle -- [fields] Fix year editing on valid date (#7834) @flaviendelangle -- [fields] Reset query when pressing `Backspace` or `Delete` (#7855) @flaviendelangle -- [pickers] Clean Popper position on new pickers (#7445) @flaviendelangle -- [pickers] Ditch pickers `skipLibCheck` (#7808) @LukasTy -- [pickers] Improve JSDoc and resulting API docs pages (#7847) @LukasTy - -### `@mui/x-codemod@6.0.0-beta.3` - -#### Changes - -- [codemod] Add more cases to `rename-selectors-and-events` codemod (#7856) @MBilalShafi -- [codemod] Add warning message to the codemods and migration guide (#7813) @MBilalShafi -- [codemod] Add codemod to remove unnecessary `experimentalFeatures` flag (#7836) @MBilalShafi -- [codemod] Rename `GridFilterItem` props (#7483) @MBilalShafi -- [codemod] Rename `linkOperators` to `logicOperators` (#7707) @MBilalShafi -- [codemod] Replace `onCellFocusOut` prop for Data Grid (#7786) @MBilalShafi - -### Docs - -- [docs] Add a "Whats new in v6" page linked on the sidebar (#7820) @joserodolfofreitas -- [docs] Fix hydration crash in pickers (#7734) @oliviertassinari -- [docs] Remove no longer relevant range shortcuts section (#7840) @LukasTy -- [docs] Use `@next` tag in grid and pickers installation instructions (#7814) @cherniavskii - -### Core - -- [core] Remove `tslint` package leftovers (#7841) @LukasTy -- [test] Use `createDescribes` for `describeValue` and `describeValidation` (#7866) @flaviendelangle - -## 6.0.0-beta.2 - -We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Support week day formats in the field components -- 🌍 Add Hungarian (hu-HU) and Urdu (ur-PK) locales -- 🌍 Improve French (fr-FR) and Italian (it-IT) locales -- ✨ New codemods for migrating to v6 -- 📚 Documentation improvements -- 🐞 Bug fixes - -### `@mui/x-data-grid@6.0.0-beta.2` / `@mui/x-data-grid-pro@6.0.0-beta.2` / `@mui/x-data-grid-premium@6.0.0-beta.2` - -#### Changes - -- [DataGrid] Handle non-numeric values returned by `getRowHeight` prop (#7703) @cherniavskii -- [DataGrid] Merge row styles with `componentsProps.row.style` (#7641) @marktoman -- [l10n] Add Hungarian (hu-HU) locale (#7776) @noherczeg -- [l10n] Add Urdu (ur-PK) locale (#6866) @MBilalShafi -- [l10n] Improve French (fr-FR) locale (#7777) @ivek-Prajapatii -- [l10n] Improve Italian (it-IT) locale (#7761) @simonecervini - -### `@mui/x-date-pickers@6.0.0-beta.2` / `@mui/x-date-pickers-pro@6.0.0-beta.2` - -#### Changes - -- [fields] Support week day formats (#7392) @flaviendelangle -- [pickers] Allow to initialize and control the `rangePosition` on all range components (#7764) @flaviendelangle -- [pickers] Fix theme augmentation (#7800) @LukasTy -- [pickers] Hide scrollbars in the date calendar container (#7766) @ivek-Prajapatii -- [pickers] Remove the dependency on `rifm` (#7785) @alexfauquette - -### `@mui/x-codemod@6.0.0-beta.2` - -#### Changes - -- [codemod] Add pickers `rename-default-toolbar-title-localeText` codemod (#7752) @LukasTy -- [codemod] Add pickers `rename-inputFormat-prop` codemod (#7736) @LukasTy - -### Docs - -- [docs] Fix a typo in data grid layout page (#7113) @sfbaker7 -- [docs] Fix require context path to avoid duplicate key creation (#7781) @LukasTy -- [docs] Polish pickers migration docs (#7737) @LukasTy -- [docs] Rename `next` translation docs and remove duplicates with `-next` (#7729) @LukasTy - -### Core - -- [core] Fix l10n data file (#7804) @flaviendelangle -- [core] Fix Next.js warning (#7754) @oliviertassinari -- [core] Remove unused demos (#7758) @flaviendelangle - -## 6.0.0-beta.1 - -_Jan 27, 2023_ - -We'd like to offer a big thanks to the 17 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 New shortcuts component for the date pickers (#7154) @alexfauquette -- 🌍 Add Belarusian (be-BY), Czech (cs-CZ) and Russian (ru-RU) locales -- 🌍 Improve Spanish (es-ES), Japanese (ja-JP), Slovak (sk-SK), and Vietnamese (vi-VN) locales -- ✨ New codemods for migrating to v6 -- 📚 Documentation improvements -- 🐞 Bug fixes - -### `@mui/x-data-grid@6.0.0-beta.1` / `@mui/x-data-grid-pro@6.0.0-beta.1` / `@mui/x-data-grid-premium@6.0.0-beta.1` - -#### Changes - -- [DataGrid] Add `title` attribute to cells (#7682) @thupi -- [DataGrid] Fix `autoHeight` not working properly inside of a flex container (#7701) @cherniavskii -- [DataGrid] Fix grid state not being updated after print preview is closed (#7642) @cherniavskii -- [DataGrid] Fix non-hideable columns visibility toggling (#7637) @cherniavskii -- [DataGrid] Fix scrolling on resize for data grids inside shadow root (#7298) @akiradev -- [l10n] Add Slovak (sk-SK) translation for aggregation functions (#7702) @msidlo -- [l10n] Add missing core locales for `MuiTablePagination` (#7717) @MBilalShafi -- [l10n] Improve Spanish (es-ES) and Vietnamese (vi-VN) locale (#7634) @WiXSL and @SpacerZ -- [l10n] Add Belarusian (be-BY) locale (#7646) @olhalink - -### `@mui/x-date-pickers@6.0.0-beta.1` / `@mui/x-date-pickers-pro@6.0.0-beta.1` - -#### Changes - -- [pickers] Fix `aria-labelledby` assignment to dialog (#7608) @LukasTy -- [pickers] Support `UTC` with `dayjs` (#7610) @flaviendelangle -- [pickers] Update focus when opening a UI view (#7620) @alexfauquette -- [DateRangePickers] Add shortcuts component (#7154) @alexfauquette -- [l10n] Add Czech (cs-CZ) locale (#7645) @OndrejHj04 -- [l10n] Add Russian (ru-RU) locale (#7706) @rstmzh -- [l10n] Improve Japanese (ja-JP) locale (#7624) @makoto14 - -### `@mui/x-codemod@6.0.0-beta.1` - -#### Changes - -- [codemod] Add pickers `replace-toolbar-props-by-slot` codemod (#7687) @alexfauquette -- [codemod] Add `GridColumnMenuItemProps` to `column-menu-components-rename` codemod (#7710) @MBilalShafi -- [codemod] Add `headerHeight` prop update to `row-selection-props-rename` codemod (#7711) @MBilalShafi -- [codemod] Add pickers codemod for `components` to `slots` renaming (#7533) @alexfauquette -- [codemod] Add pickers `migrate-to-components-componentsProps` and `replace-arrows-button-slot` codemods (#7698) @alexfauquette -- [codemod] Add data grid codemod renaming `rowsPerPageOptions` prop to `pageSizeOptions` (#7603) @MBilalShafi -- [codemod] Add pickers `rename-should-disable-time` codemod (#7709) @alexfauquette -- [codemod] Add data grid `row-selection-props-rename` codemod (#7485) @MBilalShafi -- [codemod] Add data grid `rename-selectors-and-events` codemod (#7699) @MBilalShafi -- [codemod] Add pickers `replace-tabs-props` codemod (#7639) @alexfauquette - -### Docs - -- [docs] Add info callout about available component `slots` (#7714) @ivek-Prajapatii -- [docs] Add recipe for pinning grouped column (#7712) @MBilalShafi -- [docs] Fix 404 links to picker API page @oliviertassinari -- [docs] Update `DemoContainer` `components` prop using a codemod (#7574) @alexfauquette - -### Core - -- [core] Fix `innerslotProps` typo (#7697) @LukasTy -- [core] Upgrade monorepo (#7676) @cherniavskii - -## 6.0.0-beta.0 - -_Jan 19, 2023_ - -After a long period in alpha, we're glad to announce the first MUI X v6 beta! -We encourage you to try out this version, packed with improvements, bug fixes, and a few highlighted features ✨: - -**Data Grid** - -- [Access to the API Object in the community version](https://mui.com/x/react-data-grid/api-object/) -- [Improved column menu](https://mui.com/x/react-data-grid/column-menu/) -- [Cell selection range](https://mui.com/x/react-data-grid/cell-selection/) (Premium) - -**Date and Time pickers** - -- [Fields: the new default input for pickers](https://mui.com/x/react-date-pickers/fields/). -- [Improved layout customization](https://mui.com/x/react-date-pickers/custom-layout/) -- [Edit date ranges with drag and drop](https://mui.com/x/react-date-pickers/date-range-calendar/) (Pro) - -You can check the migration guides for the [Data Grid](https://mui.com/x/migration/migration-data-grid-v5/) and [Date Pickers](https://mui.com/x/migration/migration-pickers-v5/) in the documentation. - -We'd like to offer a big thanks to the 10 contributors who made this release possible. - -- ✨ Merge `page` and `pageSize` props into `paginationModel` -- 🚀 Replace old masked picker components with field based ones -- 🌍 Improve Swedish (sv-SE) and Italian (it-IT) locales -- 📚 Documentation improvements -- 🐞 Bug fixes - -### `@mui/x-data-grid@6.0.0-beta.0` / `@mui/x-data-grid-pro@6.0.0-beta.0` / `@mui/x-data-grid-premium@6.0.0-beta.0` - -#### Breaking changes - -- The `disableExtendRowFullWidth` prop was removed. - Use `showCellVerticalBorder` or `showColumnVerticalBorder` props to show or hide right border for cells and header cells respectively. - -- The `GridCellIdentifier` type was removed. Use `GridCellCoordinates` instead. - -- The `singleSelect` column type now has a default value formatter that returns the `label` corresponding to the selected value when `valueOptions` is an array of objects. - As consequence, any existing value formatter will not be applied to the individual options anymore, but only to the text of the cell. - It is recommended to migrate `valueOptions` to an array of objects to be able to add a custom label for each value. - To override the label used for each option when the cell is in edit mode or in the filter panel, the following components now support a `getOptionLabel` prop. - This prop accepts a callback that is called with the item from `valueOptions` and must return the new label. - - - `GridEditSingleSelectCell` - - `GridFilterInputSingleSelect` - - `GridFilterInputMultipleSingleSelect` - -- The `getGridSingleSelectQuickFilterFn` function was removed. - You can copy the old function and pass it to the `getApplyQuickFilterFn` property of the `singleSelect` column definition. - -- The `page` and `pageSize` props and their respective event handlers `onPageChange` and `onPageSizeChange` were removed. - Use `paginationModel` and `onPaginationModelChange` instead. - - ```diff - <DataGrid - rows={rows} - columns={columns} - - page={page} - - pageSize={pageSize} - - onPageChange={handlePageChange} - - onPageSizeChange={handlePageSizeChange} - + paginationModel={{ page, pageSize }} - + onPaginationModelChange={handlePaginationModelChange} - /> - ``` - -- The properties `initialState.pagination.page` and `initialState.pagination.pageSize` were also removed. - Use `initialState.pagination.paginationModel` instead. - - ```diff - -initialState={{ pagination: { page: 1, pageSize: 10 } }} - +initialState={{ pagination: { paginationModel: { page: 1, pageSize: 10 } } }} - ``` - -- The `rowsPerPageOptions` prop was renamed to `pageSizeOptions`. - - ```diff - -<DataGrid rowsPerPageOptions={[10, 20, 50]} /> - +<DataGrid pageSizeOptions={[10, 20, 50]} /> - ``` - -- The `error` and `onError` props were removed - the grid no longer catches errors during rendering. - To catch errors that happen during rendering use the [error boundary](https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary). - -- The `components.ErrorOverlay` slot was removed. - -- The `GridErrorOverlay` component was removed. - -- The `componentError` event was removed. - Use the [error boundary](https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary) to catch errors thrown during rendering. - -- The `apiRef.current.showError` method was removed. - The UI for errors is no longer handled by the grid. - -- The `date` and `dateTime` columns now only support `Date` objects as values. - To parse a string value, use the [`valueGetter`](https://mui.com/x/react-data-grid/column-definition/#value-getter): - - ```tsx - <DataGrid - columns={[ - { - field: 'date', - type: 'date', - valueGetter: (params) => new Date(params.value), - }, - ]} - /> - ``` - -- The following selectors have been renamed: - - - `gridVisibleSortedRowIdsSelector` renamed to `gridExpandedSortedRowIdsSelector` - - `gridVisibleSortedRowEntriesSelector` renamed to `gridExpandedSortedRowEntriesSelector` - - `gridVisibleRowCountSelector` renamed to `gridExpandedRowCountSelector` - - `gridVisibleSortedTopLevelRowEntriesSelector` renamed to `gridFilteredSortedTopLevelRowEntriesSelector` - - `gridVisibleTopLevelRowCountSelector` renamed to `gridFilteredTopLevelRowCountSelector` - -- The `apiRef.current.getVisibleRowModels` method was removed. Use the `gridVisibleSortedRowEntriesSelector` selector instead. - -- The `GridRowScrollEndParams["virtualRowsCount"]` parameter was renamed to `GridRowScrollEndParams["visibleRowsCount"]`. - -#### Changes - -- [DataGrid] Add default value formatter to `singleSelect` (#7290) @m4theushw -- [DataGrid] Fix flickering on grid scroll (#7549) @cherniavskii -- [DataGrid] Merge `page` and `pageSize` props into `paginationModel` (#7147) @MBilalShafi -- [DataGrid] Only support `Date` as value in `date` and `dateTime` column types (#7594) @cherniavskii -- [DataGrid] Remove error boundary (#7579) @cherniavskii -- [DataGrid] Remove `GridCellIdentifier` redundant type (#7578) @MBilalShafi -- [DataGrid] Remove `disableExtendRowFullWidth` prop (#7373) @MBilalShafi -- [DataGrid] Remove tag limit from `isAnyOf` operator input (#7592) @m4theushw -- [DataGrid] Use v6 terminology (#7473) @DanailH -- [DataGridPremium] Keep focus on first selected cell (#7482) @m4theushw -- [l10n] Update Swedish (sv-SE) locale (#7585) @MaanTyringe - -### `@mui/x-date-pickers@6.0.0-beta.0` / `@mui/x-date-pickers-pro@6.0.0-beta.0` - -#### Breaking changes - -- The `showToolbar` prop has been moved to the `toolbar` component slot props: - - ```diff - <DatePicker - - showToolbar - + slotProps={{ - + toolbar: { - + hidden: false, - + } - + }} - /> - ``` - -- The new pickers have replaced the legacy one. - - If you were using the new pickers with their temporary name, you just have to change your imports. - - ```diff - -import { Unstable_NextDatePicker as NextDatePicker } from '@mui/x-date-pickers/NextDatePicker'; - +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; - -import { Unstable_DesktopNextDatePicker as DesktopNextDatePicker } from '@mui/x-date-pickers/DesktopNextDatePicker'; - +import { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker'; - - // Same for all the other pickers with an `Unstable_` prefix - ``` - - If you were still using the legacy picker (`DatePicker`, `DesktopDatePicker`, ...), please take a look at our [migration guide](https://mui.com/x/migration/migration-pickers-v5/#picker-components) for detailed explanations on how to start using the new ones. - -- The fields components are no longer unstable - - ```diff - -import { Unstable_DateField as DateField } from '@mui/x-date-pickers/DateField'; - +import { DateField } from '@mui/x-date-pickers/DateField'; - ``` - -#### Changes - -- [DateRangeCalendar] Ignore `calendars` prop on mobile (#7526) @flaviendelangle -- [DateRangeCalendar] Ignore `showDaysOutsideCurrentMonth` when `calendars > 1` (#7529) @flaviendelangle -- [DateRangePicker] Propagate `rangePosition` to view (#7602) @LukasTy -- [fields] Fix upper boundary on 12-hours sections (#7618) @flaviendelangle -- [fields] Publish value when cleaning the last section of a date (#7519) @flaviendelangle -- [fields] Remove the `Unstable_` prefix for field components (#7185) @flaviendelangle -- [pickers] Add missing `slots` and `slotProps` on the date range view renderer (#7586) @flaviendelangle -- [pickers] Drop legacy pickers (#7545) @flaviendelangle -- [pickers] Fix day calendar row and column index (#7589) @LukasTy -- [pickers] Go to the default view when opening a picker (#7484) @flaviendelangle -- [pickers] Make sure the `className` and `sx` props are applied to the field / static root of the picker and never to the view (#7600) @flaviendelangle -- [pickers] Rename new pickers (#7575) @flaviendelangle -- [pickers] Rename remaining `components` and `componentSlots` references (#7576) @LukasTy -- [pickers] Replace `showToolbar` with toolbar slot `hidden` prop (#7498) @LukasTy -- [pickers] Spread props to the DOM in `DateCalendar` and `TimeClock` (#7587) @flaviendelangle -- [pickers] Stop using the `WrapperVariantContext` in `DateRangeCalendar` (#7488) @flaviendelangle -- [l10n] Improve Italian (it-IT) locale (#7582) @marikadeveloper - -### `@mui/x-codemod@6.0.0-beta.0` - -#### Changes - -- [codemod] Remove `disableExtendRowFullWidth` prop (#7508) @MBilalShafi - -### Docs - -- [docs] Clean-up the `field components` page (#7605) @flaviendelangle -- [docs] List all pickers toolbar pages in api docs side menu (#7577) @LukasTy -- [docs] Remove "Flex layout" docs section and demo (#7477) @cherniavskii -- [docs] Rework the pickers "Getting Started" page (#7140) @flaviendelangle - -### Core - -- [core] Add missing `status: needs triage` label on RFC @oliviertassinari -- [core] Add release documentation step detailing `x-codemod` package tag change (#7617) @LukasTy -- [core] Fix typo in `CHANGELOG` (#7611) @flaviendelangle -- [test] Fix date range picker tests to work with western time zones (#7581) @m4theushw - -## 6.0.0-alpha.15 - -_Jan 13, 2023_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Support components and slots for new pickers (#7390) @alexfauquette -- ✨ Update `onColumnOrderChange` behavior to match `onRowsOrderChange` (#7385) @DanailH -- 🌍 Improve Spanish (es-ES) and Belarusian (be-BY) locales -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.15` / `@mui/x-data-grid-pro@6.0.0-alpha.15` / `@mui/x-data-grid-premium@6.0.0-alpha.15` - -#### Breaking changes - -- Remove the `onCellFocusOut` prop (#6302) @cherniavskii - - The `onCellFocusOut` prop was removed. Use `componentsProps.cell.onBlur` instead: - - ```tsx - <DataGrid - componentsProps={{ - cell: { - onBlur: (event) => { - const cellElement = event.currentTarget; - const field = cellElement.getAttribute('data-field'); - const rowId = cell.parentElement.getAttribute('data-id'); - }, - }, - }} - /> - ``` - -- [DataGrid] Stop exporting editing selector (#7456) @m4theushw - - The `gridEditRowsStateSelector` selector was removed. - -- [DataGrid] Rework column headers and virtual scroller positioning (#7001) @cherniavskii - - The `headerHeight` prop was renamed to `columnHeaderHeight`. - -- [DataGrid] Remove the `columnTypes` prop (#7309) @cherniavskii - - The `columnTypes` prop was removed. For custom column types see [Custom column types](https://mui.com/x/react-data-grid/column-definition/#custom-column-types) docs. - -- [DataGrid] Rename `linkOperators` to `logicOperators` (#7310) @cherniavskii - - The `apiRef.current.setFilterLinkOperator` method was renamed to `apiRef.current.setFilterLogicOperator`. - The `GridLinkOperator` enum was renamed to `GridLogicOperator`. - The `GridFilterModel['linkOperator']` was renamed to `GridFilterModel['logicOperator']`. - The `linkOperators` prop of `GridFilterForm` and `GridFilterPanel` components was renamed to `logicOperators`. - The `linkOperatorInputProps` prop of `GridFilterForm` component was renamed to `logicOperatorInputProps`. - The `filterFormProps.linkOperatorInputProps` prop in `GridFilterForm` component was renamed to `filterFormProps.logicOperatorInputProps`. - The `GridLocaleText['filterPanelLinkOperator']` property was renamed to `GridLocaleText['filterPanelLogicOperator']`. - The `.MuiDataGrid-filterFormLinkOperatorInput`CSS class was renamed to `.MuiDataGrid-filterFormLogicOperatorInput`. - -- [DataGrid] Remove `Alt+C` keyboard shortcut (#7466) @MBilalShafi - - <kbd>Alt</kbd> (or <kbd>⌥ Option</kbd>) + <kbd>C</kbd> keyboard shortcut is no longer supported. - -#### Changes - -- [DataGrid] Fix <kbd>Tab</kbd> between portaled and non-portaled edit components (#7098) @m4theushw -- [DataGrid] Remove the `columnTypes` prop (#7309) @cherniavskii -- [DataGrid] Remove the `onCellFocusOut` prop (#6302) @cherniavskii -- [DataGrid] Rename `linkOperators` to `logicOperators` (#7310) @cherniavskii -- [DataGrid] Rework column headers and virtual scroller positioning (#7001) @cherniavskii -- [DataGrid] Stop exporting editing selector (#7456) @m4theushw -- [DataGrid] Update `onColumnOrderChange` behavior to match `onRowsOrderChange` (#7385) @DanailH -- [DataGrid] Improve Spanish (es-ES) locale (#7447) @Anderssxn -- [DataGrid] Remove Alt+C keyboard shortcut (#7466) @MBilalShafi -- [DataGridPremium] Fix Excel export not working with date strings (#7396) @cherniavskii - -### `@mui/x-date-pickers@6.0.0-alpha.15` / `@mui/x-date-pickers-pro@6.0.0-alpha.15` - -#### Breaking changes - -- [pickers] Stop using the `WrapperVariantContext` in `MonthCalendar` and `YearCalendar` (#7382) @flaviendelangle - - The `modeMobile` and `modeDesktop` classes have been removed from the `PickersMonth` and `PickersYear` internal components. - - If you were using those classes on responsive components, - you can import `DEFAULT_DESKTOP_MODE_MEDIA_QUERY` from `@mui/x-date-pickers` or `@mui/x-date-pickers-pro` (or use your custom media query if any): - - ```diff - <GlobalStyles - styles={{ - - [`.${pickersYearClasses.modeDesktop}`]: { - - backgroundColor: 'red' - - } - + [DEFAULT_DESKTOP_MODE_MEDIA_QUERY]: { - + [`.${pickersYearClasses.root}`]: { - + backgroundColor: 'red' - + } - + } - - [`.${pickersYearClasses.modeMobile}`]: { - - backgroundColor: 'red' - - } - + [DEFAULT_DESKTOP_MODE_MEDIA_QUERY.replace('@media', '@media not')]: { - + [`.${pickersYearClasses.root}`]: { - + backgroundColor: 'red' - + } - + } - }} - /> - ``` - - Works exactly the same way for `PickersMonth`. - -- [pickers] Refactor `shouldDisableTime` (#7299) @LukasTy - - The `shouldDisableTime` prop signature has been changed. Either rename the prop usage to `shouldDisableClock` or refactor usage. - - ```diff - <DateTimePicker - - shouldDisableTime={(timeValue, view) => view === 'hours' && timeValue < 12} - + shouldDisableClock={(timeValue, view) => view === 'hours' && timeValue < 12} - /> - ``` - - ```diff - <DateTimePicker - - shouldDisableTime={(timeValue, view) => view === 'hours' && timeValue < 12} - + shouldDisableTime={(value, view) => view === 'hours' && value.hour() < 12} - /> - ``` - -#### Changes - -- [fields] Fix Android editing (#7444) @flaviendelangle -- [pickers] Add Belarusian (be-BY) locale (#7395) @olhalink -- [pickers] Hide am/pm controls when there is no hour view (#7380) @flaviendelangle -- [pickers] Hide the tabs by default on `DesktopNextDateTimePicker` (#7503) @flaviendelangle -- [pickers] Refactor `shouldDisableTime` (#7299) @LukasTy -- [pickers] Remove `WrapperVariantContext` from `DateTimePickerTabs` (#7374) @LukasTy -- [pickers] Stop using the `WrapperVariantContext` in `MonthCalendar` and `YearCalendar` (#7382) @flaviendelangle -- [pickers] Support `components` and `slots` for new pickers (#7390) @alexfauquette -- [pickers] Replace `slotsProps` by `slotProps` (#7528) @alexfauquette - -### Docs - -- [docs] Fix codesandboxes using `DemoContainer` (#7388) @LukasTy -- [docs] Fix wrong reference to currentView (#7441) @oliviertassinari -- [docs] New page for `DateRangeCalendar` (#7378) @flaviendelangle -- [docs] Update the migration guide with the breaking changes between the legacy and the new pickers (#7345) @flaviendelangle -- [docs] Use new pickers on "Custom components" demos (#7194) @flaviendelangle - -### Core - -- [core] Handle selection edge case (#7350) @oliviertassinari -- [core] Improve license message @oliviertassinari -- [core] Move default `closeOnSelect` to prop definition in `usePickerValue` (#7459) @flaviendelangle -- [core] Move interfaces of UI views to dedicated files (#7458) @flaviendelangle -- [core] Update package used to import LicenseInfo (#7442) @oliviertassinari -- [test] Add a few inheritComponent (#7352) @oliviertassinari - -## 6.0.0-alpha.14 - -_Jan 5, 2023_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- 📆 Add `SingleInputTimeRangeField` and `SingleInputDateTimeRangeField` components (#7186) @alexfauquette -- 🚀 Use grid for modifying pickers layout (#6900) @alexfauquette -- ✨ Improve field components editing experience (#7272) @flaviendelangle -- 💻 Multiple codemods -- 📚 Many documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.14` / `@mui/x-data-grid-pro@6.0.0-alpha.14` / `@mui/x-data-grid-premium@6.0.0-alpha.14` - -#### Breaking changes - -- [DataGrid] Set default `GridCellParams['value']` type to `unknown` (#6959) @cherniavskii - - The default type of `GridCellParams['value']` was changed from `any` to `unknown`. - -#### Changes - -- [DataGrid] Fix flickering on mount (#7205) @cherniavskii -- [DataGrid] Fix selected text in cell input not being copied in Firefox (#6593) @cherniavskii -- [DataGrid] Invert generic parameters order (#6874) @DanailH -- [DataGrid] Remove legacy logic for `singleSelect` inside `GridFilterInputValue` (#7386) @m4theushw -- [DataGrid] Remove remaining props from legacy editing API (#7381) @m4theushw -- [DataGrid] Set default `GridCellParams['value']` type to `unknown` (#6959) @cherniavskii - -### `@mui/x-date-pickers@6.0.0-alpha.14` / `@mui/x-date-pickers-pro@6.0.0-alpha.14` - -#### Breaking changes - -- [fields] Rename the `input` slot of the fields to `textField` to avoid confusion (#7369) @flaviendelangle - -#### Changes - -- [fields] Add `SingleInputTimeRangeField` and `SingleInputDateTimeRangeField` components (#7186) @alexfauquette -- [fields] Improve editing (automatic section switch, allow letter editing in digit section, allow numeric editing in letter section) (#7272) @flaviendelangle -- [fields] Rename the `input` slot of the fields to `textField` to avoid confusion (#7369) @flaviendelangle -- [fields] Prevent date change on `TimeField` arrow edition (#7383) @flaviendelangle -- [pickers] Clean some JSDoc descriptions (#7384) @flaviendelangle -- [pickers] Remove redundant `variants` in theme augmentation (#7356) @LukasTy -- [pickers] Remove the `PaperContent` slot from the new pickers (#7342) @flaviendelangle -- [pickers] Use grid for modifying the layout (#6900) @alexfauquette - -### `@mui/x-codemod@6.0.0-alpha.14` - -#### Changes - -- [codemod] Add new codemod for adapter import (#7348) @flaviendelangle -- [codemod] Add new codemod for the value prop renaming on the view components (#7338) @flaviendelangle -- [codemod] Reorganize codemods and add rename column menu components codemod (#7368) @MBilalShafi - -### Docs - -- [docs] Add example to add back the mobile keyboard view (#7347) @flaviendelangle -- [docs] Cleanup the doc pages of the community pickers (#7339) @flaviendelangle -- [docs] Drop security fixes support for v4 (#7322) @oliviertassinari -- [docs] Fix `disablePast` and `disableFuture` definition swap (#7324) @alexfauquette -- [docs] Hide ad for paid docs pages (#7321) @oliviertassinari -- [docs] New page for `TimeClock` (#7280) @flaviendelangle -- [docs] Note the pickers breaking changes supported by the codemod (#7337) @flaviendelangle -- [docs] Redirect translated pages (#7341) @cherniavskii -- [docs] Reorganize v6 pickers migration guide (#7257) @flaviendelangle - -### Core - -- [core] Apply eslint rule for React component @oliviertassinari -- [core] Apply title capitalization convention @oliviertassinari -- [core] Fix the product license reference name (#7367) @oliviertassinari -- [core] Order the slots alphabetically in the JSON files (#7349) @flaviendelangle -- [core] Remove blanklines in `_redirects` @oliviertassinari -- [core] Remove dead prettier config @oliviertassinari -- [core] Sync back with the mono repo (#7351) @oliviertassinari -- [core] Sync monorepo, fix layout scrollbar @oliviertassinari -- [core] Upgrade monorepo (#7307) @LukasTy - -## 6.0.0-alpha.13 - -_Dec 24, 2022_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 New column menu design and API -- 🌍 Improve Russian (ru-RU) and Korean (ko-KR) locales -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.13` / `@mui/x-data-grid-pro@6.0.0-alpha.13` / `@mui/x-data-grid-premium@6.0.0-alpha.13` - -#### Breaking changes - -- New column menu design and API (#6619) MBilalShafi - - The `currentColumn` prop passed to `components.ColumnMenu` was renamed to `colDef`. - The `column` prop passed to the items of the column menu was renamed to `colDef`. - The `DATA_GRID_DEFAULT_SLOTS_COMPONENTS` export has been removed. - The following components and interfaces were been renamed for consistency: - - **Community Package:** - - ```diff - -<GridFilterMenuItem /> - +<GridColumnMenuFilterItem /> - ``` - - ```diff - -<HideGridColMenuItem /> - +<GridColumnMenuHideItem /> - ``` - - ```diff - -<GridColumnsMenuItem /> - +<GridColumnMenuColumnsItem /> - ``` - - ```diff - -<SortGridMenuItems /> - +<GridColumnMenuSortItem /> - ``` - - ```diff - -interface GridFilterItemProps - +interface GridColumnMenuItemProps - ``` - - **Pro package:** - - ```diff - -<GridColumnPinningMenuItems /> - +<GridColumnMenuPinningItem /> - ``` - - **Premium package:** - - ```diff - -<GridAggregationColumnMenuItem /> - +<GridColumnMenuAggregationItem /> - ``` - - ```diff - -<GridRowGroupingColumnMenuItems /> - -<GridRowGroupableColumnMenuItems /> - +<GridColumnMenuGroupingItem /> - ``` - -- Improve column definition typing (#7224) @cherniavskii - - The `GridColumns` type was removed. Use `GridColDef[]` instead. - The `GridActionsColDef` interface was removed. Use `GridColDef` instead. - The `GridEnrichedColDef` type was removed. Use `GridColDef` instead. - The `GridStateColDef` type was removed. - - If you use it to type `searchPredicate`, use `GridColumnsPanelProps['searchPredicate']` instead. - If you use it to type `getApplyFilterFn`, `GridFilterOperator['getApplyFilterFn']` can be used as replacement. - -- Remove GridDensityType enum (#7304) @cherniavskii - - The `GridDensityTypes` enum was removed. Use `GridDensity` type instead. - -#### Changes - -- [DataGrid] Allow disabling of buttons in column panel (#6947) @MBilalShafi -- [DataGrid] Improve column definition typing (#7224) @cherniavskii -- [DataGrid] Improve column menu design and API (#6619) @MBilalShafi -- [DataGrid] Remove `GridDensityType` enum (#7304) @cherniavskii -- [DataGrid] Remove `rowHeight` and `headerHeight` from state (#7199) @DanailH -- [DataGrid] Remove column separator to match table styles (#7067) @MBilalShafi -- [DataGrid] Update Russian (ru-RU) locale (#7220) @eceluXa -- [DataGridPro] Use row ID as `key` of the detail panels (#7302) @m4theushw -- [DataGridPremium] Fix `exceljs` import with parcel (#7284) @alexfauquette - -### `@mui/x-date-pickers@6.0.0-alpha.13` / `@mui/x-date-pickers-pro@6.0.0-alpha.13` - -#### Breaking changes - -- Require Luxon 3.0.2 or higher (#7249) @flaviendelangle - - `AdapterLuxon` now requires `luxon` in version `3.0.2` or higher in order to work. - - Take a look at the [Upgrading Luxon](https://moment.github.io/luxon/#/upgrading) guide if you are using an older version. - -#### Changes - -- [DateRangePicker] Fix to propagate `disabled` and `readOnly` on multi input picker (#7135) @LukasTy -- [fields] Fix multi input fields root element props order and types (#7225) @LukasTy -- [fields] Support escaped characters (#7184) @flaviendelangle -- [pickers] Allow to define custom view renderers on the pickers (#7176) @flaviendelangle -- [pickers] Avoid running validation methods several times in `DateCalendar` (#7247) @flaviendelangle -- [pickers] Improve Korean (ko-KR) locale (#7266) @hanbin9775 -- [pickers] Require Luxon 3.0.2 or higher (#7249) @flaviendelangle -- [pickers] Rework view internals (#7097) @flaviendelangle - -### `@mui/x-codemod@6.0.0-alpha.13` - -#### Changes - -- [codemod] New codemod for view component renaming (#7264) @flaviendelangle - -### Docs - -- [docs] Fix some selectors not being documented (#7218) @cherniavskii -- [docs] New page for `DateCalendar` (#7053) @flaviendelangle -- [docs] Split selection docs (#7213) @m4theushw - -### Core - -- [core] Fix API demos callout spacing @oliviertassinari - -## 6.0.0-alpha.12 - -_Dec 16, 2022_ - -We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 The `apiRef` prop is now available in the `@mui/x-data-grid` package: - - ```tsx - const apiRef = useGridApiRef(); - - return <DataGrid apiRef={apiRef} {...other} />; - ``` - - See [the documentation](https://mui.com/x/react-data-grid/api-object/) for more information. - -- 🎁 The `DataGridPremium` now supports cell selection: - - ```tsx - <DataGridPremium unstable_cellSelection /> - ``` - - See [the documentation](https://mui.com/x/react-data-grid/cell-selection/) for more information - -- 🌍 Support the Right To Left orientation on the fields components -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.12` / `@mui/x-data-grid-pro@6.0.0-alpha.12` / `@mui/x-data-grid-premium@6.0.0-alpha.12` - -#### Breaking changes - -- The `showCellRightBorder` was renamed to `showCellVerticalBorder` -- The `showColumnRightBorder` was renamed to `showColumnVerticalBorder` -- The `.MuiDataGrid-withBorder` CSS class was renamed to `.MuiDataGrid-withBorderColor` and it only sets `border-color` CSS property now. -- The following undocumented properties from `apiRef` were removed: `footerRef`, `headerRef`, `columnHeadersElementRef`, `columnHeadersContainerElementRef` -- The `GridHeaderPlaceholder` component was removed. -- The `MAX_PAGE_SIZE` constant was removed. -- The `useGridScrollFn` hook was removed. - -#### Changes - -- [DataGrid] Display sort column menu items as per `sortingOrder` prop (#7180) @MBilalShafi -- [DataGrid] Support `apiRef` in Community package (#6773) @cherniavskii -- [DataGridPremium] Add support for cell selection (#6567) @m4theushw -- [DataGridPremium] Use separate cache for aggregation columns pre-processor (#7142) @m4theushw -- [DataGridPro] Fix missing border in right-pinned columns (#4197) @cherniavskii -- [DataGridPro] Fix wrong border color on skeleton cells (#7202) @cherniavskii - -### `@mui/x-date-pickers@6.0.0-alpha.12` / `@mui/x-date-pickers-pro@6.0.0-alpha.12` - -#### Changes - -- [fields] Fix bug introduced by RTL in single input range fields (#7189) @alexfauquette -- [fields] Support RTL out of the box (#6715) @alexfauquette -- [pickers] Clean `autoFocus` behavior on fields and new pickers (#7153) @flaviendelangle -- [pickers] Fix label on the new range pickers (#7210) @flaviendelangle -- [pickers] Fix wrong component name on `StaticNextDateTime` (#7187) @flaviendelangle - -### Docs - -- [docs] Add docs section about field placeholders' localization (#7139) @flaviendelangle -- [docs] Create a `DemoGrid` component to unify demos with several components (#7057) @flaviendelangle -- [docs] Document aggregation selectors (#7148) @cherniavskii -- [docs] Fix 301 links to demo pages in API pages (#7197) @oliviertassinari -- [docs] Fix errors and warning in demos (#7209) @LukasTy -- [docs] Use `DemoContainer` and `DemoItem` on every picker demo (#7149) @flaviendelangle - -### Core - -- [core] Fix broken test (#7179) @flaviendelangle - -## 6.0.0-alpha.11 - -_Dec 8, 2022_ - -We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Add dragging support for the new Date Range Picker (`NextDateRangePicker`) (#6763) @LukasTy -- ⚡️ Improve performance of the `day` view (#7066) @flaviendelangle -- ✨ Fix lazy-loading feature not working in `DataGridPremium` (#7124) @m4theushw -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.11` / `@mui/x-data-grid-pro@6.0.0-alpha.11` / `@mui/x-data-grid-premium@6.0.0-alpha.11` - -#### Breaking changes - -- The `filterPanelOperators` translation key was renamed to `filterPanelOperator` (#7062) @MBilalShafi -- The `components.Header` slot was removed. Use `components.Toolbar` slot instead (#6999) @cherniavskii - -#### Changes - -- [DataGrid] Fix rows not rendering properly after height change (#6892) @MBilalShafi -- [DataGrid] Remove `Header` slot (#6999) @cherniavskii -- [DataGrid] Rename `filterPanelOperators` -> `filterPanelOperator` (#7062) @MBilalShafi -- [DataGridPremium] Add support for lazy-loading (#7124) @m4theushw -- [DataGridPremium] Pass `groupId` to aggregation function (#7003) @m4theushw - -### `@mui/x-date-pickers@6.0.0-alpha.11` / `@mui/x-date-pickers-pro@6.0.0-alpha.11` - -#### Breaking changes - -- Remove the callback version of the `action` prop on the `actionBar` slot (#7038) @flaviendelangle - - The `action` prop of the `actionBar` slot is no longer supporting a callback. - Instead, you can pass a callback at the slot level: - - ```diff - <DatePicker - componentsProps={{ - - actionBar: { - - actions: (variant) => (variant === 'desktop' ? [] : ['clear']), - - }, - + actionBar: ({ wrapperVariant }) => ({ - + actions: wrapperVariant === 'desktop' ? [] : ['clear'], - + }), - }} - /> - ``` - -- The `selectedDays` prop has been removed from the `Day` component (#7066) @flaviendelangle - If you need to access it, you can control the value and pass it to the slot using `componentsProps`: - - ```tsx - function CustomDay({ selectedDay, ...other }) { - // do something with 'selectedDay' - return <PickersDay {...other} />; - } - function App() { - const [value, setValue] = React.useState(null); - return ( - <DatePicker - value={value} - onChange={(newValue) => setValue(newValue)} - components={{ Day: CustomDay }} - componentsProps={{ - day: { selectedDay: value }, - }} - /> - ); - } - ``` - -- The `currentlySelectingRangeEnd` / `setCurrentlySelectingRangeEnd` props on the Date Range Picker toolbar have been renamed to `rangePosition` / `onRangePositionChange` (#6989) @flaviendelangle - - ```diff - const CustomToolbarComponent = props => ( - <div> - - <button onChange={() => props.setCurrentlySelectingRangeEnd('end')}>Edit end date</button> - + <button onClick={() => props.onRangePositionChange('end')}>Edit end date</button> - - <div>Is editing end date: {props.currentlySelectingRangeEnd === 'end'}</div> - + <div>Is editing end date: {props.rangePosition === 'end'}</div> - </div> - ) - <DateRangePicker - components={{ - Toolbar: CustomToolbarComponent - }} - /> - ``` - -#### Changes - -- [DateRangePicker] Add dragging support to edit range (#6763) @LukasTy -- [pickers] Fix lost props on Date Range Pickers (#7092) @flaviendelangle -- [pickers] Fix toolbar on the new range pickers (#6989) @flaviendelangle -- [pickers] Improve performance of `DayCalendar` (#7066) @flaviendelangle -- [pickers] Initialize date without time when selecting year or month (#7120) @LukasTy -- [pickers] Remove the callback version of the `action` prop in the `actionBar` component slot (#7038) @flaviendelangle - -### Docs - -- [docs] Add `GridCell` change in migration guide (#7087) @MBilalShafi -- [docs] Fix API page ad space regression (#7051) @oliviertassinari -- [docs] Update localization doc to use existing locale (#7102) @LukasTy - -### Core - -- [core] Add codemod to move l10n translation (#7027) @alexfauquette -- [core] Add notes to remove the legacy pickers internals (#7133) @flaviendelangle -- [core] Remove `internals-fields` imports (#7119) @flaviendelangle -- [core] Remove unused code (#7094) @flaviendelangle -- [core] Sync `ApiPage.js` with monorepo (#7073) @oliviertassinari -- [test] Fix karma-mocha assertion error messages (#7054) @cherniavskii - -## 6.0.0-alpha.10 - -_Dec 1, 2022_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Improve Ukrainian (uk-UA) and add Urdu (ur-PK) locales -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.10` / `@mui/x-data-grid-pro@6.0.0-alpha.10` / `@mui/x-data-grid-premium@6.0.0-alpha.10` - -### Breaking changes - -- [DataGrid] Removes `GridCell` fallback to `valueToRender` on `null` children (#7023) @MBilalShafi - - Returning `null` in `column.renderCell` or `column.renderEditCell` now renders an empty cell instead of the default formatted value. - -- [DataGrid] Refactor `GridFilterItem` props (#6985) @MBilalShafi - - Properties `columnField` and `operatorValue` of `GridFilterItem` are renamed `field` and `operator`. And `operator` property is now required. - - ```diff - filterModel: { - items: [{ - - columnField: 'rating', - + field: 'rating', - - operatorValue: '>', - + operator: '>', // required - value: '2.5' - }], - }, - ``` - -#### Changes - -- [DataGrid] Fix row selection when clicking blank cell (#6974) @yami03 -- [DataGrid] Refactor `GridFilterItem` props (#6985) @MBilalShafi -- [DataGrid] Removes `<GridCell />` fallback to `valueToRender` on `null` children (#7023) @MBilalShafi -- [DataGridPremium] Fix empty column group in Excel export (#7029) @alexfauquette -- [DataGridPremium] Update cache before hydrating columns (#7040) @m4theushw -- [DataGridPremium] Use custom cell component for grouping cell by default (#6692) @cherniavskii -- [l10n] Improve Ukrainian (uk-UA) locale (#7009) @rettoua - -### `@mui/x-date-pickers@6.0.0-alpha.10` / `@mui/x-date-pickers-pro@6.0.0-alpha.10` - -#### Breaking changes - -- Rename `dateRangeIcon` to `dateIcon` (#7024) @LukasTy - - The `dateRangeIcon` prop has been renamed to `dateIcon`: - - ```diff - // Same on all other Date Time Picker variations - <DateTimePicker - componentsProps={{ - tabs: { - - dateRangeIcon: <LightModeIcon />, - + dateIcon: <LightModeIcon />, - } - }} - /> - ``` - -#### Changes - -- [DateTimePicker] Rename `dateRangeIcon` to `dateIcon` (#7024) @LukasTy -- [pickers] Allow non-controlled usage of `TimeClock` (#6962) @flaviendelangle -- [pickers] Throw error when using adapter from `@date-io` (#6972) @flaviendelangle -- [l10n] Add Urdu (ur-PK) locale (#7007) @MBilalShafi -- [l10n] Improve Ukrainian (uk-UA) locale (#7009) @rettoua - -### Docs - -- [docs] Add Demos section on the pickers API pages (#6909) @flaviendelangle -- [docs] Add missing pickers migration docs (#7000) @LukasTy -- [docs] Fix broken link (#7048) @flaviendelangle -- [docs] Improve demo about customizing pagination (#6724) @m4theushw -- [docs] Keep track of localization completion (#7002) @alexfauquette -- [docs] Remove `LocalizationProvider` from previews (#6869) @flaviendelangle -- [docs] Remove the statement of support to RTL (#6521) @joserodolfofreitas -- [docs] Rework localization doc pages (#6625) @flaviendelangle -- [docs] Setup GitHub issue template for feedbacks about docs (#7026) @alexfauquette -- [docs] Test links with API page ignoring url hash (#7004) @alexfauquette -- [docs] Update API links from clock-picker to time-clock (#6993) @alexfauquette -- [docs] Use new pickers on the validation page (#7047) @flaviendelangle - -### Core - -- [core] Remove useless type casting in field hooks (#7045) @flaviendelangle -- [test] Sync `test:unit` with monorepo (#6907) @oliviertassinari - -## 6.0.0-alpha.9 - -_Nov 24, 2022_ - -We'd like to offer a big thanks to the 14 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Introduce the v6 pickers, built on top of the field components [DatePicker](https://mui.com/x/react-date-pickers/date-picker/), [TimePicker](https://mui.com/x/react-date-pickers/time-picker/), [DateTimePicker](https://mui.com/x/react-date-pickers/date-time-picker/), [DateRangePicker](https://mui.com/x/react-date-pickers/date-range-picker/). - - The old (legacy) components will be removed at the end of the v6 beta. - -- 💅 Add support for `theme.vars` in the pickers and the DataGrid (#6784, #6778) @alexfauquette -- ✨ Improve DataGrid theme augmentation (#5818) @iigrik -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.9` / `@mui/x-data-grid-pro@6.0.0-alpha.9` / `@mui/x-data-grid-premium@6.0.0-alpha.9` - -### Breaking changes - -- <kbd>Ctrl</kbd> + <kbd>Enter</kbd> will no longer toggle the master detail panel (#6945) @MBilalShafi - You can restore the old behavior by listening to `cellKeyDown` and calling `apiRef.current.toggleDetailPanel()`. - -- Remove unnecessary keyboard navigation events (#6863) @m4theushw - The `cellNavigationKeyDown` event was removed. Use `cellKeyDown` and check the key provided in the event argument. - The `columnHeaderNavigationKeyDown` event was removed. Use `columnHeaderKeyDown` and check the key provided in the event argument. - -- Rename `rowsScroll` event to `scrollPositionChange` (#6957) @DanailH - -#### Changes - -- [DataGrid] Add spacing in `GridToolbar` for better visibility (#6904) @MBilalShafi -- [DataGrid] Improve typing for the theme in `styleOverrides` (#5818) @iigrik -- [DataGrid] Prevents master detail panel toggle with <kbd>Ctrl</kbd> + <kbd>Enter</kbd> (#6945) @MBilalShafi -- [DataGrid] Remove unnecessary keyboard navigation events (#6863) @m4theushw -- [DataGrid] Rename `ErrorOverlay` to `GridErrorOverlay` (#6946) @MBilalShafi -- [DataGrid] Stop exporting root base state selectors (#6912) @DanailH -- [DataGrid] Support `theme.vars` (#6784) @alexfauquette -- [DataGrid] Rename `rowsScroll` event to `scrollPositionChange` (#6957) @DanailH -- [DataGridPro] Fix lazy-loaded rows not working with `updateRows` API method (#6976) @cherniavskii -- [DataGridPremium] Improve typing for theme in `styleOverrides` (#6920) @m4theushw -- [l10n] Fix translation of `filterOperatorBefore` in Arabic (ar-SD) locale (#6884) @HassanGhazy - -### `@mui/x-date-pickers@6.0.0-alpha.9` / `@mui/x-date-pickers-pro@6.0.0-alpha.9` - -#### Changes - -- [DatePicker] Display week number (#6144) @alexfauquette -- [pickers] Clean `PickersCalendarHeader` slots (#6943) @flaviendelangle -- [pickers] Do not loose the translations when using nested `LocalizationProvider` with each a `localeText` prop (#6895) @flaviendelangle -- [pickers] Fix calendar header switch view button hover circle (#6938) @rajendraarora16 -- [pickers] Fix focus management (#6914) @alexfauquette -- [pickers] Fix usage with Shadow DOM (#6952) @flaviendelangle -- [pickers] New `MobileDateRangePicker`, `DesktopDateRangePicker`, `DateRangePicker` and `StaticDateRangePicker` based on `MultiInputDateRangeField` (#6888) @flaviendelangle -- [pickers] Support `theme.vars` (#6778) @alexfauquette - -### Docs - -- [docs] Add new "Expired package version" error type (#6937) @oliviertassinari -- [docs] Add support for API pages of unstable components (#6981) @flaviendelangle -- [docs] Create docs for the new date pickers (#6902) @flaviendelangle -- [docs] Create docs for the new time, date time and date range pickers (#6958) @flaviendelangle -- [docs] Fix demos live edit (#6975) @oliviertassinari -- [docs] Fix toggle button bug in demos in Custom Components page (#6913) @01zulfi -- [docs] Remove partial Portuguese and Chinese translations of the pickers pages (#6893) @flaviendelangle - -### Core - -- [core] Cleanup `describeValidation` (#6942) @flaviendelangle -- [core] Group renovate GitHub Action dependency updates @oliviertassinari -- [core] Introduce `x-codemod` package (#6876) @LukasTy -- [core] Update minimum supported version of Node.js to 14.0.0 (#6966) @cherniavskii -- [core] Upgrade monorepo (#6905) @cherniavskii -- [core] Upgrade node to v14.21 (#6916) @piwysocki -- [core] Upgrade ESLint (#6738) @Janpot -- [test] Test validation on date range view (#6941) @alexfauquette - -## 6.0.0-alpha.8 - -_Nov 17, 2022_ - -We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Support aggregating data from multiple row fields (#6656) @cherniavskii -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.8` / `@mui/x-data-grid-pro@6.0.0-alpha.8` / `@mui/x-data-grid-premium@6.0.0-alpha.8` - -#### Changes - -- [DataGrid] Fix `ErrorOverlay` not receiving defined input props (#6819) @banoth-ravinder -- [DataGrid] Fix conflict with the latest version of `@types/react` (#6797) @izv -- [DataGrid] Make more `apiRef` methods private (#6700) @cherniavskii -- [DataGrid] Provide a clear error message when upgrading (#6685) @oliviertassinari -- [DataGridPremium] Allow to customize the indent of group expansion toggle (#6837) @MBilalShafi -- [DataGridPremium] Support aggregating data from multiple row fields (#6656) @cherniavskii -- [DataGridPro] Fix detail panel not working with `getRowSpacing` prop (#6707) @cherniavskii -- [DataGridPro] Opt-out for column jump back on re-order (#6733) @gavbrennan -- [l10n] Improve Finnish (fi-FI) locale (#6859) @RainoPikkarainen - -### `@mui/x-date-pickers@6.0.0-alpha.8` / `@mui/x-date-pickers-pro@6.0.0-alpha.8` - -#### Breaking changes - -- The `ClockPicker` view component has been renamed to `TimeClock` to better fit its usage: - - ```diff - -<ClockPicker {...props} /> - +<TimeClock {...props} /> - ``` - - Component name in the theme has changed as well: - - ```diff - -MuiClockPicker: { - +MuiTimeClock: { - ``` - -#### Changes - -- [pickers] Fix typing and prop drilling on `DateRangeCalendar` and multi input range fields (#6852) @flaviendelangle -- [pickers] Pass the `ampm` prop from the new pickers to their field (#6868) @flaviendelangle -- [pickers] Rename `CalendarPickerView`, `ClockPickerView` and `CalendarOrClockPickerView` (#6855) @flaviendelangle -- [pickers] Rename `ClockPicker` into `TimeClock` (#6851) @flaviendelangle - -### Docs - -- [docs] Add `dayjs` to the dependencies (#6862) @m4theushw -- [docs] Clarify how the Row Pinning works with other features of the DataGrid (#6853) @cherniavskii -- [docs] Fix typo in Export page (#6848) @m4theushw -- [docs] Group picker pages (#6369) @flaviendelangle -- [docs] Remove default prop and improve format (#6781) @oliviertassinari -- [docs] Sync prism-okaidia.css with source (#6820) @oliviertassinari - -### Core - -- [core] Convert scripts to ESM (#6789) @LukasTy -- [core] Feedback on branch protection @oliviertassinari -- [core] Fix `test-types` out of memory error (#6850) @LukasTy -- [core] Import from `@mui/utils` instead of `@mui/material/utils` (#6816) @cherniavskii -- [core] Show the whole version to make blame easier @oliviertassinari -- [core] Small changes on new pickers internals (#6840) @flaviendelangle -- [core] Remove prettier scripts (#6815) @Janpot -- [license] Polish error messages (#6881) @oliviertassinari -- [test] Verify `onError` call on the pickers (#6771) @alexfauquette - -## 6.0.0-alpha.7 - -_Nov 10, 2022_ - -We'd like to offer a big thanks to the 5 contributors who made this release possible. Here are some highlights ✨: - -- ⚙️ Removed everything marked as `@deprecated` -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.7` / `@mui/x-data-grid-pro@6.0.0-alpha.7` / `@mui/x-data-grid-premium@6.0.0-alpha.7` - -#### Changes - -- [DataGrid] Fix cell focus causing scroll jump when virtualization enabled (#6785) @yaredtsy -- [DataGrid] Remove items marked as `@deprecated` (#6505) @DanailH - -### `@mui/x-date-pickers@6.0.0-alpha.7` / `@mui/x-date-pickers-pro@6.0.0-alpha.7` - -#### Changes - -- [fields] Rename section names to match the picker view nomenclature (#6779) @flaviendelangle -- [pickers] Fix pickers toolbar styling (#6793) @LukasTy -- [pickers] Improve validation JSDoc descriptions (#6777) @flaviendelangle -- [pickers] New `MobileDateTimePicker`, `DesktopDateTimePicker`, `DateTimePicker` and `StaticDateTimePicker` based on `DateTimeField` (#6767) @flaviendelangle -- [pickers] New `MobileTimePicker`, `DesktopTimePicker`, `TimePicker` and `StaticTimePicker` based on `TimeField` (#6728) @flaviendelangle -- [pickers] Support the `onError` prop and add context on the `onChange` prop (#6731) @flaviendelangle - -### Docs - -- [docs] Add missing Pro header suffix (#6775) @oliviertassinari -- [docs] Upgrade to Next.js 13 (#6790) @cherniavskii - -### Core - -- [core] Add OSSF Scorecard action (#6760) @oliviertassinari -- [core] Fix Pinned-Dependencies @oliviertassinari -- [core] Fix Scorecard fail Action @oliviertassinari -- [core] Pin GitHub Action dependencies (#6739) @renovate[bot] -- [core] Remove default access to GitHub action scopes @oliviertassinari -- [test] Fix test case name: Pro-> Premium @oliviertassinari - -## 6.0.0-alpha.6 - -_Nov 4, 2022_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- 🎁 Allow non-controlled usage of the calendar components (#6643) @flaviendelangle - - ```tsx - <DateCalendar defaultValue={dayjs()} /> - <MonthCalendar defaultValue={dayjs()} /> - <YearCalendar defaultValue={dayjs()} /> - ``` - -- 🌍 Add Ukrainian (uk-UA) locale to pickers (#6661) @Dufran -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.6` / `@mui/x-data-grid-pro@6.0.0-alpha.6` / `@mui/x-data-grid-premium@6.0.0-alpha.6` - -#### Breaking changes - -- The `disableIgnoreModificationsIfProcessingProps` prop has been removed and its behavior when `true` was incorporated as the default behavior. - The old behavior can be restored by using `apiRef.current.stopRowEditMode({ ignoreModifications: true })` or `apiRef.current.stopCellEditMode({ ignoreModifications: true })`. - -#### Changes - -- [DataGrid] Add `rowSelection` prop (#6499) @m4theushw -- [DataGrid] Avoid future regression with React 19 (#6638) @oliviertassinari -- [DataGrid] Refactor `@mui/material` imports to `@mui/utils` (#6569) @LukasTy -- [DataGrid] Remove `disableIgnoreModificationsIfProcessingProps` prop (#6640) @m4theushw -- [DataGrid] Separate private and public `apiRef` properties (#6388) @cherniavskii - -### `@mui/x-date-pickers@6.0.0-alpha.6` / `@mui/x-date-pickers-pro@6.0.0-alpha.6` - -#### Changes - -- [DateRangePicker] Fix input focused style and mobile behavior (#6645) @LukasTy -- [fields] Update sections when the locale changes (#6649) @flaviendelangle -- [pickers] Add Ukrainian (uk-UA) locale (#6661) @Dufran -- [pickers] Allow non-controlled usage of the calendar components (#6643) @flaviendelangle -- [pickers] Export other adapters derived from moment or date-fns (#6571) @alexfauquette -- [pickers] New `MobileDatePicker` and `DatePicker` based on `DateField` (#6690) @flaviendelangle -- [pickers] New `StaticDatePicker` component (#6708) @flaviendelangle -- [pickers] Rename `inputFormat` prop to `format` on the new pickers (#6722) @flaviendelangle - -### Core - -- [core] Fix `typescript:ci` failures (#6705) @LukasTy -- [core] Fixes for upcoming eslint upgrade (#6667) @Janpot -- [core] Pin GitHub Action to digests (#6683) @oliviertassinari - -## 6.0.0-alpha.5 - -_Oct 31, 2022_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- ⚡ Fix memory leak during unmount of the DataGrid (#6620) @cherniavskii -- 📝 New guide for migrating pickers from v5 to v6 (#6472) @flaviendelangle -- 🎁 Allow to disable the autofocus of the search field when opening the column visibility panel (#6444) @e-cloud -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.5` / `@mui/x-data-grid-pro@6.0.0-alpha.5` / `@mui/x-data-grid-premium@6.0.0-alpha.5` - -#### Breaking changes - -- Stop exporting `gridColumnsSelector` (#6693) @m4theushw - - The `gridColumnsSelector` was deprecated during v5 and is now removed from the export list. - - Please consider using one of the following selectors as a replacement: - - - `gridColumnFieldsSelector`, to obtain the column fields in the order they appear on the screen; - - `gridColumnLookupSelector`, to access column definitions by field; - - `gridColumnVisibilityModelSelector`, for the visibility state of each column. - -#### Changes - -- [DataGrid] Allow to disable autofocusing the search field in the columns panel (#6444) @e-cloud -- [DataGrid] Fix `setRows` method not persisting new rows data after `loading` prop change (#6493) @cherniavskii -- [DataGrid] Fix memory leak on grid unmount (#6620) @cherniavskii -- [DataGrid] Rename `GridColumnsState['all']` to `GridColumnsState['orderedFields']` (#6562) @DanailH -- [DataGrid] Remove `React.memo` from `GridCellCheckboxRenderer` (#6655) @mattcorner -- [DataGrid] Stop exporting `gridColumnsSelector` (#6693) -- [l10n] Improve Bulgarian (bg-BG) locale (#6578) @AtanasVA - -### `@mui/x-date-pickers@6.0.0-alpha.5` / `@mui/x-date-pickers-pro@6.0.0-alpha.5` - -#### Breaking changes - -- [pickers] Rename remaining `private` components (#6550) @LukasTy - Previously we had 4 component names with `Private` prefix in order to avoid breaking changes in v5. - These components were renamed: - - - `PrivatePickersMonth` -> `MuiPickersMonth` - - `PrivatePickersSlideTransition` -> `MuiPickersSlideTransition` - - `PrivatePickersToolbarText` -> `MuiPickersToolbarText` - - `PrivatePickersYear` -> `MuiPickersYear` - - Manual style overriding will need to use updated classes: - - ```diff - -.PrivatePickersMonth-root { - +.MuiPickersMonth-root { - - -.PrivatePickersSlideTransition-root { - +.MuiPickersSlideTransition-root { - - -.PrivatePickersToolbarText-root { - +.MuiPickersToolbarText-root { - - -.PrivatePickersYear-root { - +.MuiPickersYear-root { - ``` - - Component name changes are also reflected in `themeAugmentation`: - - ```diff - const theme = createTheme({ - components: { - - PrivatePickersMonth: { - + MuiPickersMonth: { - // overrides - }, - - PrivatePickersSlideTransition: { - + MuiPickersSlideTransition: { - // overrides - }, - - PrivatePickersToolbarText: { - + MuiPickersToolbarText: { - // overrides - }, - - PrivatePickersYear: { - + MuiPickersYear: { - // overrides - }, - }, - }); - ``` - -#### Changes - -- [DateTimePicker] Fix toolbar time order when `theme.rtl=true` (#6636) @alexfauquette -- [pickers] Import fixes for mask editing (#6623) @alexfauquette -- [pickers] Rename remaining `private` components (#6550) @LukasTy -- [pickers] New `DesktopDatePicker` based on `DateField` (#6548) @flaviendelangle - -### Docs - -- [docs] Add feedback in next doc (#6591) @alexfauquette -- [docs] Check link validity in PR (#6497) @alexfauquette -- [docs] Disable translations (#6560) @cherniavskii -- [docs] Fix typo in DataGrid demo page (#6632) @banoth-ravinder -- [docs] New page to migrate pickers from v5 to v6 (#6472) @flaviendelangle -- [docs] Remove broken welcome page (#6585) @alexfauquette -- [docs] Mark data grid column group as available (#6660) @alexfauquette -- [docs] Fix double space @oliviertassinari - -### Core - -- [core] Fix duplicate CodeQL build @oliviertassinari -- [core] Fix spreading on validation page (#6624) @flaviendelangle -- [core] Small TypeScript improvements (#6575) @flaviendelangle -- [core] Upgrade monorepo (#6594) @oliviertassinari -- [core] Change reproduction position (#6621) @oliviertassinari -- [core] Fix permissions in `no-response` workflow (#6658) @cherniavskii -- [core] Remove legacy migration function (#6669) @oliviertassinari -- [license] Improve the license content (#6459) @oliviertassinari -- [test] Test Arrow up/down on every token (#6563) @alexfauquette - -## 6.0.0-alpha.4 - -_Oct 20, 2022_ - -We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: - -- 📝 Manage pickers' toolbar customization with slots -- 🐞 Bugfixes -- 🌍 Improve Turkish (tr-TR) locale on the data grid and pickers (#6542) @ramazansancar - -### `@mui/x-data-grid@6.0.0-alpha.4` / `@mui/x-data-grid-pro@6.0.0-alpha.4` / `@mui/x-data-grid-premium@6.0.0-alpha.4` - -#### Breaking changes - -- To avoid confusion with the props that will be added for the cell selection feature, some props related to row selection were renamed to have "row" in their name. - The renamed props are the following: - - | Old name | New name | - | :------------------------- | :---------------------------- | - | `selectionModel` | `rowSelectionModel` | - | `onSelectionModelChange` | `onRowSelectionModelChange` | - | `disableSelectionOnClick` | `disableRowSelectionOnClick` | - | `disableMultipleSelection` | `disableMultipleRowSelection` | - -- The `gridSelectionStateSelector` selector was renamed to `gridRowSelectionStateSelector`. - -- The `selectionChange` event was renamed to `rowSelectionChange`. - -#### Changes - -- [DataGrid] Add `searchPredicate` prop to `GridColumnsPanel` component (#6557) @cherniavskii -- [DataGrid] Support keyboard navigation in column group header (#5947) @alexfauquette -- [DataGrid] Fix grid not updating state on `rowCount` prop change (#5982) @cherniavskii -- [DataGrid] Rename selection props (#6556) @m4theushw -- [l10n] Improve Turkish (tr-TR) locale on the data grid and pickers (#6542) @ramazansancar - -### `@mui/x-date-pickers@6.0.0-alpha.4` / `@mui/x-date-pickers-pro@6.0.0-alpha.4` - -#### Breaking changes - -- The `ToolbarComponent` has been replaced by a `Toolbar` component slot. - You can find more information about this pattern in the [Base UI documentation](https://mui.com/base-ui/getting-started/usage/#shared-props): - - ```diff - // Same on all other pickers - <DatePicker - - ToolbarComponent: MyToolbar, - + components={{ Toolbar: MyToolbar }} - /> - ``` - -- The `toolbarPlaceholder` and `toolbarFormat` props have been moved to the `toolbar` components props slot: - - ```diff - // Same on all other pickers - <DatePicker - - toolbarPlaceholder="__" - - toolbarFormat="DD / MM / YYYY" - + componentsProps={{ - + toolbar: { - + toolbarPlaceholder: '__', - + toolbarFormat: 'DD / MM / YYYY', - + } - + }} - /> - ``` - -- The `toolbarTitle` prop has been moved to the localization object: - - ```diff - // Same on all other pickers - <DatePicker - - toolbarTitle="Title" - + localeText={{ toolbarTitle: 'Title' }} - /> - ``` - -- The toolbar related translation keys have been renamed to better fit their usage: - - ```diff - <LocalizationProvider - localeText={{ - - datePickerDefaultToolbarTitle: 'Date Picker', - + datePickerToolbarTitle: 'Date Picker', - - - timePickerDefaultToolbarTitle: 'Time Picker', - + timePickerToolbarTitle: 'Time Picker', - - - dateTimePickerDefaultToolbarTitle: 'Date Time Picker', - + dateTimePickerToolbarTitle: 'Date Time Picker', - - - dateRangePickerDefaultToolbarTitle: 'Date Range Picker', - + dateRangePickerToolbarTitle: 'Date Range Picker', - }} - /> - ``` - -- The `onChange` / `openView` props on the toolbar have been renamed `onViewChange` / `view` - -#### Changes - -- [fields] Add a `validationError` property to the `onChange` callback (#6539) @flaviendelangle -- [fields] Distinguish start and end input error on multi input fields (#6503) @flaviendelangle -- [pickers] Clean the `Tabs` component slot (#6543) @flaviendelangle -- [pickers] Fix localization of the placeholder (#6547) @alexfauquette -- [pickers] Fix TypeScript issues (#6322) @flaviendelangle -- [pickers] Improve error consistency between single and multiple range pickers (#6561) @alexfauquette -- [pickers] Refactor `@mui/material` imports to `@mui/utils` (#6443) @LukasTy -- [pickers] Replace toolbar's props by a component slot (#6445) @flaviendelangle - -### Docs - -- [docs] Enable inlined preview for disabled date picker (#6477) @oliviertassinari -- [docs] Fix 404 errors (#6541) @alexfauquette -- [docs] Fix broken links on field pages (#6501) @flaviendelangle -- [docs] Improve markdownlint (#6518) @oliviertassinari - -### Core - -- [core] Run CodeQL only on schedule @oliviertassinari -- [core] Fix trailing spaces and git diff format (#6523) @oliviertassinari -- [core] Harden GitHub Actions permissions (#6396) @step-security-bot -- [core] Improve the playground DX (#6514) @oliviertassinari -- [core] Link Netlify in the danger comment (#6513) @oliviertassinari -- [core] Organize tests for pickers slots (#6546) @flaviendelangle -- [core] Remove outdated `docsearch.js` dependency (#6242) @oliviertassinari -- [core] Upgrade monorepo (#6549) @cherniavskii -- [test] Add validation test on range pickers (#6504) @alexfauquette -- [test] Remove BrowserStack (#6263) @DanailH - -## 6.0.0-alpha.3 - -_Oct 13, 2022_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- ⌚️ New components to edit date and time with <kbd>keyboard</kbd>—without using any modal or dropdown UI. - Please check out our [documentation](https://mui.com/x/react-date-pickers/fields/) to discover those new components. - - - [`DateField`](https://mui.com/x/react-date-pickers/date-field/) to edit date - - [`TimeField`](https://mui.com/x/react-date-pickers/time-field/) to edit time - - [`DateTimeField`](https://mui.com/x/react-date-pickers/date-time-field/) to edit date and time - - [`MultiInputDateRangeField` / `SingleInputDateRangeField`](https://mui.com/x/react-date-pickers/date-range-field/) to edit date range - - [`MultiInputTimeRangeField`](https://mui.com/x/react-date-pickers/time-range-field/) to edit time range with two inputs - - [`MultiInputDateTimeRangeField`](https://mui.com/x/react-date-pickers/date-time-range-field/) to edit date and time range with two inputs - - ⚠️ These components are unstable. - They might receive breaking changes on their props to have the best components possible by the time of the stable release. - -- 📝 Allow to limit to one filter per column for `DataGridPro` and `DataGridPremium` (#6333) @MBilalShafi -- 📚 New [page describing the validation props on each picker](https://mui.com/x/react-date-pickers/validation/) (#6064) @flaviendelangle -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.3` / `@mui/x-data-grid-pro@6.0.0-alpha.3` / `@mui/x-data-grid-premium@6.0.0-alpha.3` - -#### Breaking changes - -- [DataGrid] Remove legacy editing API - - The editing API that is enabled by default was replaced with a new API that contains better support for server-side persistence, validation and customization. This new editing feature was already available in v5 under the `newEditingApi` experimental flag. In v6, this flag can be removed. - - ```diff - <DataGrid - - experimentalFeatures={{ newEditingApi: true }} - /> - ``` - - For users that didn't migrate to the new editing API in v5, additional work may be needed because the new API is not equivalent to the legacy API. Although, some migration steps are available to help in this task. - - - The `editCellPropsChange` event was removed. If you still need it please file a new issue so we can propose an alternative. - - The `cellEditCommit` event was removed and the `processRowUpdate` prop can be used in place. More information, check the [docs](https://mui.com/x/react-data-grid/editing/#persistence) section about the topic. - - The `editRowsModel` and `onEditRowsModelChange` props were removed. The [`cellModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) or [`rowModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) props can be used to achieve the same goal. - - The following API methods were removed: - - Use `apiRef.current.stopCellEditMode` to replace `apiRef.current.commitCellChange` - - Use `apiRef.current.startCellEditMode` to replace `apiRef.current.setCellMode(id, field, 'edit')` - - Use `apiRef.current.stopRowEditMode` to replace `apiRef.current.commitRowChange` - - Use `apiRef.current.startRowMode` to replace `apiRef.current.setRowMode(id, 'edit')` - - Use the [`cellModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) or [`rowModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) props to replace `apiRef.current.setEditRowsModel` - -#### Changes - -- [DataGrid] Fix start edit mode with printable character in React 18 (#6257) @m4theushw -- [DataGrid] Remove legacy editing API (#6016) @m4theushw -- [DataGrid] Simplify `useGridApiContext` and `useGridApiRef` type overrides (#6423) @cherniavskii -- [DataGrid] Use generics instead of verbose state overrides (#6409) @cherniavskii -- [DataGridPro] Allow to limit to one filter per column (#6333) @MBilalShafi - -### `@mui/x-date-pickers@6.0.0-alpha.3` / `@mui/x-date-pickers-pro@6.0.0-alpha.3` - -#### Breaking changes - -- All the props used by the mobile and desktop wrappers to override components or components' props have been replaced by component slots. You can find more information about this pattern in the [Base UI documentation](https://mui.com/base-ui/getting-started/usage/#shared-props). - - Some of the names have also been prefixed by `desktop` when it was unclear that the behavior was only applied on the desktop version of the pickers (or the responsive version when used on a desktop). - - The `DialogProps` prop has been replaced by a `dialog` component props slot on responsive and mobile pickers: - - ```diff - // Same on MobileDatePicker, DateTimePicker, MobileDateTimePicker, - // TimePicker, MobileTimePicker, DateRangePicker and MobileDateRangePicker. - <DatePicker - - DialogProps={{ backgroundColor: 'red' }} - + componentsProps={{ dialog: { backgroundColor: 'red' }}} - /> - ``` - - The `PaperProps` prop has been replaced by a `desktopPaper` component props slot on all responsive and desktop pickers: - - ```diff - // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, - // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. - <DatePicker - - PaperProps={{ backgroundColor: 'red' }} - + componentsProps={{ desktopPaper: { backgroundColor: 'red' }}} - /> - ``` - - The `PopperProps` prop has been replaced by a `popper` component props slot on all responsive and desktop pickers: - - ```diff - // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, - // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. - <DatePicker - - PopperProps={{ onClick: handleClick }} - + componentsProps={{ popper: { onClick: handleClick }}} - /> - ``` - - The `TransitionComponent` prop has been replaced by a `DesktopTransition` component slot on all responsive and desktop pickers: - - ```diff - // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, - // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. - <DatePicker - - TransitionComponent={Fade} - + components={{ DesktopTransition: Fade }} - /> - ``` - - The `TrapFocusProps` prop has been replaced by a `desktopTrapFocus` component props slot on all responsive and desktop pickers: - - ```diff - // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, - // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. - <DatePicker - - TrapFocusProps={{ isEnabled: () => false }} - + componentsProps={{ desktopTrapFocus: { isEnabled: () => false }}} - /> - ``` - -- The view components allowing to pick a date or parts of a date without an input have been renamed to better fit their usage: - - ```diff - -<CalendarPicker {...props} /> - +<DateCalendar {...props} /> - ``` - - ```diff - -<DayPicker {...props} /> - +<DayCalendar {...props} /> - ``` - - ```diff - -<CalendarPickerSkeleton {...props} /> - +<DayCalendarSkeleton {...props} /> - ``` - - ```diff - -<MonthPicker {...props} /> - +<MonthCalendar {...props} /> - ``` - - ```diff - -<YearPicker {...props} /> - +<YearCalendar {...props} /> - ``` - -- Component names in the theme have changed as well: - - ```diff - -MuiCalendarPicker: { - +MuiDateCalendar: { - ``` - - ```diff - -MuiDayPicker: { - +MuiDayCalendar: { - ``` - - ```diff - -MuiCalendarPickerSkeleton: { - +MuiDayCalendarSkeleton: { - ``` - - ```diff - -MuiMonthPicker: { - +MuiMonthCalendar: { - ``` - - ```diff - -MuiYearPicker: { - +MuiYearCalendar: { - ``` - -#### Changes - -- [DatePicker] Allows to fix the number of week displayed (#6299) @alexfauquette -- [DateRangePicker] Fix calendar day outside of month layout shifting on hover (#6448) @alexfauquette -- [fields] New components: `MultiInputDateTimeRangePicker` and `MultiInputTimeRangePicker` (#6392) @alexfauquette -- [fields] Prepare the field exports for the public release (#6467) @flaviendelangle -- [fields] Support paste in single section (#6422) @alexfauquette -- [pickers] Add field placeholders to the locale (#6337) @flaviendelangle -- [pickers] Do not use `Partial` for `components` and `componentsProps` props (#6463) @flaviendelangle -- [pickers] New component: `DateRangeCalendar` (#6416) @flaviendelangle -- [pickers] Replace the `Picker` prefix in the view component by `Calendar` (eg: `MonthPicker` => `MonthCalendar`) (#6389) @flaviendelangle -- [pickers] Support pasting on fields (#6364) @flaviendelangle -- [pickers] Use slots in the mobile and desktop wrappers instead of `XXXComponent` and `XXXProps` (#6381) @flaviendelangle - -### Docs - -- [docs] Add migration to DataGrid v6 page (#6235) @m4theushw -- [docs] Create first publishable version of the field doc (#6323) @flaviendelangle -- [docs] Fix trailing spaces in the readme @oliviertassinari -- [docs] New page for the pickers: Validation (#6064) @flaviendelangle -- [docs] Organize migration pages (#6480) @flaviendelangle - -### Core - -- [core] Add CodeQL workflow (#6387) @DanailH -- [core] Add missing breaking change to the changelog (#6471) @flaviendelangle -- [core] Fix playground structure (#6466) @LukasTy -- [core] Fix tests for pasting on fields (#6465) @flaviendelangle -- [core] Remove absolute link (#6420) @flaviendelangle -- [core] Remove unused `react-text-mask` package (#6408) @LukasTy -- [core] Send explicit warning when dayjs locale is not found (#6424) @alexfauquette -- [core] Test validation on textfield and date views (#6265) @alexfauquette -- [test] Sync comment with monorepo @oliviertassinari - -## 6.0.0-alpha.2 - -_Oct 7, 2022_ - -We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Further progress on stabilizing new date field components -- 🎁 Improve support for theme augmentation in the DataGrid (#6269) @cherniavskii -- 🌍 Add Japanese (ja-JP) locale to pickers (#6365) @sho918 -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.2` / `@mui/x-data-grid-pro@6.0.0-alpha.2` / `@mui/x-data-grid-premium@6.0.0-alpha.2` - -#### Breaking changes - -- 🎁 The aggregation is no longer experimental. - - You can now use the aggregation without the `experimentalFeatures.aggregation` flag enabled. - - ```diff - <DataGridPremium - - experimentalFeatures={{ aggregation: true }} - /> - ``` - - The aggregation of the columns through the column menu is now enabled by default on `DataGridPremium`. You can set `disableAggregation={true}` to disable it. - -#### Changes - -- [DataGrid] Add filter item ID to `.MuiDataGrid-filterForm` (#6313) @m4theushw -- [DataGrid] Add missing `valueOptions` (#6401) @DanailH -- [DataGrid] Don't start edit mode when pressing Shift + Space (#6228) @m4theushw -- [DataGrid] Fix error when using column grouping with all columns hidden (#6405) @alexfauquette -- [DataGrid] Pass generics to the components in the theme augmentation (#6269) @cherniavskii -- [DataGridPremium] Remove the aggregation from the experimental features (#6372) @flaviendelangle - -### `@mui/x-date-pickers@6.0.0-alpha.2` / `@mui/x-date-pickers-pro@6.0.0-alpha.2` - -#### Breaking changes - -- The `renderDay` prop has been replaced by a `Day` component slot. - You can find more information about this pattern in the [Base UI documentation](https://mui.com/base-ui/getting-started/usage/#shared-props). - - ```diff - // Same for any other date, date time or date range picker. - <DatePicker - - renderDay={(_, dayProps) => <CustomDay {...dayProps} />} - + components={{ Day: CustomDay }} - /> - ``` - -#### Changes - -- [DateRangePicker] Fix the shape of the first selected day when the start date has an hour set (#6403) @flaviendelangle -- [l10n] Add Japanese (ja-JP) locale to pickers (#6365) @sho918 -- [DateRangePicker] Force focus to stay on inputs (#6324) @alexfauquette -- [pickers] Improve edition on field components (#6339) @flaviendelangle -- [pickers] Improve field selection behaviors (#6317) @flaviendelangle -- [pickers] Replace the `renderDay` prop with a `Day` component slot (#6293) @flaviendelangle - -### Docs - -- [docs] Apply style guide to Data Grid Aggregation page (#5781) @samuelsycamore -- [docs] Fix code examples of editing cells (#6004) @TiagoPortfolio -- [docs] Fix customized day rendering demo style (#6342) (#6399) @Ambrish-git -- [docs] Implement Style Guide on "Advanced" Data Grid doc pages (#6331) @samuelsycamore -- [docs] Use components instead of demos for `SelectorsDocs` (#6103) @flaviendelangle -- [license] Add new license status 'Out of scope' (#5260) @flaviendelangle - -### Core - -- [core] Speedup of yarn install in the CI (#6395) @oliviertassinari -- [test] Remove redundant test clean-ups (#6377) @oliviertassinari -- [test] Replace `React.render` with `React.createRoot` in e2e tests (#6393) @m4theushw - -## 6.0.0-alpha.1 - -_Sep 29, 2022_ - -We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: - -- 🚀 Better support for custom overlays (#5808) @cherniavskii -- 🖨️ Improve print export (#6273) @oliviertassinari -- 🎁 Reduce confusion when initializing pickers with a date value (#6170) @flaviendelangle -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.1` / `@mui/x-data-grid-pro@6.0.0-alpha.1` / `@mui/x-data-grid-premium@6.0.0-alpha.1` - -#### Breaking changes - -- New internal rows structure for v6 (#4927) @flaviendelangle - - Some selectors related to the rows have been renamed to better describe the type of rows they are returning: - - ```diff - -const result = gridRowsIdToIdLookupSelector(apiRef); - +const result = gridRowsDataRowIdToIdLookupSelector(apiRef); - ``` - - ```diff - -const result = gridRowTreeDepthSelector(apiRef); - +const result = gridRowMaximumTreeDepthSelector(apiRef); - ``` - - The format of the tree nodes (the element accessible in `params.node` or with the `apiRef.current.getRowNode` method) have changed. - You have a new `type` property, which can be useful, for example, to apply custom behavior on groups. - Here is an example of the old and new approach showing how to apply a custom value formatter in groups for the grouping column: - - ```diff - <DataGridPremium - groupingColDef={() => ({ - valueFormatter: (params) => { - if (params.id == null) { - return params.value; - } - - const rowNode = apiRef.current.getRowNode(params.id!)!; - - if (rowNode.children?.length) { - + if (rowNode.type === 'group') { - return `by ${rowNode.groupingKey ?? ''}`; - } - - return params.value; - } - })} - /> - ``` - -- The `GridFeatureModeConstant` constant no longer exists (#6077) @DanailH - - ```diff - -import { GridFeatureModeConstant } from '@mui/x-data-grid'; - ``` - -#### Changes - -- [DataGrid] Fix `GridPagination` props typing (#6238) @cherniavskii -- [DataGrid] Fix `GridRow` not forwarding `ref` to the root element (#6274) @cherniavskii -- [DataGrid] Fix `undefined` value being showed in filter button tooltip text (#6259) @cherniavskii -- [DataGrid] Fix blank space when changing page with dynamic row height (#6049) @m4theushw -- [DataGrid] New internal rows structure for v6 (#4927) @flaviendelangle -- [DataGrid] Revert cell/row mode if `processRowUpdate` fails (#6185) @m4theushw -- [DataGrid] Rework overlays layout (#5808) @cherniavskii -- [DataGrid] Improve print support (#6273) @oliviertassinari -- [DataGridPremium] Add missing `themeAugmentation` module (#6270) @cherniavskii - -### `@mui/x-date-pickers@6.0.0-alpha.1` / `@mui/x-date-pickers-pro@6.0.0-alpha.1` - -#### Breaking changes - -- The `value` prop of the pickers now expects a parsed value. - - Until now, it was possible to provide any format that your date management library was able to parse. - For instance, you could pass `value={new Date()}` when using `AdapterDayjs`. - - This brought a lot of confusion so we decided to remove this behavior. - The format expected by the `value` prop is now the same as for any other prop holding a date. - Here is the syntax to initialize a date picker at the current date for each adapter: - - ```tsx - // Date-fns - <DatePicker value={new Date()} />; - - // Dayjs - import dayjs from 'dayjs'; - <DatePicker value={dayjs()} />; - - // Moment - import moment from 'moment'; - <DatePicker value={moment()} />; - - // Luxon - import { DateTime } from 'luxon'; - <DatePicker value={DateTime.now()} />; - ``` - -#### Changes - -- [DatePicker] Respect `minDate` and `maxDate` when opening a `DatePicker` or `DateTimePicker` (#6309) @alexfauquette -- [DateTimePicker] Fix validation with `shouldDisableMonth` and `shouldDisableYear` (#6266) @flaviendelangle -- [TimePicker] Add support for `disablePast` and `disableFuture` validation props (#6226) @LukasTy -- [CalendarPicker] Prevent getting focus when `autoFocus=false` (#6304) @alexfauquette -- [DateField] Extend moment adapter to support `expandFormat` and `formatTokenMap` (#6215) @alexfauquette -- [pickers] Allow to control the selected sections (#6209, #6307) @flaviendelangle -- [pickers] Do not loose the value of date sections not present in the format in the new field components (#6141) @flaviendelangle -- [pickers] Do not support unparsed date formats anymore (#6170) @flaviendelangle -- [pickers] Support slots on the `DateField` component (#6048) @flaviendelangle -- [pickers] Support Luxon v3 in `AdapterLuxon` (#6069) @alexfauquette -- [pickers] New components `TimeField` and `DateTimeField` (#6312) @flaviendelangle -- [pickers] Support basic mobile edition on new field components (#5958) @flaviendelangle - -### Docs - -- [docs] Fix issue in DataGrid/DataGridPro row styling demo (#6264) @MBilalShafi -- [docs] Improve pickers Getting Started examples (#6292) @flaviendelangle -- [docs] Pass model change callbacks in controlled grid editing demos (#6296) @cherniavskii -- [docs] Update the CodeSandbox to use the `next` branch (#6275) @oliviertassinari - -### Core - -- [core] Fix typing error (#6291) @flaviendelangle -- [core] Fix typo in the state updater of `useField` (#6311) @flaviendelangle -- [core] Remove `GridFeatureModeConstant` (#6077) @DanailH -- [core] Simplify testing architecture (#6043) @flaviendelangle -- [test] Skip test in Chrome non-headless and Edge (#6318) @m4theushw - -## 6.0.0-alpha.0 - -_Sep 22, 2022_ - -We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: - -- 🌍 Add a `localeText` prop to all pickers to customize the translations (#6212) @flaviendelangle -- 🌍 Add Finnish (fi-FI) locale to the pickers (#6219) @PetroSilenius -- 🌍 Add Persian (fa-IR) locale to the pickers (#6181) @fakhamatia -- 📚 Documentation improvements -- 🐞 Bugfixes - -### `@mui/x-data-grid@6.0.0-alpha.0` / `@mui/x-data-grid-pro@6.0.0-alpha.0` / `@mui/x-data-grid-premium@6.0.0-alpha.0` - -#### Breaking changes - -- The deprecated `hide` column property has been removed in favor of the `columnVisibilityModel` prop and initial state. - - ```diff - <DataGrid - columns={[ - field: 'id, - - hide: true, - ]} - + initialState={{ - + columns: { - + columnVisibilityModel: { id: false }, - + }, - + }} - /> - ``` - - You can find more information about this new API on our [documentation](https://mui.com/x/react-data-grid/column-visibility/). - -- The `GridEvents` enum is now a TypeScript type. - - ```diff - -apiRef.current.subscribeEvent(GridEvents.rowClick', handleRowClick); - +apiRef.current.subscribeEvent('rowClick', handleRowClick); - ``` - -#### Changes - -- [DataGrid] Do not publish `cellFocusOut` event if the row was removed (#6251) @cherniavskii -- [DataGrid] Fix scroll anchoring with master details (#6054) @oliviertassinari -- [DataGrid] Improve Polish (pl-PL) locale on the data grid (#6245) @grzegorz-bach -- [DataGrid] Remove the `GridEvents` enum (#6003) @flaviendelangle -- [DataGrid] Remove the deprecated `hide` column property (#5999) @flaviendelangle - -### `@mui/x-date-pickers@6.0.0-alpha.0` / `@mui/x-date-pickers-pro@6.0.0-alpha.0` - -#### Breaking changes - -- All the deprecated props that allowed you to set the text displayed in the pickers have been removed. - - You can now use the `localText` prop available on all picker components: - - | Removed prop | Property in the new `localText` prop | - | :--------------------------- | :-------------------------------------------------------------------------------- | - | `endText` | `end` | - | `getClockLabelText` | `clockLabelText` | - | `getHoursClockNumberText` | `hoursClockNumberText` | - | `getMinutesClockNumberText` | `minutesClockNumberText` | - | `getSecondsClockNumberText` | `secondsClockNumberText` | - | `getViewSwitchingButtonText` | `calendarViewSwitchingButtonAriaLabel` | - | `leftArrowButtonText` | `openPreviousView` (or `previousMonth` when the button changes the visible month) | - | `rightArrowButtonText` | `openNextView` (or `nextMonth` when the button changes the visible month) | - | `startText` | `start` | - - For instance if you want to replace the `startText` / `endText` - - ```diff - <DateRangePicker - - startText="From" - - endText="To" - + localeText={{ - + start: 'From', - + end: 'To', - + }} - /> - ``` - -You can find more information about the new api, including how to set those translations on all your components at once in the [documentation](https://mui.com/x/react-date-pickers/localization/) - -- The deprecated `locale` prop of the `LocalizationProvider` component have been renamed `adapterLocale`: - - ```diff - <LocalizationProvider - dateAdapter={AdapterDayjs} - - locale="fr" - + adapterLocale="fr" - > - {children} - </LocalizationProvider> - ``` - -- The component slots `LeftArrowButton` and `RightArrowButton` have been renamed `PreviousIconButton` and `NextIconButton` to better describe there usage: - - ```diff - <DatePicker - components={{ - - LeftArrowButton: CustomButton, - + PreviousIconButton: CustomButton, - - - RightArrowButton: CustomButton, - + NextIconButton: CustomButton, - }} - componentsProps={{ - - leftArrowButton: {}, - + previousIconButton: {}, - - - rightArrowButton: {}, - + nextIconButton: {}, - }} - /> - ``` - -- The `date` prop has been renamed `value` on `MonthPicker` / `YearPicker`, `ClockPicker` and `CalendarPicker`. - - ```diff - -<MonthPicker date={dayjs()} onChange={handleMonthChange} /> - +<MonthPicker value={dayjs()} onChange={handleMonthChange} /> - - -<YearPicker date={dayjs()} onChange={handleYearChange} /> - +<YearPicker value={dayjs()} onChange={handleYearChange} /> - - -<ClockPicker date={dayjs()} onChange={handleTimeChange} /> - +<ClockPicker value={dayjs()} onChange={handleTimeChange} /> - - -<CalendarPicker date={dayjs()} onChange={handleDateChange} /> - +<CalendarPicker value={dayjs()} onChange={handleDateChange} /> - ``` - -#### Changes - -- [CalendarPicker] Don't move to closest enabled date when `props.date` contains a disabled date (#6146) @flaviendelangle -- [DateRangePicker] Switch to new month when changing the value from the outside (#6166) @flaviendelangle -- [pickers] Add a `localeText` prop to all pickers to customize the translations (#6212) @flaviendelangle -- [pickers] Add Finnish (fi-FI) locale to the pickers (#6219) (#6230) @PetroSilenius -- [pickers] Add Persian (fa-IR) locale to the pickers (#6181) @fakhamatia -- [pickers] Allow nested `LocalizationProvider` (#6011) @flaviendelangle -- [pickers] Clean slots on `PickersArrowSwitcher` component (#5890) @flaviendelangle -- [pickers] Fix invalid date error when decreasing `DateField` day (#6071) @alexfauquette -- [pickers] Fix mobile section selection (#6207) @oliviertassinari -- [pickers] Fix usage with Typescript 4.8 (#6229) @flaviendelangle -- [pickers] Improve error message when no adapter context is found (#6211) @flaviendelangle -- [pickers] Remove `valueStr` from the field state (#6142) @flaviendelangle -- [pickers] Remove remaining deprecated locale props (#6233) @flaviendelangle -- [pickers] Rename the `date` prop `value` on `MonthPicker` / `YearPicker`, `ClockPicker` and `CalendarPicker` (#6128) @flaviendelangle -- [pickers] Rename the `onClose` prop of `PickersPopper` `onDismiss` to simplify typing (#6155) @flaviendelangle -- [pickers] Support the `sx` prop on all public component with a root HTML elements (#5944) @flaviendelangle -- [pickers] Unify `PickersMonth` and `PickersYear` behaviors (#6034) @flaviendelangle -- [pickers] Use `shouldDisableMonth` and `shouldDisableYear` for date validation (#6066) @flaviendelangle -- [YearPicker] Scroll to the current year even with `autoFocus=false` (#6224) @alexfauquette - -### Docs - -- [docs] Add automatic vale check (#5429) @alexfauquette -- [docs] Add Pro logo in "column ordering" link (#6127) @alexfauquette -- [docs] Fix 301 link (#6239) @oliviertassinari -- [docs] Fix broken link (#6163) @alexfauquette -- [docs] Fix broken links (#6101) @alexfauquette -- [docs] Fix demonstration date to avoid hydration errors (#6032) @alexfauquette -- [docs] Fix hidden popper in restore state example (#6191) @heyfirst -- [docs] Fix invalid links causing 404 & 301 errors (#6105) @oliviertassinari -- [docs] Fix npm repository url in the pickers `package.json` (#6172) @oliviertassinari -- [docs] Fix typo in linked issue (#6162) @flaviendelangle -- [docs] Import `generateUtilityClass` from `@mui/utils` (#6216) @michaldudak -- [docs] Improve Upgrade plan docs (#6018) @oliviertassinari -- [docs] Link the OpenSSF Best Practices card (#6171) @oliviertassinari - -### Core - -- [core] Add `v5.17.3` changelog to next branch (#6250) @flaviendelangle -- [core] Add link to the security page on the `README` (#6073) @oliviertassinari -- [core] Fix scroll restoration in the docs (#5938) @oliviertassinari -- [core] Remove the Storybook (#6099) @flaviendelangle -- [core] Tag release as `next` in npm (#6256) @m4theushw -- [core] Update monorepo (#6180) @flaviendelangle -- [core] Use the `next` branch for Prettier (#6097) @flaviendelangle -- [core] Use the official repository for `@mui/monorepo` instead of a fork (#6189) @oliviertassinari -- [test] Fix logic to skip column pinning tests (#6133) @m4theushw -- [test] Hide the date on the print regression test (#6120) @flaviendelangle -- [test] Skip tests for column pinning and dynamic row height (#5997) @m4theushw -- [website] Improve security header @oliviertassinari - ## Older versions -Changes before 6.x are listed in our [changelog for older versions](https://github.com/mui/mui-x/blob/HEAD/changelogOld/). +Changes before 7.x are listed in our [changelog for older versions](https://github.com/mui/mui-x/blob/HEAD/changelogOld/). diff --git a/README.md b/README.md index 3bbfeb09f669..102d36ddfe11 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,25 @@ <h1 align="center">MUI X</h1> -MUI X is a collection of advanced React UI components for complex use cases. Use the native integration with [Material UI](https://github.com/mui/material-ui/) or extend your design system. +[MUI X](https://mui.com/x/) is a collection of advanced React UI components for complex use cases. Use the native integration with [Material UI](https://github.com/mui/material-ui/) or extend your design system. They feature state-of-the-art functionality and complex UX workflows for data-rich applications and support a wide range of use cases. +<div align="center"> + +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/mui/mui-x/blob/HEAD/LICENSE) +[![npm latest package](https://img.shields.io/npm/v/@mui/x-data-grid/latest.svg)](https://www.npmjs.com/package/@mui/x-data-grid) +[![npm downloads](https://img.shields.io/npm/dm/@mui/x-data-grid.svg)](https://www.npmjs.com/package/@mui/x-data-grid) +[![GitHub branch status](https://img.shields.io/github/checks-status/mui/mui-x/HEAD)](https://github.com/mui/mui-x/commits/HEAD/) +[![Coverage status](https://img.shields.io/codecov/c/github/mui/mui-x.svg)](https://codecov.io/gh/mui/mui-x/) +[![Follow on X](https://img.shields.io/twitter/follow/MUI_X_.svg?label=follow+MUI+X)](https://x.com/MUI_X_) +[![Renovate status](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://github.com/mui/mui-x/issues/2081) +[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/mui/mui-x.svg)](https://isitmaintained.com/project/mui/mui-x 'Average time to resolve an issue') +[![Open Collective backers and sponsors](https://img.shields.io/opencollective/all/mui-org)](https://opencollective.com/mui-org) + +<!-- [![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8715/badge)](https://www.bestpractices.dev/projects/8715) --> + +</div> + MUI X is **open core**—base components are MIT-licensed, while more advanced features require a Pro or Premium commercial license. See the [Licensing page](https://mui.com/x/introduction/licensing/) for details. diff --git a/babel.config.js b/babel.config.js index d8d15499e33a..e10b6c313097 100644 --- a/babel.config.js +++ b/babel.config.js @@ -15,15 +15,13 @@ const defaultAlias = { '@mui/x-date-pickers': resolveAliasPath('./packages/x-date-pickers/src'), '@mui/x-date-pickers-pro': resolveAliasPath('./packages/x-date-pickers-pro/src'), '@mui/x-charts': resolveAliasPath('./packages/x-charts/src'), + '@mui/x-charts-pro': resolveAliasPath('./packages/x-charts-pro/src'), '@mui/x-tree-view': resolveAliasPath('./packages/x-tree-view/src'), '@mui/x-tree-view-pro': resolveAliasPath('./packages/x-tree-view-pro/src'), '@mui/material-nextjs': '@mui/monorepo/packages/mui-material-nextjs/src', '@mui-internal/api-docs-builder': resolveAliasPath( './node_modules/@mui/monorepo/packages/api-docs-builder', ), - '@mui-internal/test-utils': resolveAliasPath( - './node_modules/@mui/monorepo/packages/test-utils/src', - ), docs: resolveAliasPath('./node_modules/@mui/monorepo/docs'), test: resolveAliasPath('./test'), packages: resolveAliasPath('./packages'), diff --git a/changelogOld/CHANGELOG.v6.md b/changelogOld/CHANGELOG.v6.md new file mode 100644 index 000000000000..603ff9f69953 --- /dev/null +++ b/changelogOld/CHANGELOG.v6.md @@ -0,0 +1,5417 @@ +# Change Log for v6 releases + +## 6.19.12 + +_May 17, 2024_ + +We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: + +- 🐞 Bugfixes + +### Date Pickers + +#### `@mui/x-date-pickers@6.19.12` + +- [pickers] Fix `AdapterMomentJalaali` regression (#13150) @LukasTy + +#### `@mui/x-date-pickers-pro@6.19.12` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.12`. + +### Docs + +- [docs] Use MUI X v6 in Codesandbox and Stackblitz demos (#12838) @cherniavskii + +## 6.19.11 + +_Apr 18, 2024_ + +We'd like to offer a big thanks to the 1 contributor who made this release possible. Here are some highlights ✨: + +- 🐞 Bugfixes + +### Data Grid + +#### `@mui/x-data-grid@6.19.11` + +- [DataGrid] Fix virtualization memory leak (#12812) @romgrk + +#### `@mui/x-data-grid-pro@6.19.11` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.11`. + +#### `@mui/x-data-grid-premium@6.19.11` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.11`. + +## 6.19.10 + +_Apr 12, 2024_ + +We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: + +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.19.10` + +- [DataGrid] Do not escape double quotes when copying to clipboard (#12734) @cherniavskii +- [DataGrid] Fix bug in suspense (#12754) @cherniavskii + +#### `@mui/x-data-grid-pro@6.19.10` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.10`. + +#### `@mui/x-data-grid-premium@6.19.10` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.10`. + +### Core + +- [core] Update the docs release source branch (#12685) @LukasTy + +## 6.19.9 + +_Apr 5, 2024_ + +We'd like to offer a big thanks to the 3 contributors who made this release possible. Here are some highlights ✨: + +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.19.9` + +- [DataGrid] Remove legacy editing API event: `rowEditCommit` (#12087) @MBilalShafi + +#### `@mui/x-data-grid-pro@6.19.9` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.9`. + +#### `@mui/x-data-grid-premium@6.19.9` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.9`. + +### Date Pickers + +#### `@mui/x-date-pickers@6.19.9` + +No changes. + +#### `@mui/x-date-pickers-pro@6.19.9` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +- [DateRangePicker] Fix selection behavior with single input field when `readOnly` (#12605) @LukasTy + +### Docs + +- [docs] Add a recipe for the `checkboxSelectionVisibleOnly` prop (#12667) @michelengelen +- [docs] Explain the use of `_action: 'delete'` in `processRowUpdate` (#12673) @michelengelen + +### Core + +- [core] Use Circle CI context (#12607) @cherniavskii + +## 6.19.8 + +_Mar 20, 2024_ + +We'd like to offer a big thanks to the 3 contributors who made this release possible. + +### Data Grid + +#### `@mui/x-data-grid@6.19.8` + +- [DataGrid] Fix `ElementType` usage (#12505) @cherniavskii +- [DataGrid] Fix cell value formatting on copy (#12483) @sai6855 +- [DataGrid] Fix checkbox selection when filtering (#12485) @g1mishra + +#### `@mui/x-data-grid-pro@6.19.8` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.8`. + +#### `@mui/x-data-grid-premium@6.19.8` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.8`, plus: + +- [DataGridPremium] Add support for confirmation before clipboard paste (#12466) @cherniavskii + +### Docs + +- [docs] Update links to v7 (#12495) @cherniavskii + +## 6.19.7 + +_Mar 14, 2024_ + +We'd like to offer a big thanks to @LukasTy who made this release possible. + +### Date Pickers + +#### `@mui/x-date-pickers@6.19.7` + +- [pickers] Keep the existing time when looking for closest enabled date (#12410) @LukasTy + +#### `@mui/x-date-pickers-pro@6.19.7` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.7`. + +### Docs + +- [docs] Add Pickers custom start of week section (#12425) @LukasTy + +## 6.19.6 + +_Mar 1, 2024_ + +We'd like to offer a big thanks to the 4 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Korean (ko-KR) and Chinese (zh-CN) locales on the Pickers +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.19.6` + +- [DataGrid] Fix error when existing rows are passed to `replaceRows` (@martijn-basesoft) + +#### `@mui/x-data-grid-pro@6.19.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.6`. + +#### `@mui/x-data-grid-premium@6.19.6` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.6`, plus: + +- [DataGridPremium] Make clipboard copy respect the sorting during cell selection (#12255) @MBilalShafi + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.19.6` + +- [l10n] Improve Chinese (zh-CN) locale (#12250) @headironc +- [l10n] Improve Korean (ko-KR) locale (#12186) @Luzi + +#### `@mui/x-date-pickers-pro@6.19.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.6`. + +### Docs + +- [docs] Update lazy loading demo to show skeleton rows during initial rows fetch (#12062) @cherniavskii + +## 6.19.5 + +_Feb 23, 2024_ + +We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: + +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.19.5` + +- [DataGrid] Fix styling grid filter input single select (#12079) @FreakDroid + +#### `@mui/x-data-grid-pro@6.19.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.5`. + +#### `@mui/x-data-grid-premium@6.19.5` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.5`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.19.5` + +- [pickers] Fix `referenceDate` day calendar focus (#12136) @LukasTy +- [pickers] Fix styling props propagation to `DateTimePickerTabs` (#12131) @LukasTy + +#### `@mui/x-date-pickers-pro@6.19.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.5`. + +### Charts / `@mui/x-charts@6.19.5` + +- [charts] Allow to skip animation on sparkline bar (#12160) @alexfauquette + +### Docs + +- [docs] Clarify Pickers 'Component composition' section (#12147) @LukasTy +- [docs] Fix 301 redirection to StackBlitz @oliviertassinari +- [docs] Fix 301 to Material UI @oliviertassinari +- [docs] Fix 301 to Material UI @oliviertassinari +- [docs] Fix 404 links to translation source @oliviertassinari +- [docs] Fix dead link to translations @oliviertassinari +- [docs] Fix the Treemap illustration (#12189) @danilo-leal +- [docs] Fix typo for `AdapterDateFnsV3` (#12037) @flaviendelangle +- [docs] Improve performance on Charts entry point @oliviertassinari +- [docs] Move Heatmap to Pro (#12170) @alexfauquette +- [docs] Remove Charts installation next tag call-out (#12133) @LukasTy +- [docs] Removed `focused` prop from demo (#12126) @michelengelen +- [docs] Add missing Heatmap Pro icon @oliviertassinari +- [docs] Add more illustrations to the Overview page (#12041) @danilo-leal +- [docs] Avoid use of shorthand (#12009) @oliviertassinari + +### Core + +- [core] Fix CI @oliviertassinari +- [core] Fix docs link check (#12137) @LukasTy + +## 6.19.4 + +_Feb 9, 2024_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Danish (da-DK) locale on the Data Grid (#11972) @ShahrazH +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.19.4` + +- [DataGrid] Add support for dialogs in menu actions (#11937) @cherniavskii +- [DataGrid] Allow passing readonly arrays to `pageSizeOptions` prop (#11992) @pcorpet +- [DataGrid] Fix row reorder with cell selection (#11878) @PEsteves8 +- [DataGrid] Replace `eval` with `new Function` (#11962) @cherniavskii +- [l10n] Improve Danish (da-DK) locale (#11972) @ShahrazH + +#### `@mui/x-data-grid-pro@6.19.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.4`. + +#### `@mui/x-data-grid-premium@6.19.4` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.4`, plus: + +- [DataGridPremium] Fix autosize grouping cell (#11990) @romgrk +- [DataGridPremium] Fix error after closing print export (#11889) @cherniavskii + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.19.4` + +- [pickers] Avoid relying on locale in Luxon `isWithinRange` method (#11940) @LukasTy + +#### `@mui/x-date-pickers-pro@6.19.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.4`. + +### Charts / `@mui/x-charts@6.19.4` + +- [charts] Add `reverse` property to axes (#11959) @alexfauquette +- [charts] Allow series ids to be numbers (#11960) @alexfauquette +- [charts] Fix Proptypes error by supporting string values for axes (#11953) @alexfauquette + +### Docs + +- [docs] Add a note about `AdapterDateFnsV3` on the Getting Started page (#11987) @flaviendelangle +- [docs] Avoid the use of MUI Core @oliviertassinari +- [docs] Fix API links (#11930) @alexfauquette +- [docs] Fix `ChartsTooltip` typo (#11967) @thisisharsh7 +- [docs] Refactor `Localization` documentation sections (#11997) @LukasTy +- [code] Simplify bug reproduction (#11932) @alexfauquette + +## 6.19.3 + +_Feb 1, 2024_ + +We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Hebrew (he-IL) locale (#11831) @danielmishan85 +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.19.3` + +- [l10n] Improve Hebrew (he-IL) locale (@danielmishan85) (#11831) + +#### `@mui/x-data-grid-pro@6.19.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.3`. + +#### `@mui/x-data-grid-premium@6.19.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.3`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.19.3` + +- [TimePicker] Add missing toolbar classes descriptions (#11862) @LukasTy + +#### `@mui/x-date-pickers-pro@6.19.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.3`. + +### Charts / `@mui/x-charts@6.19.3` + +- [charts] Document how to modify color according to values (#11854) @alexfauquette + +### Docs + +- [docs] Add a general uplift to the whats new page (#11883) @danilo-leal +- [docs] Fix 404 (#11852) @alexfauquette +- [docs] Fix <title> generation (#11825) @alexfauquette +- [docs] Fix docs:api when typo in slots typing (#11861) @alexfauquette +- [docs] Improve Support page (#11556) @oliviertassinari +- [docs] Sync support page with core @oliviertassinari +- [docs] These API don't exist in MUI X v6 @oliviertassinari +- [docs] Update whats new page with v7 Beta blogpost content (#11886) @joserodolfofreitas + +## 6.19.2 + +_Jan 25, 2024_ + +We'd like to offer a big thanks to the 2 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Apply the `layout.tabs` class to `Tabs` slot (@LukasTy) (#11782) +- 🐞 Bugfixes + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.19.2` + +- [pickers] Apply the `layout.tabs` class to `Tabs` slot (@LukasTy) (#11782) + +#### `@mui/x-date-pickers-pro@6.19.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.2`, plus: + +- [DateRangePicker] Remove `calendars` prop on `Mobile` (@LukasTy) (#11771) + +### Data Grid + +#### `@mui/x-data-grid@6.19.2` + +- [DataGrid] Fix support for tree with more than 50,000 children (@zenazn) (#11808) + +#### `@mui/x-data-grid-pro@6.19.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.2`. + +#### `@mui/x-data-grid-premium@6.19.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.2`. + +## 6.19.1 + +_Jan 19, 2024_ + +We'd like to offer a big thanks to the 1 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Add Croatian (hr-HR), Portuguese (pt-PT), and Chinese (Hong Kong) (zh-HK) locales (#11717) @BCaspari +- 🐞 Bugfixes + +### Data Grid + +#### `@mui/x-data-grid@6.19.1` + +- [l10n] Add Croatian (hr-HR), Portuguese (pt-PT), and Chinese (Hong Kong) (zh-HK) locales (#11717) @BCaspari + +#### `@mui/x-data-grid-pro@6.19.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.19.1`. + +#### `@mui/x-data-grid-premium@6.19.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.19.1`. + +### Charts / `@mui/x-charts@6.19.1` + +- [charts] Add `arcLabelRadius` property (#11563) @alexfauquette +- [charts] Do not propagate `innerRadius` and `outerRadius` to the DOM (#11719) @alexfauquette +- [charts] Fix default `stackOffset` for `LineChart` (#11703) @alexfauquette + +## 6.19.0 + +_Jan 11, 2024_ + +We'd like to offer a big thanks to the 3 contributors who made this release possible. Here are some highlights ✨: + +- ⏰ Support date-fns v3 (#11659) @LukasTy + Pickers support both v2 and v3 of date-fns. For v3 use `AdapterDateFnsV3`. + ```js + // with date-fns v2.x + import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; + import de from 'date-fns/locale/de'; + ``` + ```js + // with date-fns v3.x + import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'; + import { de } from 'date-fns/locale/de'; + ``` + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.19.0` + +- [pickers] Add date-fns@3.x adapter (#11659) @LukasTy +- [pickers] Fix clearable behavior blocking focus return to `OpenPickerButton` (#11643) @noraleonte +- [l10n] Add missing Danish (da-DK) locale export (#11641) @etlos + +#### `@mui/x-date-pickers-pro@6.19.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.19.0`. + +### Docs + +- [docs] Add missing component @oliviertassinari +- [docs] Fix parsing of `x-date-pickers-pro` demo adapter imports (#11637) @LukasTy +- [docs] Push up the MUI X brand (#11533) @oliviertassinari +- [docs] Improve Server-side data grid docs (#11589) @oliviertassinari +- [docs] Add demo to the charts overview page (#11586) @danilo-leal +- [docs] Fix 404 links in the docs @oliviertassinari +- [docs] Improve landing page (#11570) @oliviertassinari +- [docs] Give a general revision to the docs (#11249) @danilo-leal + +## 6.18.7 + +_Jan 5, 2024_ + +We'd like to offer a big thanks to the 4 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Czech (cs-CZ) locale on Data Grid (#11429) @wensiet +- 🐞 Bugfixes + +### Data Grid + +#### `@mui/x-data-grid@6.18.7` + +- [DataGrid] Don't evaluate `hasEval` when `disableEval` is set (#11553) @reihwald +- [l10n] Update Czech (cs-CZ) locale (#11498) @fdebef + +#### `@mui/x-data-grid-pro@6.18.7` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.7`. + +#### `@mui/x-data-grid-premium@6.18.7` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.7`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.7` + +- [pickers] Fix views management (@LukasTy) (#11572) + +#### `@mui/x-date-pickers-pro@6.18.7` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.7`. + +### Charts / `@mui/x-charts@6.18.7` + +- [charts] Fix `null` in line chart using dataset (@alexfauquette) (#11561) + +### Docs + +- [docs] Clarify Pickers usage with Luxon (#11566) @LukasTy + +## 6.18.6 + +_Dec 22, 2023_ + +We'd like to offer a big thanks to the 5 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Russian (ru-RU) locale (#11429) @wensiet +- 🐞 Bugfixes + +### Data Grid + +#### `@mui/x-data-grid@6.18.6` + +- [DataGrid] Fix typos in the JSDoc (#11475) @flaviendelangle +- [l10n] Improve Russian (ru-RU) locale (#11429) @wensiet + +#### `@mui/x-data-grid-pro@6.18.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.6`. + +#### `@mui/x-data-grid-premium@6.18.6` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.6`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.6` + +- [fields] Fix section pasting (#11467) @LukasTy + +#### `@mui/x-date-pickers-pro@6.18.6` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.6`. + +### Charts / `@mui/x-charts@6.18.4` + +- [charts] Allow percentage values for pie chart center and radius (#11464) @alexfauquette +- [charts] Make error message more explicit (#11457) @alexfauquette +- [charts] Make the helper `ChartsText` component public (#11370) @alexfauquette +- [charts] Improve dataset typing (#11372) @alexfauquette +- [charts] Fix size overflow (#11385) @alexfauquette + +### Docs + +- [docs] Document false default values for boolean props (#11489) @cherniavskii +- [docs] Improve Pickers `name` prop examples (#11442) @LukasTy +- [docs] Limit `date-fns` package to v2 in codesandbox (#11478) @LukasTy +- [test] Reload the page if its blank and there are no links to the remaining tests (#11471) @cherniavskii + +## 6.18.5 + +_Dec 14, 2023_ + +We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Swedish (sv-SE) and Urdu (ur-PK) locales on the Data Grid +- 🐞 Bugfixes + +### Data Grid + +#### `@mui/x-data-grid@6.18.5` + +- [l10n] Improve Swedish (sv-SE) locale (#11379) @fredrikcarlbom +- [l10n] Improve Urdu (ur-PK) locale for data grid (#11409) @MBilalShafi + +#### `@mui/x-data-grid-pro@6.18.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.5`. + +#### `@mui/x-data-grid-premium@6.18.5` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.5`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.5` + +- [pickers] Fix field types to avoid error on latest `@types/react` version (#11398) @LukasTy +- [pickers] Support name prop (#11380) @gitstart + +#### `@mui/x-date-pickers-pro@6.18.5` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.5`, plus: + +- [DateRangePicker] Fix `autoFocus` behavior (#11376) @kealjones-wk + +### Docs + +- [docs] Respect GoT books (#11294) @janoma +- [test] Fix flaky screenshots (#11391) @cherniavskii + +## 6.18.4 + +_Dec 8, 2023_ + +We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: + +- 📚 Add [Pickers FAQ page](https://mui.com/x/react-date-pickers/faq/) +- 🌍 Improve Danish (da-DK) locale on Data Grid +- 🐞 Bugfixes + +### Data Grid + +#### `@mui/x-data-grid@6.18.4` + +- [DataGrid] Fix cell slot style override (#11215) @oliviertassinari +- [l10n] Improve Danish (da-DK) locale (#11346) @goibon + +#### `@mui/x-data-grid-pro@6.18.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.4`. + +#### `@mui/x-data-grid-premium@6.18.4` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.4`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.4` + +- [pickers] Fix `MultiSectionDigitalClock` issues (#11308) @LukasTy + +#### `@mui/x-date-pickers-pro@6.18.4` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.4`. + +### Docs + +- [docs] Fix typo (#11323) @cadam11 +- [docs] Add FAQ page (#11347) @noraleonte + +## 6.18.3 + +_Dec 4, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 📈 Fix a lot of Charts package issues +- 🌍 Improve Bulgarian (bg-BG) locale on Data Grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.18.3` + +- [DataGrid] Fix cell editing adding a leading "v" on paste (#11166) @prasad5795 +- [DataGrid] Fix handling of event target in portal (#11209) @cherniavskii +- [DataGrid] Fix `onFilterModelChange` being fired with stale field value (#11244) @gitstart +- [l10n] Improve Bulgarian (bg-BG) locale (#10856) (#11206) @Kristiqn95 + +#### `@mui/x-data-grid-pro@6.18.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.3`. + +#### `@mui/x-data-grid-premium@6.18.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.3`, plus: + +- [DataGridPremium] Fix aggregated column ignoring column definition changes (#11176) @cherniavskii +- [DataGridPremium] Fix custom filter operators not working on aggregated column (#11201) @cherniavskii + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.3` + +- [pickers] Correctly format `MultiSectionDigitalClock` number sections (#11297) @LukasTy +- [pickers] Expand field placeholder methods flexibility by providing `format` parameter (#11254) @LukasTy + +#### `@mui/x-date-pickers-pro@6.18.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.3`. + +### Charts / `@mui/x-charts@6.18.3` + +- [charts] Adjusted `defaultizeValueFormatter` util to accept an optional `series.valueFormatter` value (#11213) @michelengelen +- [charts] Apply `labelStyle` and `tickLabelStyle` props on `<ChartsYAxis />` (#11180) @akamfoad +- [charts] Fix TS config (#11259) @alexfauquette +- [charts] Fix error with empty dataset (#11063) @alexfauquette +- [charts] Fix export strategy (#11235) @alexfauquette + +### Docs + +- [docs] Add LTS section to support page (#11300) @joserodolfofreitas +- [docs] Add end v6 blogpost to whats new page (#11299) @joserodolfofreitas +- [docs] Document charts composition (#10710) @alexfauquette +- [docs] Fix version links (#11167) @LukasTy +- [docs] Improve Data Grid togglable columns example (#11241) @MBilalShafi +- [docs] Split charts overview and getting started in distinct pages (#10910) @alexfauquette + +## 6.18.2 + +_Nov 23, 2023_ + +We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Arabic (ar-SD), Czech (cs-CZ), and Hebrew (he-IL) locales on Data Grid +- 🌍 Add Basque (eu) and Macedonian (mk) locales on Pickers +- 🌍 Improve German (de-DE) and Spanish (es-ES) locales on Pickers +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.18.2` + +- [l10n] Improve Arabic (ar-SD) locale (#11096) @OmarWebDev +- [l10n] Improve Czech (cs-CZ) locale (#10968) @luborepka +- [l10n] Improve Hebrew (he-IL) locale (#11056) @LironKiloma + +#### `@mui/x-data-grid-pro@6.18.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.2`. + +#### `@mui/x-data-grid-premium@6.18.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.2`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.2` + +- [l10n] Add Basque (eu) locale and improve Spanish (es-ES) locale (#10985) @lajtomekadimon +- [l10n] Add Macedonian (mk) locale (#11155) @brsnik +- [l10n] Improve German (de-DE) locale (#11104) @jho-vema +- [pickers] Deprecate `defaultCalendarMonth` prop (#11138) @flaviendelangle +- [pickers] Fix `DateCalendar` crashing when given an invalid value (#11101) @flaviendelangle + +#### `@mui/x-date-pickers-pro@6.18.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.2`. + +### Charts / `@mui/x-charts@6.18.2` + +- [charts] Fix `ChartsTooltip` component setup (#11157) @LukasTy +- [charts] Remove outdated prop-types (#10998) @alexfauquette + +### Docs + +- [docs] Fix incoherent naming of a component in `Custom slots and subcomponents` page (#11003) @lhilgert9 +- [test] Skip flaky e2e test in webkit (#11115) @cherniavskii +- [test] Wait for images to load (#11109) @cherniavskii + +## 6.18.1 + +_Nov 9, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- ✨ Fix aggregation label not showing when `renderHeader` is used (#10961) @cherniavskii +- 📘 Server side data source [early documentation](https://mui.com/x/react-data-grid/server-side-data/) published +- 📈 `<ChartsReferenceLine />` component is now available +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.18.1` + +- [DataGrid] Fix cell value type in quick filtering v7 (#10884) @cherniavskii +- [DataGrid] Fix keyboard navigation for actions cell with disabled buttons (#10947) @michelengelen +- [DataGrid] Fix `undefined` slot values (#10934) @romgrk + +#### `@mui/x-data-grid-pro@6.18.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.1`, plus: + +- [DataGridPro] Add data source interface and basic documentation (#10543) @MBilalShafi + +#### `@mui/x-data-grid-premium@6.18.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.1`, plus: + +- [DataGridPremium] Render aggregation label when `renderHeader` is used (#10961) @cherniavskii + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.1` + +- [fields] Fix multi input date time field section selection (#10915) @noraleonte +- [pickers] Always use up-to-date `defaultView` (#10889) @LukasTy + +#### `@mui/x-date-pickers-pro@6.18.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.1`. + +### Charts / `@mui/x-charts@6.18.1` + +- [charts] Add `<ChartsReferenceLine />` component (#10597) @wascou +- [charts] Improve properties JSDoc (#10931) @alexfauquette + +### Docs + +- [docs] Fix charts docs as stable (#10888) @alexfauquette +- [docs] Document how to hide the legend (#10954) @alexfauquette + +### Core + +- [core] Adds new alpha version to version select on the docs (#10944) @michelengelen +- [core] Fix GitHub title tag consistency @oliviertassinari + +## 6.18.0 + +_Nov 3, 2023_ + +We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 The Charts package is now officially stable! +- 🥧 Pie charts are now animated. +- 📈 Line charts now support partial data, and can interpolate missing data https://mui.com/x/react-charts/lines/#skip-missing-points. + + <img src="https://github.com/mui/mui-x/assets/3165635/d2d50b1b-ee29-4e4c-9ebe-629c06f3093e" width="683" height="436" alt="Charts partial data" /> + +- ✨ The data grid allows to ignore [diacritics](https://en.wikipedia.org/wiki/Diacritic) when filtering. +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.18.0` + +- [DataGrid] Allow to ignore [diacritics](https://en.wikipedia.org/wiki/Diacritic) when filtering (#10569) @cherniavskii +- [DataGrid] Fix a typo in `gridFilterApi` (#10786) @vu-dao-93 +- [DataGrid] Fix `undefined` row id (#10670) @romgrk +- [DataGrid] Make column autosizing work with dynamic row height (#10693) @cherniavskii +- [l10n] Allow to customize sorting label per column (#10839) @JerryWu1234 + +#### `@mui/x-data-grid-pro@6.18.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.18.0`. + +#### `@mui/x-data-grid-premium@6.18.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.18.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.18.0` + +- [pickers] Add reference links to calendar components (#10644) @michelengelen + +#### `@mui/x-date-pickers-pro@6.18.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.18.0`. + +### Charts / `@mui/x-charts@6.18.0` + +- [charts] Add animation on pie chart (#10782) @alexfauquette +- [charts] Add reference links to shared/misc chart components (#10660) @michelengelen +- [charts] Allows to connect nulls (#10803) @alexfauquette +- [charts] Fix axis highlight in dark mode (#10820) @LukasTy + +### Docs + +- [docs] Add a data grid recipe for autosizing columns after fetching row-data (#10822) @michelengelen +- [docs] Add a data grid recipe showing how to remove cell outline on `focus` (#10843) @michelengelen +- [docs] Add demo about how to use charts margin (#10886) @alexfauquette +- [docs] Improve custom field input demos readability (#10559) @LukasTy + +### Core + +- [core] Generate `slot` API descriptions based on `slots` or `components` (#10879) @LukasTy + +## 6.17.0 + +_Oct 27, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 The Tree View package is now officially stable! + +![tree-view-example](https://github.com/mui/mui-x/assets/550141/77d1fe66-d912-49ba-b38f-b853fb90446a) + +- ✨ Improve the handling of non-numeric values by Data Grid aggregation +- 🚀 Support lines with different domains on the line charts +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.17.0` + +- [DataGrid] Allow custom debounce time for row positions calculation (#10708) @cherniavskii +- [DataGrid] Persist stable row index for focused row (#10674) @cherniavskii + +#### `@mui/x-data-grid-pro@6.17.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.17.0`, plus: + +- [DataGridPro] Fix `undefined` values passed to `valueFormatter` for tree leaf nodes (#10748) @cherniavskii + +#### `@mui/x-data-grid-premium@6.17.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.17.0`, plus: + +- [DataGridPremium] Fix `avg` aggregation to ignore non-numeric values (#10787) @cherniavskii +- [DataGridPremium] Fix `size` aggregation to ignore `undefined` values (#10745) @cherniavskii +- [DataGridPremium] Fix `sum` aggregation to ignore non-numeric values (#10730) @cherniavskii +- [DataGridPremium] Fix cell selection throwing index error on second page and beyond (#10784) @MBilalShafi + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.17.0` + +- [fields] POC: Use `contentEditable` on `FakeTextField` (#10779) @flaviendelangle +- [pickers] Fix weekday label localization (#10809) @LukasTy + +#### `@mui/x-date-pickers-pro@6.17.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.17.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.17` + +- [charts] Fix text position in Safari (#10815) @lhilgert9 +- [charts] Support lines with different domains (#10801) @alexfauquette + +### Tree View / `@mui/x-tree-view@6.17.0` + +No change + +### Docs + +- [docs] Correct editing related props' description (#10798) @MBilalShafi +- [docs] Fix RTL data grid demo (#10728) @oliviertassinari +- [docs] Fix unclosed warning (#10796) @flaviendelangle +- [docs] Improve performance of `Save and restore the state from external storage` recipe (#10811) @michelengelen + +- [test] Add missing type on `cleanText` utility function (#10780) @flaviendelangle + +## 6.16.3 + +_Oct 20, 2023_ + +We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Add a Data Grid recipe for saving & restoring state +- 💫 Support animations on the bar chart +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.16.3` + +- [DataGrid] Allow passing readonly arrays to `columns` and `sortingOrder` props (#10686) @pcorpet + +#### `@mui/x-data-grid-pro@6.16.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.16.3`. + +#### `@mui/x-data-grid-premium@6.16.3` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.16.3`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.16.3` + +- [fields] Correctly respect leading zeroes on seconds section (#10713) @flaviendelangle +- [fields] Use `onChange` instead of `onKeyPress` for Backspace editing (#10494) @flaviendelangle +- [pickers] Add reference links to DatePicker components (#10626) @michelengelen +- [pickers] Add reference links to clock components (#10645) @michelengelen +- [pickers] Add reference links to misc picker components (#10647) @michelengelen +- [pickers] Add reference links to toolbar components (#10646) @michelengelen +- [pickers] POC: Change the props received by the `FakeTextField` component (#10687) @flaviendelangle + +#### `@mui/x-date-pickers-pro@6.16.3` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.16.3`, plus: + +- [DateRangePicker] Fix touch based range dragging (#10664) @michelengelen + +### Charts / `@mui/x-charts@6.0.0-alpha.16` + +- [charts] Add reference links to area + bar chart components (#10652) @michelengelen +- [charts] Add reference links to line chart + sparkline components (#10650) @michelengelen +- [charts] Add reference links to pie + scatter chart components (#10653) @michelengelen +- [charts] Render only when `width` and `height` are resolved (#10714) @alexfauquette +- [charts] Support animation on `BarChart` (#9926) @alexfauquette +- [charts] Use new text component to avoid tick label overflow on x-axis (#10648) @alexfauquette + +### Docs + +- [docs] Add a recipe for saving and restoring `state` externally (#10722) @michelengelen +- [docs] Add example about how to add an axis (#10709) @alexfauquette +- [docs] Customization Playground - fix DesktopDatePicker sx props and styled examples (#10665) @noraleonte +- [docs] Improve meta description @oliviertassinari +- [docs] Make overview demo work in codesandbox (#10661) @alexfauquette + +### Core + +- [core] Update React renovate group with `@types` (#10723) @LukasTy +- [core] Update `styled-components` (#10733) @LukasTy + +## 6.16.2 + +_Oct 12, 2023_ + +We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: + +- 📊 Chart's legend text management has been reworked and contains breaking changes (#10138) @alexfauquette +- 📝 Add [Bulk editing](https://mui.com/x/react-data-grid/recipes-editing/#bulk-editing) demo (#10333) @cherniavskii +- 🚀 Column grouping now works smoothly with column pinning (#10518) @MBilalShafi +- 🌍 Improve Arabic (ar-SD) and Spanish (es-ES) locales +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.16.2` + +- [DataGrid] Fix `LazyLoading` demo crash (#10621) @MBilalShafi +- [DataGrid] Fix cells overlapping the scrollbar in iOS Safari (#10633) @cherniavskii +- [DataGrid] Fix `getRowId is not defined` error (#10613) @romgrk +- [DataGrid] Get quick filter to work OOTB with `date` and `dateTime` fields (#10636) @MBilalShafi +- [DataGrid] Make cursor for selectable cells to be `default` unless editable (#9997) @gitstart +- [DataGrid] Remove unnecessary syntax in JSDoc (#10567) @Lev-Shapiro +- [DataGrid] Update row hover behavior to match native hover (#10623) @cherniavskii +- [l10n] Improve Arabic (ar-SD) locale (#10625) @alabenyahia + +#### `@mui/x-data-grid-pro@6.16.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.16.2`, plus: + +- [DataGridPro] Improve column grouping and column pinning friendship (#10518) @MBilalShafi + +#### `@mui/x-data-grid-premium@6.16.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.16.2`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.16.2` + +- [DateTimePicker] Add support for `DigitalClock` view renderer (#10624) @LukasTy +- [fields] Bootstrap the multi-HTML input component (#10638) @flaviendelangle +- [pickers] Fix timezone `UTC` false positive (#10586) @alexfauquette +- [l10n] Improve Spanish (es-ES) locale (#10588) @eduardodallmann + +#### `@mui/x-date-pickers-pro@6.16.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.16.2`. + +### Charts / `@mui/x-charts@6.0.0-alpha.15` + +#### Breaking changes + +The charts have a new text display mechanism. +It adds line break support and avoids overlapping text in the legend. +This comes with some breaking changes. + +- The DOM structure is modified. An intermediary `<tspan />` element has been added. This can impact how your style is applied. + + ```diff + - <text>The label</text> + + <text><tspan>The label</tspan></text> + ``` + +- The top margin has been reduced from 100 to 50 to benefit from the denser legend. + +- To accurately compute the text size and then place it, styling should be provided as a JS object. For example, to set the legend font size, you should do: + ```jsx + <PieChart + {/** ... */} + slotProps={{ + legend: { + labelStyle: { + fontSize: 16, + }, + }, + }} + /> + ``` + Support for other text elements (axis labels and tick labels) will be implemented in follow-up PR. + +#### Changes + +- [charts] Fix typo between internal/external variable (#10640) @alexfauquette +- [charts] Improve the management of the text (#10138) @alexfauquette + +### Docs + +- [docs] Add bulk editing demo (#10333) @cherniavskii +- [docs] Add reference links to DateRangePicker components (#10629) @michelengelen +- [docs] Add reference links to DateTimePicker components (#10628) @michelengelen +- [docs] Add reference links to picker field components (#10631) @michelengelen +- [docs] Added reference links to TimePicker components (#10627) @michelengelen +- [docs] Avoid Pickers playground error due to empty views (#10654) @LukasTy +- [docs] Fix DataGrid[Pro/Premium] reference links (#10620) @michelengelen + +### Core + +- [core] Bump monorepo (#10619) @alexfauquette +- [core] Update `no-response` workflow (#10491) @MBilalShafi +- [core] Update the issue templates to reflect the new support workflow (#10651) @MBilalShafi +- [test] Fix `testEval` not invoking test assertions (#10587) @cherniavskii +- [test] Fix dev mode warning (#10610) @oliviertassinari +- [test] Set UUID chance seed in visual tests (#10609) @oliviertassinari + +## 6.16.1 + +_Oct 6, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 🥧 Support interaction with pie chart +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.16.1` + +- [DataGrid] Add a new demo with sparklines (#9228) @flaviendelangle +- [DataGrid] Fix autosize missing a few pixels (#10471) @romgrk +- [DataGrid] Make `disableColumnSelector` demo idempotent (#10548) @MBilalShafi + +#### `@mui/x-data-grid-pro@6.16.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.16.1`. + +#### `@mui/x-data-grid-premium@6.16.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.16.1`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.16.1` + +- [pickers] Avoid calendar layout shifting when changing views (#10541) @LukasTy +- [pickers] Fix clearable behavior when disabled (#10542) @noraleonte +- [pickers] Improve customization playground examples (#10544) @noraleonte + +#### `@mui/x-date-pickers-pro@6.16.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.16.1`, plus: + +- [DateRangePicker] Fix `InputProps` propagation in multi input (#10564) @alexfauquette + +### Charts / `@mui/x-charts@6.0.0-alpha.14` + +- [charts] Display cursor pointer for pie chart only if `onClick` is provided (#10551) @giladappsforce +- [charts] Add `onClick` prop to PieChart (#10506) @giladappsforce +- [charts] Support `slots`/`slotProps` for the tooltip (#10515) @alexfauquette + +### Docs + +- [docs] Add `DateRangePicker` example with a `Button` trigger (#10485) @LukasTy +- [docs] Add section about disabling columns panel (#10328) @MBilalShafi +- [docs] Add section about overriding slots to base concepts (#10421) @noraleonte +- [docs] Add "What's new" page listing all release announcements (#9727) @joserodolfofreitas +- [docs] Update RTL Support section of the grid localization docs (#10561) @MBilalShafi + +### Core + +- [core] Fix casing consistency with legal and marketing content @oliviertassinari +- [core] Revert the link in the priority support ticket description (#10517) @michelengelen +- [changelog] Polish image @oliviertassinari + +## 6.16.0 + +_Sep 29, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Add a clearable behavior to all the single input pickers and fields (#9095) @noraleonte + + The pickers and fields now have an out-of-the box implementation for clearing the field value. You can see the documentation for this behavior on the [Date Picker documentation](https://mui.com/x/react-date-pickers/date-picker/#clearing-the-value). + + <img width="337" height="139" alt="Clearable behavior" src="https://github.com/mui/mui-x/assets/3165635/a5407cb6-0b8a-443c-b4b9-1f81ceb4d087"> + +- 💫 Add Date Picker customization playground (#9581) @noraleonte + + You can play around with style customization options on the [Date Picker documentation](https://mui.com/x/react-date-pickers/date-picker/#customization). + + We are thrilled to hear your feedback about this functionality! + +- 🚀 Fix header filters menu auto closing on render (#10483) @MBilalShafi +- 🎯 Fix column headers scroll when theme scoping is used (#10437) @cherniavskii +- 🌍 Improve Russian (ru-RU) locale on the data grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.16.0` + +- [DataGrid] Fix column headers scroll when theme scoping is used (#10437) @cherniavskii +- [DataGrid] Rename `global` to `globalScope` due to Jest issue (#10470) @romgrk +- [l10n] Improve Russian (ru-RU) locale (#10464 and #10407) @NKodos + +#### `@mui/x-data-grid-pro@6.16.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.16.0`, plus: + +- [DataGridPro] Fix header filters menu auto closing on render (#10483) @MBilalShafi + +#### `@mui/x-data-grid-premium@6.16.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.16.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.16.0` + +- [pickers] Add warning to `shouldDisableDate` validation (#10502) @michelengelen +- [pickers] Implement `clearable` field behavior (#9095) @noraleonte +- [pickers] Refactor `dayOfWeekFormatter` (#10345) @michelengelen + +#### `@mui/x-date-pickers-pro@6.16.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.16.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.13` + +- [charts] Share upfront future Pro features (#10465) @oliviertassinari + +### Tree View / `@mui/x-tree-view@6.0.0-beta.0` + +- [TreeView] Do not try to focus a collapsed node when re-focusing the TreeView (#10422) @flaviendelangle +- [TreeView] Fix the typing of the `Multiple` generic (#10478) @flaviendelangle + +### Docs + +- [docs] Correct the typo in data grid api docs (#10477) @MBilalShafi +- [docs] Add customization playground (#9581) @noraleonte +- [docs] Fix Tree View product ID (#10428) @oliviertassinari +- [docs] Fix demo crashing when all rows are deleted (#10438) @cherniavskii +- [docs] Fix mobile scrollbar column resize (#10455) @oliviertassinari +- [docs] Fix usage of `GridRenderCellParams` interface (#10435) @cherniavskii + +### Core + +- [core] Fix typo in header data grid quick filter @oliviertassinari +- [core] Group D3 renovate PRs (#10480) @flaviendelangle +- [core] Link the priority support page (#10495) @michelengelen +- [core] Move the pickers describes to the test utils folder (#10490) @flaviendelangle +- [core] Priority Support casing normalization @oliviertassinari +- [core] Remove automated DataGrid performance tests (#10414) @romgrk +- [core] Sync `prism-okaidia.css` with docs-infra @oliviertassinari +- [core] Update issue actions & templates (#10375) @romgrk +- [core] Update release guide (#10468) @DanailH + +## 6.15.0 + +_Sep 22, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Implement columns auto-sizing (#10180) @romgrk +- 🎁 Add support for `getRowsToExport` option to print export on the data grid (#10084) @zreecespieces +- 🌍 Improve Finnish (fi-FI) locale +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.15.0` + +- [DataGrid] Add support for `getRowsToExport` option to print export (#10084) @zreecespieces +- [DataGrid] Fix dev warning about `InputLabelProps` (#10413) @romgrk +- [DataGrid] Refactor `GridMenu` prop `onClickAway` to `onClose` (#10411) @romgrk +- [DataGrid] Restore focus after `GridMenu` closes (#10412) @romgrk +- [DataGrid] Fix typing of `GridActionsCellItem` (#10344) @romgrk +- [DataGrid] Hide `eval` from bundlers (#10329) @romgrk +- [DataGrid] Add `border: 0` to unmounted focused cell to avoid layout shifts in that row (#10318) @lauri865 + +#### `@mui/x-data-grid-pro@6.15.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.15.0`, plus: + +- [DataGridPro] Implement columns auto-sizing (#10180) @romgrk +- [DataGridPro] Fix keyboard navigation issue in header filters (#10358) @MBilalShafi +- [DataGridPro] Add missing row hover styles (#10252) @cherniavskii +- [DataGridPro] Make default filter items have stable references in header filters (#10338) @MBilalShafi + +#### `@mui/x-data-grid-premium@6.15.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.15.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.15.0` + +- [pickers] Support tokens without spaces (#10185) @alexfauquette +- [l10n] Improve Finnish (fi-FI) locale (#10346) @samijouppila + +#### `@mui/x-date-pickers-pro@6.15.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.15.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.12` + +- [charts] Fix sparkline scale and rendering (#10402) @alexfauquette +- [charts] Remove components from `@mui/material` (#10115) @alexfauquette + +### Tree View / `@mui/x-tree-view@6.0.0-alpha.4` + +- [TreeView] Split features into plugins to prepare for Pro version (#10123) @flaviendelangle + +### Docs + +- [docs] Add charts documentation pages to complete pricing table (#10394) @alexfauquette +- [docs] Add missing MIT packages on the Licensing page (#10348) @flaviendelangle +- [docs] Clearer component pattern @oliviertassinari +- [docs] Easier to understand demo (#10370) @oliviertassinari +- [docs] Fix `301` to Material UI @oliviertassinari +- [docs] Improve the column visibility section (#10327) @MBilalShafi +- [docs] Improve the documentation section `rowIdentifier` (#10326) @MBilalShafi +- [docs] Improve pickers localization documentation (#10202) @flaviendelangle +- [docs] Polish typescript ref usage (#10359) @oliviertassinari +- [docs] Improve charts tooltip wording (#10406) @alexfauquette + +### Core + +- [core] Cleanup GitHub issues template (#10372) @romgrk +- [core] Fix Circle CI OOM (#10385) @romgrk +- [core] Improve sleep test helper @oliviertassinari +- [core] Remove unwanted prefixes @oliviertassinari +- [core] Remove duplicate label @oliviertassinari +- [core] Simplify source @oliviertassinari +- [core] Upgrade monorepo (#10425) @cherniavskii +- [core] Upgrade monorepo to have the new typescript-to-proptype (#10224) @flaviendelangle +- [test] Do not use deprecated adapter methods (#10416) @flaviendelangle +- [test] Name test suites according to sentence case (#10429) @alexfauquette + +## 6.14.0 + +_Sep 14, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Fix `YearCalendar` and `MonthCalendar` accessibility (#10312) @LukasTy + + The `YearCalendar` and `MonthCalendar` items role has been changed from `button` to `radio` in order to improve the component's a11y support. + If you were relying on the mentioned components having a `button` role for items, you will need to update your usage to expect a `radio` role instead. + +- 🌍 Improve Japanese (ja-JP), Persian (fa-IR), and Vietnamese (vi-VN) locales on the data grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.14.0` + +- [l10n] Improve Japanese (ja-JP) locale (#10299) @makoto14 +- [l10n] Improve Persian (fa-IR) locale (#10277) @aminsaedi +- [l10n] Improve Vietnamese (vi-VN) locale (#10280) @khangnguyen2100 + +#### `@mui/x-data-grid-pro@6.14.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.14.0`. + +#### `@mui/x-data-grid-premium@6.14.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.14.0`, plus: + +- [DataGridPremium] Fix clipboard import cutting off at 100 rows (#9930) @gitstart + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.14.0` + +- [pickers] Fix `YearCalendar` and `MonthCalendar` a11y (#10312) @LukasTy +- [pickers] Localize `TimeClock` meridiem text (#10324) @LukasTy + +#### `@mui/x-date-pickers-pro@6.14.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.14.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.11` + +- [charts] Add default `barGapRatio` and increase `categoryGapRatio` (#10317) @LukasTy +- [charts] Enable `eslint` on the package (#10330) @LukasTy + +### Tree View / `@mui/x-tree-view@6.0.0-alpha.3` + +- [TreeView] Fix box-sizing dependency (#10255) @oliviertassinari + +### Docs + +- [docs] Add conditional range picker props example (#10227) @LukasTy +- [docs] Add toolbar to the multi-filters demo (#10223) @MBilalShafi +- [docs] Avoid the use of "We" @oliviertassinari +- [docs] Clarify MUI vs. MUI Core difference @oliviertassinari +- [docs] Enable `ariaV7` flag for demos using `useDemoData` hook (#10204) @cherniavskii +- [docs] Fix Tree View link to API references (#10282) @oliviertassinari +- [docs] Fix image layout shift (#10313) @oliviertassinari +- [docs] Fix link to MUI X from readme logo @oliviertassinari +- [docs] Fix redirection to Base UI URLs @oliviertassinari +- [docs] Improve Tree View demos (#10268) @oliviertassinari +- [docs] Improve docs for ref type props (#10273) @michelengelen +- [docs] Improve npm package README (#10269) @oliviertassinari +- [docs] Improve the clarity of the npm links @oliviertassinari +- [docs] Keep installation readme simple @oliviertassinari +- [docs] Make each component feel more standalone @oliviertassinari + +### Core + +- [core] Add types extension for clarity @oliviertassinari +- [core] Set logo height to fix layout shift in GitHub @oliviertassinari +- [core] TrapFocus was renamed to FocusTrap @oliviertassinari + +## 6.13.0 + +_Sep 8, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Fix `anchorRef` behavior on range pickers (#10077) @LukasTy + + The range picker popup will now be anchored to the first input element and left aligned like other pickers. + +- 🌍 Improve Slovak (sk-SK) locale on the data grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.13.0` + +- [DataGrid] Allow to override the default overlay height in `autoHeight` mode (#10203) @cherniavskii +- [DataGrid] Allow to override the default row count component in footer (#10063) @hungmanhle +- [DataGrid] Fix an error when hovering on a row, the background changed to white (#10214) @chucamphong +- [DataGrid] Fix custom column docs, remove legacy `extendType` (#10175) @oliviertassinari +- [DataGrid] Make the pinned rows be on top of the no rows overlay (#9986) @DanailH +- [l10n] Improve Slovak (sk-SK) locale (#10182) @msidlo + +#### `@mui/x-data-grid-pro@6.13.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.13.0`, plus: + +- [DataGridPro] Fix column resize with pinned rows (#10229) @cherniavskii + +#### `@mui/x-data-grid-premium@6.13.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.13.0`, plus: + +- [DataGridPremium] Fix aggregated column resizing (#10079) @cherniavskii + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.13.0` + +- [pickers] Respect the adapter locale in `AdapterMoment.getWeekdays` (#10221) @flaviendelangle + +#### `@mui/x-date-pickers-pro@6.13.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.13.0`, plus: + +- [DateRangePicker] Fix `anchorRef` behavior (#10077) @LukasTy + +### Charts / `@mui/x-charts@6.0.0-alpha.10` + +- [charts] Remove require condition from package.json exports (#10272) @Janpot + +### Tree View / `@mui/x-tree-view@6.0.0-alpha.2` + +- [TreeView] Add missing export (#10245) @flaviendelangle + +### Docs + +- [docs] Add a `Getting Started` page for the Tree View (#10218) @flaviendelangle +- [docs] Add pickers `Custom opening button` page (#10200) @flaviendelangle +- [docs] Add pie chart demo with a center label (#10220) @giladappsforce +- [docs] Do not document ignored components (#10258) @flaviendelangle +- [docs] Fix charts demo using too deep import (#10263) @LukasTy +- [docs] Fix `e.g.` typo @oliviertassinari +- [docs] Fix npm package indentation @oliviertassinari +- [docs] Fix typo in tree view docs @oliviertassinari +- [docs] Improve the week picker example (#8257) @flaviendelangle +- [docs] Include code links in the data grid demo (#10219) @cherniavskii +- [docs] Polish page for SEO (#10216) @oliviertassinari +- [docs] Use `Base UI` `Portal` for the quick filter recipe (#10188) @DanailH + +### Core + +- [core] Finish migration to GA4 @oliviertassinari +- [core] Fix yarn docs:create-playground script @oliviertassinari +- [core] Move @mui/base from peer dependency to dependency (#10215) @oliviertassinari +- [core] Prevent `e.g.` typo (#10193) @oliviertassinari +- [core] Remove unused `babel-plugin-tester` package (#10243) @LukasTy + +## 6.12.1 + +_Aug 31, 2023_ + +We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: + +- 🏎️ Perf improvement for line charts +- 🎁 Add `referenceDate` prop on pickers (#9991) @flaviendelangle + Find out more about this feature in the [documentation section](https://mui.com/x/react-date-pickers/base-concepts/#reference-date-when-no-value-is-defined). +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.12.1` + +- [DataGrid] Add a recipe showing how to render components outside of the grid (#10121) @DanailH +- [DataGrid] Fix `valueFormatter` being persisted on column type change (#10041) @cherniavskii +- [DataGrid] Fix error when keyboard navigating an empty grid (#10081) @romgrk +- [DataGrid] Replace timeout with `useTimeout` (#10179) @romgrk + +#### `@mui/x-data-grid-pro@6.12.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.12.1`. + +#### `@mui/x-data-grid-premium@6.12.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.12.1`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.12.1` + +- [pickers] Add `referenceDate` on picker components (and `DateRangeCalendar`) (#9991) @flaviendelangle + +#### `@mui/x-date-pickers-pro@6.12.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.12.1`. + +### Charts / `@mui/x-charts@6.0.0-alpha.9` + +- [charts] Move the line item highligh into a dedicated component (#10117) @alexfauquette + +### Docs + +- [docs] Add `DemoContainer` and `DemoItem` JSDoc (#10186) @LukasTy +- [docs] Add link to `custom layout` page (#10184) @LukasTy +- [docs] Add tree view nav item (#10181) @LukasTy +- [docs] Fix wrong chart tooltip reference (#10169) @oliviertassinari +- [docs] Improve chart SEO (#10170) @oliviertassinari +- [docs] Precise expired license key condition (#10165) @oliviertassinari +- [docs] Reorganize the page menu (#10139) @alexfauquette + +### Core + +- [core] Update babel configs (#9713) @romgrk +- [test] Disable false positive e2e test on webkit (#10187) @LukasTy + +## 6.12.0 + +_Aug 25, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 📊 Support horizontal bar chart +- 💫 Improved animations on Android devices +- 🌍 Improve Ukrainian (uk-UA) locale on the data grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.12.0` + +- [DataGrid] Allow print export for more than 100 rows (#10045) @MBilalShafi +- [l10n] Improve Ukrainian (uk-UA) locale (#10076) @mkundos + +#### `@mui/x-data-grid-pro@6.12.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.12.0`. + +#### `@mui/x-data-grid-premium@6.12.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.12.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.12.0` + +- [fields] Do not clamp day of month (#9973) @flaviendelangle +- [pickers] Fix `ownerState` on `desktopPaper` slot props (#10103) @LukasTy +- [pickers] Fix to `transform-origin` when popper opens to `top` (#10069) @LukasTy +- [pickers] Fix `YearCalendar` scrolling (#10135) @LukasTy +- [pickers] Improve the typing of the adapter `dateWithTimezone` method (#10029) @flaviendelangle +- [pickers] Make `openPickerButton` toggle picker (#10109) @noraleonte +- [pickers] Update `reduceAnimations` default rule (#9864) @LukasTy + +#### `@mui/x-date-pickers-pro@6.12.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.12.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.8` + +- [charts] Fix import issue (#10111) @alexfauquette +- [charts] Fix `slotProps` propagation (#10105) @alexfauquette +- [charts] Support horizontal bar chart (#9992) @alexfauquette + +### Docs + +- [docs] Address charts docs feedback (#10119) @alexfauquette +- [docs] Capitalization convention pickers @oliviertassinari +- [docs] Fix a11y issue on plan links (#10026) @oliviertassinari +- [docs] Fix some charts horizontal overflow on mobile devices (#10082) @cupok +- [docs] Fix typo in quick filter @oliviertassinari +- [docs] Fix typo in the timezone page (#10073) @flaviendelangle + +### Core + +- [core] Bump monorepo (#10129) @LukasTy +- [core] Document a bit `useLazyRef` @oliviertassinari +- [core] Enable strict type checking options in the top-level tsconfig (#9925) @cherniavskii +- [core] Increase global e2e timeout (#10134) @LukasTy +- [core] Remove outdated link (#10125) @oliviertassinari +- [core] Update `no-response` workflow (#10102) @DanailH + +## 6.11.2 + +_Aug 17, 2023_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- 🏎️ Lower the filtering delay in the grid +- 🌍 Improve Spanish (es-ES) locale on the data grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.11.2` + +- [DataGrid] Fix `eval` blocked by CSP (#9863) @romgrk +- [DataGrid] Fix row id bug (#10051) @romgrk +- [DataGrid] Honor `disableExport` flag in Print Export (#10044) @MBilalShafi +- [DataGrid] Lower filter debounce delay (#9712) @romgrk +- [DataGrid] Unhide potential ref binding issue (#9965) @oliviertassinari +- [l10n] Improve Chinese (zh-CN) and Chinese(traditional) (zh-TW) locales (#9999) @MyNameIsTakenOMG +- [l10n] Improve Spanish (es-ES) locale (#10037) @Macampu420 + +#### `@mui/x-data-grid-pro@6.11.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.11.2`. + +#### `@mui/x-data-grid-premium@6.11.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.11.2`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.11.2` + +- [pickers] Fix month switcher RTL (#10003) @alexfauquette +- [pickers] Follow-up on using device motion reduction preference (#9858) @LukasTy +- [pickers] Pass the shortcut information in the `onChange` context (#9985) @flaviendelangle +- [pickers] Replace `Grid` toolbar component with a styled `div` (#10052) @LukasTy + +#### `@mui/x-date-pickers-pro@6.11.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.11.2`. + +### Docs + +- [docs] Add migration guide for the Tree View (#9987) @flaviendelangle +- [docs] Fix en-US changelog @oliviertassinari +- [docs] Update column types (#10040) @romgrk + +### Core + +- [core] Remove unnecessary Box (#9831) @oliviertassinari +- [core] Set GitHub Action top level permission @oliviertassinari +- [core] Split the pickers test utils (#9976) @flaviendelangle + +## 6.11.1 + +_Aug 11, 2023_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- 💫 Add theme augmentation to `@mui/x-tree-view` +- 📈 Enable charts customization using `slot` and `slotProps` props +- 🌍 Improve Finnish (fi-FI) and Icelandic (is-IS) locales on the pickers +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.11.1` + +- [DataGrid] `getCellAggregationResult`: Handle `null` `rowNode` case (#9915) @romgrk + +#### `@mui/x-data-grid-pro@6.11.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.11.1`. + +#### `@mui/x-data-grid-premium@6.11.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.11.1`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.11.1` + +- [fields] Use `numeric` `inputmode` instead of `tel` (#9918) @LukasTy +- [pickers] Always respect locale when formatting meridiem (#9979) @flaviendelangle +- [pickers] Call `onChange` when selecting a shortcut with `changeImportance="set"` (#9974) @flaviendelangle +- [pickers] Refactor `themeAugmentation` `styleOverrides` (#9978) @LukasTy +- [l10n] Improve Finnish (fi-FI) locale (#9795) @kurkle +- [l10n] Improve Icelandic (is-IS) locale (#9639) @magnimarels + +#### `@mui/x-date-pickers-pro@6.11.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.11.1`. + +### Charts / `@mui/x-charts@6.0.0-alpha.7` + +- [charts] Fix label and tick alignment (#9952) @LukasTy +- [charts] Remove not functional component `styleOverrides` (#9996) @LukasTy +- [charts] Set custom ticks number (#9922) @alexfauquette +- [charts] Use `slot`/`slotProps` for customization (#9744) @alexfauquette +- [charts] Extend cheerful fiesta palette (#9980) @noraleonte + +### Tree View / `@mui/x-tree-view@6.0.0-alpha.1` + +- [TreeView] Add theme augmentation (#9967) @flaviendelangle + +### Docs + +- [docs] Clarify the `shouldDisableClock` migration code options (#9920) @LukasTy + +### Core + +- [core] Port GitHub workflow for ensuring triage label is present (#9924) @DanailH +- [docs-infra] Fix the import samples in Api pages (#9898) @alexfauquette + +## 6.11.0 + +_Aug 4, 2023_ + +We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: + +- ⌚️ Move the tree view component from `@mui/lab` package + + The `<TreeView />` component has been moved to the MUI X repository. + It is now accessible from its own package: `@mui/x-tree-view`. + +- 🌍 Improve Hebrew (he-IL), Finnish (fi-FI), and Italian (it-IT) locales on the data grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.11.0` + +- [DataGrid] Add `ariaV7` experimental flag (#9496) @cherniavskii +- [DataGrid] Fix cell size when column width is set to `undefined` (#9871) @gitstart +- [l10n] Improve Hebrew (he-IL) locale (#9820) @itayG98 +- [l10n] Improve Finnish (fi-FI) locale (#9848) @sambbaahh +- [l10n] Improve Italian (it-IT) locale (#9627) @fabio-rizzello-omnia + +#### `@mui/x-data-grid-pro@6.11.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.11.0`. + +#### `@mui/x-data-grid-premium@6.11.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.11.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.11.0` + +- [fields] Correctly handle events with a complete value insertion (#9896) @LukasTy +- [fields] Fix hours editing on dayjs with timezone and DST (#9901) @flaviendelangle +- [fields] Fix section clearing with timezone (#9819) @flaviendelangle +- [pickers] Add `CalendarHeader` slot (#7784) @flaviendelangle +- [pickers] Allow to override the `InputProps` of the `TextField` using the `slotProps` (#9849) @flaviendelangle +- [pickers] Allow to override the opening aria text using the `localeText` prop on the pickers (#9870) @flaviendelangle +- [pickers] Fix `sx` and `className` props on `MobileDateRangePicker` (#9853) @flaviendelangle +- [pickers] Fix default descriptions (#9887) @LukasTy +- [pickers] Fix offset management on dayjs adapter (#9884) @flaviendelangle +- [pickers] Use device motion reduction preference (#9823) @LukasTy + +#### `@mui/x-date-pickers-pro@6.11.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.11.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.6` + +- [charts] Add TS definition to the exported elements (#9885) @alexfauquette +- [charts] Add sparkline (#9662) @alexfauquette +- [charts] Fix missing configuration types (#9886) @alexfauquette +- [charts] Introduce dataset to simplify plot of data from API (#9774) @alexfauquette + +### Tree View / `@mui/x-tree-view@6.0.0-alpha.0` + +- [TreeView] Add missing exported types (#9862) @flaviendelangle +- [TreeView] Add tree view to changelog generator script (#9903) @MBilalShafi +- [TreeView] Create the package on the X repository (#9798) @flaviendelangle +- [TreeView] Improve props typing (#9855) @flaviendelangle + +### Docs + +- [docs] Add Tree View doc (#9825) @flaviendelangle +- [docs] Add charts nav item (#9821) @LukasTy +- [docs] Add charts to MUI X introduction pages (#9704) @joserodolfofreitas +- [docs] Add example for avoiding picker views layout shift (#9781) @noraleonte +- [docs] Consistency of Next.js App Router @oliviertassinari +- [docs] Fix API page regression: bring back slots section (#9866) @alexfauquette +- [docs] Fix demo using Pro while it's MIT (#9842) @oliviertassinari +- [docs] Get ready for next docs-infra change @oliviertassinari +- [docs] Improve the slots documentation `Recommended usage` section (#9892) @flaviendelangle + +### Core + +- [core] Fix font loading issue dev-mode (#9843) @oliviertassinari +- [core] Fix pipeline (#9894) @LukasTy +- [core] Fix the link-check script on Windows (#9888) @alexfauquette +- [core] Fix v7 capitalization (#9878) @oliviertassinari +- [core] Regen doc (#9902) @flaviendelangle +- [core] Remove benchmark package (#9413) @LukasTy +- [core] Stop using the deprecated `JSX` global namespace (#9854) @flaviendelangle +- [core] Update monorepo (#9846) @flaviendelangle +- [core] Update tree data API docs (#9827) @cherniavskii +- [test] Add pickers e2e tests (#9747) @LukasTy +- [test] Data grid e2e tests follow-up (#9822) @cherniavskii + +## 6.10.2 + +_Jul 27, 2023_ + +We'd like to offer a big thanks to the 13 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Improve scatter charts performance +- 📚 Redesigned component API documentation and side navigation +- 🐞 Bugfixes + +### Data Grid + +#### `@mui/x-data-grid@6.10.2` + +- [DataGrid] Fix quick filter & aggregation error (#9729) @romgrk +- [DataGrid] Fix row click propagation causing error in nested grid (#9741) @cherniavskii +- [DataGrid] Keep focused cell in the DOM (#7357) @yaredtsy +- [l10n] Improve Finnish (fi-FI) locale (#9746) @sambbaahh + +#### `@mui/x-data-grid-pro@6.10.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.10.2`. + +#### `@mui/x-data-grid-premium@6.10.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.10.2`, plus: + +- [DataGridPremium] Allow to customize grouping cell offset (#9417) @cherniavskii + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.10.2` + +- [pickers] Remove the `endOfDate` from `DigitalClock` timeOptions (#9800) @noraleonte + +#### `@mui/x-date-pickers-pro@6.10.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.10.2`. + +### Charts / `@mui/x-charts@6.0.0-alpha.5` + +- [charts] Improve JSDoc for axis-related props (#9779) @flaviendelangle +- [charts] Improve performances of Scatter component (#9527) @flaviendelangle + +### Docs + +- [docs] Add `pnpm` in more places @oliviertassinari +- [docs] Add `pnpm` installation instructions for MUI X (#9707) @richbustos +- [docs] Align pickers "uncontrolled vs controlled" sections (#9772) @LukasTy +- [docs] Apply style guide to the data grid Layout page (#9673) @richbustos +- [docs] Differentiate between packages in `slotProps` docs (#9668) @cherniavskii +- [docs] Fix charts width in axis pages (#9801) @alexfauquette +- [docs] Fix wrong prop name in the Editing page (#9753) @m4theushw +- [docs] New component API page and side nav design (#9187) @alexfauquette +- [docs] Update overview page with up to date information about the plans (#9512) @joserodolfofreitas + +### Core + +- [core] Use PR charts version in preview (#9787) @alexfauquette +- [license] Allow overriding the license on specific parts of the page (#9717) @Janpot +- [license] Throw in dev mode after 30 days (#9701) @oliviertassinari +- [license] Only throw in dev mode (#9803) @oliviertassinari +- [test] Fail the CI when new unexpected files are created (#9728) @oliviertassinari + +## 6.10.1 + +_Jul 20, 2023_ + +We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Fix CSV export for values containing double quotes +- 🚀 Improve tree data performance +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.10.1` + +- [DataGrid] Filtering performance: compile filter applier with `eval` (#9635) @romgrk +- [DataGrid] Fix CSV export for values containing double quotes (#9667) @cherniavskii +- [DataGrid] Fix column type change not working correctly (#9594) @cherniavskii +- [DataGrid] Fix quick filter `undefined` row error (#9708) @romgrk +- [DataGrid] Prevent `viewportOuterSize.height` going negative (#9664) @gitstart +- [DataGrid] Update focused cell on page change via keyboard (#9203) @m4theushw +- [DataGrid] Wait for remote stylesheets to load before print (#9665) @cherniavskii + +#### `@mui/x-data-grid-pro@6.10.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.10.1`, plus: + +- [DataGridPro] Improve tree data performance (#9682) @cherniavskii +- [DataGridPro] Prevent affecting cells from child DataGrid when resizing a column (#9670) @m4theushw + +#### `@mui/x-data-grid-premium@6.10.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.10.1`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.10.1` + +- [fields] Fix `format` and `value` update order (#9715) @LukasTy +- [pickers] Remove `require` usage in comment (#9675) @LukasTy + +#### `@mui/x-date-pickers-pro@6.10.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.10.1`. + +### Charts / `@mui/x-charts@6.0.0-alpha.4` + +- [charts] Fix blinking in responsive charts and extremums computation for line charts (#9734) @alexfauquette +- [charts] Use ESM with imports (#9645) @alexfauquette + +### Docs + +- [docs] Add additional note for license key installation on Next.js (#9575) @joserodolfofreitas +- [docs] Add paragraph about managing focus of custom edit components (#9658) @m4theushw +- [docs] Add unsorted icon slot to the custom sort icons demo (#9169) @d4rekanguok +- [docs] Disable ad for onboarding pages (#9700) @oliviertassinari +- [docs] Disabling ads without toolbar has no effect @oliviertassinari +- [docs] Fix Date Pickers usage to Title Case (#9680) @richbustos +- [docs] Fix sorting in `CustomSortIcons` demo (#9656) @MBilalShafi +- [docs] Improve the UI for pickers introduction (#9644) @alexfauquette +- [docs] Improve the demo design @oliviertassinari +- [docs] Localization progress, polish (#9672) @oliviertassinari +- [docs] Normalize the WIP items (#9671) @oliviertassinari + +### Core + +- [core] Add `validate` command (#9714) @romgrk +- [changelog] Update generator to new format @oliviertassinari + +## 6.10.0 + +_Jul 13, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- ⚡ Improve data grid filtering performance +- 🎁 Include column groups in the CSV export +- 🌍 Improve Polish (pl-PL) locale for the data grid +- 🌍 Improve Norwegian (nb-NO) locale for the pickers + +### Data Grid + +#### `@mui/x-data-grid@6.10.0` + +- [DataGrid] Allow to exclude hidden columns from the quick filter (#9610) @cherniavskii +- [DataGrid] Filtering performance: remove indirection (#9334) @romgrk +- [DataGrid] Fix props propagation on `GridToolbarQuickFilter` component (#9633) @giladappsforce +- [DataGrid] Fix quick filter input lag (#9630) @cherniavskii +- [DataGrid] Include column groups in the CSV export (#9585) @cherniavskii +- [DataGrid] Make `rowExpansionChange` event public (#9611) @MBilalShafi +- [l10n] Improve Polish (pl-PL) locale (#9625) @ch1llysense + +#### `@mui/x-data-grid-pro@6.10.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.10.0`. + +#### `@mui/x-data-grid-premium@6.10.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.10.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.10.0` + +- [pickers] Fix date calendar issues (#9652) @LukasTy +- [l10n] Improve Norwegian (nb-NO) locale (#9608) @JosteinBrevik + +#### `@mui/x-date-pickers-pro@6.10.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.10.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.3` + +- [charts] Allow configuring bar size (#9632) @alexfauquette +- [charts] Simplify custom components creation (#9561) @alexfauquette + +### Docs + +- [docs] Add slot components usage alert (#9660) @LukasTy +- [docs] Fix casing Cell selection @oliviertassinari + +### Core + +- [core] Disambiguate eslint plugin name @oliviertassinari +- [core] Update priority support issue template and prompt (#9574) @DanailH +- [changelog] Clarify each plan (#9446) @oliviertassinari +- [license] Fix error terminology (#9614) @oliviertassinari + +## 6.9.2 + +_Jul 6, 2023_ + +We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Auto-scroll when making range selection (#8661) @m4theushw + +- 📚 New page: Components lifecycle (#8372) @flaviendelangle + + Clarify pickers events and value updates in a [single docs page](https://mui.com/x/react-date-pickers/lifecycle/). + +- 🥧 Add pie chart component + + They are fresh from the code editor. You can visit [pie charts docs](https://mui.com/x/react-charts/pie/) or their [demo page](https://mui.com/x/react-charts/pie-demo/). + + <img width="380" alt="pie-charts" src="https://github.com/mui/mui-x/assets/13808724/fe908c45-803c-4316-b913-dbd2f9f0551e"> + +- 🐞 Bugfixes + +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.9.2` + +- [DataGrid] Fix `RangeError` when using flex columns (#9554) @cherniavskii +- [DataGrid] Fix React 17 editing bug (#9530) @romgrk +- [DataGrid] Use `getRowId` in filtering (#9564) @romgrk +- [DataGrid] Correctly reflect `TablePagination`'s `rowsPerPageOptions` shape to `pageSizeOptions` (#9438) @burakkgunduzz +- [l10n] Improve Spanish (es-ES) locale (#9500) @fufex + +#### `@mui/x-data-grid-pro@6.9.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.9.2`. + +#### `@mui/x-data-grid-premium@6.9.2` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.9.2`, plus: + +- [DataGridPremium] Auto-scroll when making range selection (#8661) @m4theushw + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.9.2` + +- [pickers] Forward digital clock classes (#9555) @YoonjiJang +- [pickers] Rename `internal` folder to `internals` on `@mui/x-date-picker-pro` (#9571) @flaviendelangle + +#### `@mui/x-date-pickers-pro@6.9.2` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.9.2`. + +### Charts / `@mui/x-charts@6.0.0-alpha.2` + +- [charts] Add pie chart component (#9395) @alexfauquette + +### Docs + +- [docs] Add pickers playground (#9164) @LukasTy +- [docs] Fix API links for pickers (#9573) @alexfauquette +- [docs] Fix demos with `ToggleButtonGroup` (#9548) @flaviendelangle +- [docs] Fix typos in pagination documentation page (#9332) @RatherBeLunar +- [docs] Hide ads on paid content @oliviertassinari +- [docs] Move the charts in the sidebar (#9437) @flaviendelangle +- [docs] New page: Components lifecycle (#8372) @flaviendelangle +- [docs] Remove outdated header tag @oliviertassinari + +### Core + +- [core] Fix typo in priority support @oliviertassinari +- [core] Remove mention of Crowdin @oliviertassinari + +## 6.9.1 + +_Jun 30, 2023_ + +We'd like to offer a big thanks to the 13 contributors who made this release possible. Here are some highlights ✨: + +- 🔎 Add experimental API for faster filtering performance +- 🌍 Add Chinese (Hong Kong) (zh-HK) locale on the pickers +- 🌍 Improve Romanian (ro-RO) and Hungarian (hu-HU) translations on the pickers and the data grid +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.9.1` + +- [DataGrid] Add Joy UI `tooltip` and `loadingOverlay` slots (#9028) @cherniavskii +- [DataGrid] Add section about enabling pagination on Pro and Premium (#8759) @joserodolfofreitas +- [DataGrid] Don't forward `editCellState` prop to DOM element (#9501) @m4theushw +- [DataGrid] Add experimental API for faster filtering performance (#9254) @romgrk +- [DataGrid] Fix `nextFieldToFocus` to always be a visible column field when <kbd>Tab</kbd> key is pressed (#8314) @yaredtsy +- [DataGrid] Fix `Maximum call stack size exceeded` error when using fractional width (#9516) @cherniavskii +- [l10n] Improve Romanian (ro-RO) and Hungarian (hu-HU) translations (#9436) @noraleonte + +#### `@mui/x-data-grid-pro@6.9.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.9.1`, plus: + +- [DataGridPro] Don't throw error in column pinning (#9507) @romgrk +- [DataGridPro] Fix bug with `checkboxSelection` and treeData/grouping (#9418) @romgrk + +#### `@mui/x-data-grid-premium@6.9.1` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.9.1`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.9.1` + +- [DateTimePicker] Scroll to Digital Clock section only when selection changes (#9434) @LukasTy +- [pickers] Handle `keyDown` only when input is focused (#9481) @LukasTy +- [pickers] Add `referenceDate` prop on `TimeClock`, `DigitalClock` and `MultiSectionDigitalClock` (#9356) @flaviendelangle +- [l10n] Add Chinese (Hong Kong) (zh-HK) locale (#9468) @samchiu90 +- [l10n] Improve Romanian (ro-RO) translations (#9436) @noraleonte + +#### `@mui/x-date-pickers-pro@6.9.1` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.9.1`. + +### Charts / `@mui/x-charts@6.0.0-alpha.1` + +- [charts] Take responsive container from data grid (#9497) @alexfauquette +- [charts] Update README.md (#9426) @alexfauquette +- [charts] Fix typo and small refactor (#9526) @flaviendelangle + +### Docs + +- [docs] Add a recipe limiting to one expanded detail panel at a time (#9488) @cherniavskii +- [docs] Add missing upcoming flag without issue (#9449) @oliviertassinari +- [docs] Fix 301 when opening the charts @oliviertassinari +- [docs] Fix 404 link (#9435) @alexfauquette +- [docs] Fix `productId` logic (#9451) @oliviertassinari +- [docs] Update charts overview.md (#9429) @brentertz +- [docs] Avoid systematic usage of `"bg": "inline"` (#9499) @alexfauquette +- [docs] Display plan icon in ToC (#9490) @cherniavskii +- [docs] Remove "product" markdown header (#9517) @oliviertassinari + +### Core + +- [core] Add `edit-mode` to priority support action (#9483) @DanailH +- [core] Fix priority support prompt action (#9472) @DanailH +- [core] Update `uses` for priority support action (#9480) @DanailH +- [core] Bumb update monorepo (#9476) @alexfauquette +- [changelog] Fix media quality (#9439) @oliviertassinari +- [changelog] Remove height img attribute @oliviertassinari +- [test] Skip flaky row pinning tests in JSDOM (#9511) @cherniavskii + +## 6.9.0 + +_Jun 22, 2023_ + +We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 We released a new open-source package: `@mui/x-charts`. This package aims at simplifying the integration of charts into your dashboards. 📊 + + <img width="512" alt="charts" src="https://github.com/mui/mui-x/assets/3165635/41201d3c-16a4-442d-a230-68356e6b433d"> + + It already contains [line](https://mui.com/x/react-charts/lines/), [bar](https://mui.com/x/react-charts/bars/), and [scatter](https://mui.com/x/react-charts/scatter/) charts, with basic customization features. Check out the [documentation](https://mui.com/x/react-charts/) to see what it can do, and open issues to get the feature you need implemented. + +- 🚀 Introducing UTC and timezone support for pickers. + + <img width="774" src="https://github.com/mui/mui-x/assets/3165635/ad95a404-ee67-4aff-b996-ad6cbb322348" alt="Pickers time zone switching"> + + Visit the [documentation](https://mui.com/x/react-date-pickers/timezone/) to learn how to use it. + +- 🌍 Improve Brazilian Portuguese (pt-BR) on the data grid +- 🌍 Improve Czech (cs-CZ) locale on the pickers +- 🚅 Performance improvements +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.9.0` + +- [DataGrid] Filtering performance: use unmemoized selectors by default (#9287) @romgrk +- [DataGrid] Use container dimensions from `getComputedStyle` (#9236) @m4theushw +- [l10n] Improve Brazilian Portuguese (pt-BR) locale (#9404) @julioAz + +#### `@mui/x-data-grid-pro@6.9.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.9.0`. + +#### `@mui/x-data-grid-premium@6.9.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.9.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.9.0` + +- [fields] Ensure `minutesStep` is respected by fields arrows up/down (#9338) @alexfauquette +- [fields] Reset internal state when `referenceValue` changes (#9390) @adrianmxb +- [l10n] Improve Czech (cs-CZ) locale (#9397) @radimkafka +- [pickers] Add proper support for UTC and timezones (#8261) @flaviendelangle +- [pickers] Fix field section selection on `DateTimePicker` (#9342) @LukasTy +- [pickers] Reduce date range calendar vertical border width (#9368) @oliviertassinari +- [pickers] Reset fields internal state when pasting value (#9385) @alexfauquette + +#### `@mui/x-date-pickers-pro@6.9.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.9.0`. + +### Charts / `@mui/x-charts@6.0.0-alpha.0` + +- [charts] Allow to customize colors based on the theme mode (#9006) @alexfauquette +- [charts] Prepare the charts release (#9361) @alexfauquette +- [charts] Various improvements of charts docs (#9341) @alexfauquette + +### Docs + +- [docs] Add examples of using different time view renderers (#9360) @LukasTy +- [docs] Add recipe for single-click editing (#8365) @m4theushw +- [docs] Fix Base UI references (#9349) @oliviertassinari +- [docs] Fix random screenshot generation (#9364) @cherniavskii +- [docs] Remove random generation from chart doc example (#9343) @flaviendelangle +- [docs] Sync h1 with sidenav link (#9252) @oliviertassinari +- [docs] Use the mui-x Stack Overflow tag (#9352) @oliviertassinari + +### Core + +- [core] Add PR template and update the contributions guide (#9329) @DanailH +- [core] Bump monorepo (#9420) @LukasTy +- [core] Fix file typo (#9421) @DanailH +- [core] Fix proptypes (#9396) @LukasTy +- [core] Move old release notes in `CHANGELOG.old.md` (#9269) @flaviendelangle +- [core] Add priority support issue template (#8928) @DanailH + +## 6.8.0 + +_Jun 16, 2023_ + +We'd like to offer a big thanks to the 13 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Add Greek (el-GR) locale on Pickers and improve on Data Grid +- 🚅 Performance improvements +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.8.0` + +- [DataGrid] Add missing styles to `overridesResolver` (#9248) @mrmuhammadali +- [DataGrid] Keep column header menu icon always visible on touch devices (#9076) @cherniavskii +- [DataGrid] Correct the type for single digit edited number value (#9282) @MBilalShafi +- [DataGrid] Correct the type for single digit edited number for row edit (#9348) @MBilalShafi +- [DataGrid] Filtering performance: cache values (#9284) @romgrk +- [DataGrid] Fix tabbing between `actions` cells in edit mode (#9321) @md250721 +- [DataGrid] Make autocompletion work for `GridColDef['type']` (#9320) @cherniavskii +- [DataGrid] Polish shortcut logic (#9220) @oliviertassinari +- [DataGrid] Row reordering fix for different row heights (#7006) @yaredtsy +- [DataGrid] Scroll performance improvements (#9037) @romgrk +- [l10n] Improve Greek (el-GR) locale (#9292) @clytras + +#### `@mui/x-data-grid-pro@6.8.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.8.0`. + +#### `@mui/x-data-grid-premium@6.8.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.8.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@6.8.0` + +- [l10n] Add Greek (el-GR) locale (#9293) @clytras +- [pickers] Add a `referenceDate` prop on `DateCalendar`, `MonthCalendar` and `YearCalendar` (#9260) @flaviendelangle +- [pickers] Close the calendar when a shortcut is selected (#9080) @flaviendelangle +- [pickers] Fix disabling for digital clock (#9300) @alexfauquette + +#### `@mui/x-date-pickers-pro@6.8.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.8.0`. + +### Docs + +- [docs] Add header filters to the popular features demo (#9069) @MBilalShafi +- [docs] Fix `Date Calendar` dynamic data demo (#9290) @benzler +- [docs] Fix Data Grid header filter link (#9225) @oliviertassinari +- [docs] Fix missing docs version warning (#9221) @oliviertassinari +- [docs] Improve Chart overview (#9333) @oliviertassinari +- [docs] Improve Next.js license installation guide (#8975) @oliviertassinari +- [docs] Link pagination documentation to the migration guide (#9296) @MBilalShafi +- [docs] One step toward components -> slots (#9251) @oliviertassinari +- [docs] Improve and reorganize sections on editing page (#8431) @joserodolfofreitas +- [docs] Add clipboard paste to popular features demo (#9029) @cherniavskii + +### Core + +- [core] Polish event name (#9336) @oliviertassinari +- [core] Re-enable `Argos` CI step (#9301) @LukasTy +- [core] Upgrade Node.js to v18 on CircleCI, CodeSandbox and Netlify (#9319) @ZeeshanTamboli +- [core] Upgrade Node.js v18 for l10n GitHub CI (#9355) @ZeeshanTamboli +- [charts] Add demonstration pages based on Recharts demo (#9175) @alexfauquette +- [charts] Add legend (#9024) @alexfauquette +- [charts] Complete the docs to introduce charts (#9153) @alexfauquette +- [charts] Manage elements highlights (#9242) @alexfauquette +- [charts] Prefix subcomponents with `Charts` (#9314) @alexfauquette +- [license] Improve annual license expiration message (#9135) @oliviertassinari + +## 6.7.0 + +_Jun 9, 2023_ + +We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Improve the default `format` prop value on the pickers. + + Here are a few examples: + + ```tsx + <TimePicker views={['hours', 'minutes', 'seconds']} ampm /> + // Format before v6.7.0: `hh:mm aa` + // Format after v6.7.0: `hh:mm:ss aa` + + <DatePicker views={['year']} /> + // Format before v6.7.0: `MM/DD/YYYY` + // Format after v6.7.0: `YYYY` + + <DateTimePicker views={['day', 'hours', 'minutes']} ampm /> + // Format before v6.7.0: `MM/DD/YYYY hh:mm aa` + // Format after v6.7.0: `DD hh:mm aa` + ``` + +- 🌍 Add Romanian (ro-RO) locale on the pickers +- 🌍 Improve German (de-DE) locale on the pickers +- 🌍 Improve Czech (cs-CZ), German (de-DE) and Turkish (tr-TR) locales on the data grid +- 🚀 Performance improvements +- 🐞 Bugfixes +- 📚 Documentation improvements + +### Data Grid + +#### `@mui/x-data-grid@6.7.0` + +- [DataGrid] Allow overflowing grid root element (#9179) @cherniavskii +- [DataGrid] Fix module augmentation error when using `@mui/lab` (#9235) @cherniavskii +- [DataGrid] Fix row with ids matching `Object` prototype (#9265) @romgrk +- [DataGrid] Fix `sortModel` and `filterModel` resetting when columns change (#9239) @alexgonch +- [DataGrid] Improve grouping performance for large datasets (#9200) @romgrk +- [DataGrid] Increase threshold to trigger memory leak warning (#9263) @m4theushw +- [DataGrid] Update data grid migration guide to include updated type (#9272) @MBilalShafi +- [l10n] Improve Czech (cs-CZ) locale (#9266) @MartinSkarpa +- [l10n] Improve German (de-DE) locale (#9259) @ximex +- [l10n] Improve Turkish (tr-TR) locale (#9237) @MCErtan + +#### `@mui/x-data-grid-pro@6.7.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-data-grid@6.7.0`, plus: + +- [DataGridPro] Improve header filter menu visuals (#9181) @MBilalShafi + +#### `@mui/x-data-grid-premium@6.7.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan') + +Same changes as in `@mui/x-data-grid-pro@6.7.0`, plus: + +- [DataGridPremium] Remove last line break on clipboard paste (#9163) @cherniavskii + +### Pickers + +#### `@mui/x-date-pickers@6.7.0` + +- [l10n] Add Romanian (ro-RO) locale (#9257) @ximex +- [l10n] Improve German (de-DE) locale (#9258) @ximex +- [pickers] Apply dynamic default format depending on views for all desktop and mobile pickers (#9126) @flaviendelangle + +#### `@mui/x-date-pickers-pro@6.7.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') + +Same changes as in `@mui/x-date-pickers@6.7.0`, plus: + +- [pickers] Update `DateRangePickerDay` props JSDoc (#9191) @stevus + +### Docs + +- [docs] Fix missing props on the `GridFilterPanel` API page (#9180) @cherniavskii +- [docs] Fix overview page typo (#9230) @LukasTy +- [docs] Fix version redirect (#9273) @alexfauquette + +### Core + +- [core] Temporarily remove the Argos upload on the regression testing (#9267) @flaviendelangle +- [charts] Add clip-path to avoid charts overflow (#9012) @alexfauquette +- [charts] Add style customization on bar (#8935) @alexfauquette +- [charts] Enforce axis `min`/`max` over the `nice()` method (#9189) @alexfauquette +- [charts] Improve axis label and ticks label alignements (#9190) @alexfauquette +- [charts] Simplify the switch between responsive and fix dimensions (#9151) @alexfauquette + +## 6.6.0 + +_Jun 1, 2023_ + +We'd like to offer a big thanks to the 15 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 New date time picking UI on [`DesktopDateTimePicker`](https://mui.com/x/react-date-pickers/date-time-picker/) + + <img src="https://github.com/mui/mui-x/assets/3165635/4e1fe9f9-03eb-4f23-99dd-80212b21fb23" width="840" height="506" alt="Desktop Date Time Picker example" /> + +- 🚀 Performance improvements +- 🐞 Bugfixes +- 📚 Documentation improvements +- 🌍 Improve Dutch (nl-NL) and French (fr-FR) locales on the data grid +- 🌍 Add Vietnamese (vi-VN) locale on the pickers + +### `@mui/x-data-grid@6.6.0` / `@mui/x-data-grid-pro@6.6.0` / `@mui/x-data-grid-premium@6.6.0` + +#### Changes + +- [DataGrid] Support data attributes (#8845) @romgrk +- [DataGrid] Avoid allocations in `hydrateRowsMeta` (#9121) @romgrk +- [DataGrid] Fix filter input select accessibility (#9018) @Jul13nT +- [DataGrid] Fix accessibility issues in panels and toolbar buttons (#8862) @romgrk +- [DataGrid] Fix `onCellEditStop` not invoked (#8857) @romgrk +- [DataGridPro] Fix auto-scroll when reordering columns (#8856) @m4theushw +- [DataGridPro] Fix row ID type casting in detail panels lookup (#8976) @minchaej +- [DataGridPro] Emit `columnWidthChange` event on `touchEnd` of column resize (#8669) @MBilalShafi +- [DataGridPro] Do not apply filters on `rowExpansionChange` (#8671) @cherniavskii +- [DataGridPro] Prevent click event on sorting after a resize (#9117) @romgrk +- [DataGridPremium] Improve Excel export interface (#9128) @TiagoPortfolio +- [l10n] Improve Dutch (nl-NL) locale (#9043) @thedutchruben +- [l10n] Improve French (fr-FR) locale (#9109) @Jul13nT + +### `@mui/x-date-pickers@6.6.0` / `@mui/x-date-pickers-pro@6.6.0` + +#### Changes + +- [fields] Allow to explicitly define the reference value and improve its default value (#9019) @flaviendelangle +- [l10n] Add Vietnamese (vi-VN) locale (#9099) @nhannt201 +- [pickers] Add `DigitalClock` to `DesktopDateTimePicker` (#8946) @LukasTy +- [pickers] Add support for timezones on the adapters (#9068) @flaviendelangle +- [pickers] Fix `MonthCalendar` and `YearCalendar` disabled validation (#9149) @LukasTy +- [pickers] Fix bug when fields have a unique section (#9110) @alexfauquette +- [pickers] Fix focus jumping on Safari (#9072) @LukasTy +- [pickers] Use the locale start of the week in `getWeekArray` (#9176) @flaviendelangle + +### Docs + +- [docs] Add single input range picker demo (#9159) @LukasTy +- [docs] Align `DateCalendar` demo views with labels (#9152) @LukasTy +- [docs] Clarify the peer dependency with React (#9067) @oliviertassinari +- [docs] Fix Norwegian locale typo (#9168) @LukasTy +- [docs] Fix column menu item demo (#9071) @MBilalShafi +- [docs] Improve localization table progress bars (#9033) @noraleonte +- [docs] Smooth performance animation (#8986) @oliviertassinari +- [docs] Use responsive time and date time pickers and the views sections (#9127) @flaviendelangle +- [docs] Reduce layout shift in grid demo (#9132) @oliviertassinari +- [docs] Fix tree data children lazy-loading demo (#8840) @yaredtsy +- [docs] Improve filtering docs discoverability (#9074) @MBilalShafi + +### Core + +- [core] Allow string literals as keys in `localesText` (#9045) @MBilalShafi +- [core] Fix `randomInt` producing values exceeding `max` value (#9086) @cherniavskii +- [core] Fix flaky test on `dateWithTimezone` adapter test (#9129) @flaviendelangle +- [core] Lock `@types/node` on v18 (#9107) @LukasTy +- [core] Remove `cross-fetch` dependency (#9108) @LukasTy +- [core] Remove `createDetectElementResize()` replaced with `ResizeObserver` (#9015) @oliviertassinari +- [core] Upgrade monorepo (#9027) @m4theushw +- [core] Upgrade monorepo (#9106) @LukasTy +- [charts] Fix proptypes (#9125) @LukasTy +- [charts] Generate the charts proptypes (#9010) @alexfauquette +- [charts] Manage series stacking (#8888) @alexfauquette +- [license] List side effects in the license package (#9092) @cherniavskii + +## 6.5.0 + +_May 19, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 💫 Introduce filtering on column headers for `DataGridPro` and `DataGridPremium`: + + <img src="https://github.com/mui/mui-x/releases/download/v6.5.0/recording.gif" width="840" height="506" alt="Filtering on column headers example" /> + + See [the documentation](https://mui.com/x/react-data-grid/filtering/header-filters/) for more information + +- 🌍 Improve Hebrew (he-IL) and Czech (cs-CZ) locales +- 📝 Support for editing on pinned rows +- 🚀 Performance improvements +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.5.0` / `@mui/x-data-grid-pro@6.5.0` / `@mui/x-data-grid-premium@6.5.0` + +#### Changes + +- [DataGrid] Fix grid size calculation when `.MuiDataGrid-main` has border (#8882) @cherniavskii +- [DataGridPro] Filtering on Column Header (#7760) @MBilalShafi +- [DataGridPro] Improve `treeData` and `rowGrouping` performance (#8990) @MBilalShafi +- [DataGridPro] Support pinned rows editing (#8921) @cherniavskii +- [l10n] Improve Hebrew (he-IL) locale (#8943) @Itzik-Tech +- [l10n] Improve Czech (cs-CZ) locale (#8829) @harastaivan +- [l10n] Improve Czech (cs-CZ) locale (#8956) @davidzemancz + +### `@mui/x-date-pickers@6.5.0` / `@mui/x-date-pickers-pro@6.5.0` + +#### Changes + +- [fields] Select the first section instead of last when clicking right of content (#9005) @noraleonte +- [fields] Refactor prop drilling in fields (#8660) @flaviendelangle +- [pickers] Allow to render the months before `currentMonth` instead of the one after (#8592) @flaviendelangle +- [pickers] Fix view management when `openTo` or `views` is modified (#8997) @alexfauquette +- [l10n] Improve Czech (cs-CZ) locale (#8829) @harastaivan + +### Docs + +- [docs] Clarify what Controlled / Uncontrolled means (#8926) @flaviendelangle +- [docs] Fix docs using wrong service worker (#9030) @cherniavskii +- [docs] Remove prop-types from JS demos (#9008) @flaviendelangle + +### Core + +- [core] Add assertion about checkbox rerenders (#8974) @oliviertassinari +- [core] Allow selecting a section by type in field tests (#9009) @flaviendelangle +- [core] Fix `yarn.lock` (#8988) @flaviendelangle +- [core] Fix flacky adapter test (#8995) @flaviendelangle +- [charts] Clean the axis rendering (#8948) @alexfauquette +- [DataGrid] Memoize root props for better performance (#8942) @romgrk +- [test] Skip flaky unit tests in JSDOM (#8994) @cherniavskii + +## 6.4.0 + +_May 12, 2023_ + +We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Introduce clipboard paste support for `DataGridPremium`: + + https://github.com/mui/mui-x/assets/13808724/abfcb5c6-9db6-4677-9ba7-ae97de441080 + + See [the documentation](https://mui.com/x/react-data-grid/clipboard/#clipboard-paste) for more information + +- 🌍 Improve French (fr-FR), German (de-DE), Portuguese (pt-BR) and Ukrainian (uk-UA) locales on the data grid +- 🌍 Add Slovak (sk-SK) locale on the pickers +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.4.0` / `@mui/x-data-grid-pro@6.4.0` / `@mui/x-data-grid-premium@6.4.0` + +#### Changes + +- [DataGrid] Fix DataGrid rendering in JSDOM (#8968) @cherniavskii +- [DataGrid] Fix layout when rendered inside a parent with `display: grid` (#8577) @cherniavskii +- [DataGrid] Add Joy UI icon slots (#8940) @siriwatknp +- [DataGrid] Add Joy UI pagination slot (#8871) @cherniavskii +- [DataGrid] Extract `baseChip` slot (#8748) @cherniavskii +- [DataGridPremium] Implement Clipboard import (#7389) @cherniavskii +- [l10n] Improve French (fr-FR) locale (#8825) @allereaugabriel +- [l10n] Improve German (de-DE) locale (#8898) @marcauberer +- [l10n] Improve Portuguese (pt-BR) locale (#8960) @Sorriso337 +- [l10n] Improve Ukrainian (uk-UA) locale (#8863) @Neonin + +### `@mui/x-date-pickers@6.4.0` / `@mui/x-date-pickers-pro@6.4.0` + +#### Changes + +- [pickers] Fix trailing zeros inconsistency in `LuxonAdapter` (#8955) @alexfauquette +- [pickers] Stop using deprecated adapter methods (#8735) @flaviendelangle +- [pickers] Strictly type the `adapterLocale` prop of `LocalizationProvider` (#8780) @flaviendelangle +- [l10n] Add Slovak (sk-SK) locale (#8875) @MatejFacko + +### Docs + +- [docs] Fix date pickers typo in the docs (#8939) @richbustos +- [docs] Fix master detail demo (#8894) @m4theushw +- [docs] Fix typo in clipboard docs (#8971) @MBilalShafi +- [docs] Reduce list of dependencies in Codesandbox/Stackblitz demos (#8535) @cherniavskii + +### Core + +- [core] Improve testing of the adapters (#8789) @flaviendelangle +- [core] Update license key for tests (#8917) @LukasTy +- [charts] Make introduction docs pages for each chart (#8869) @alexfauquette +- [charts] Document Tooltip and Highlighs (#8867) @alexfauquette +- [test] Cover row grouping regression with a unit test (#8870) @cherniavskii +- [test] Fix flaky regression tests (#8954) @cherniavskii + +## 6.3.1 + +_May 5, 2023_ + +We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: + +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.3.1` / `@mui/x-data-grid-pro@6.3.1` / `@mui/x-data-grid-premium@6.3.1` + +#### Changes + +- [DataGrid] Fix broken filtering in the value formatter demo (#8621) @cherniavskii +- [DataGrid] Fix falsy filter values not showing in filter button tooltip (#8550) @ithrforu +- [DataGrid] Fix missing watermark in Pro and Premium packages (#8797) @cherniavskii +- [DataGrid] Remove unwarranted warning log (#8847) @romgrk +- [DataGrid] Add Joy UI slots (`Select`, `SelectOption`, `InputLabel`, `FormControl`) (#8747) @cherniavskii +- [DataGridPremium] Fix expanded groups being collapsed after calling `updateRows` (#8823) @cherniavskii + +### `@mui/x-date-pickers@6.3.1` / `@mui/x-date-pickers-pro@6.3.1` + +#### Changes + +- [pickers] Fix `minutesStep` validation prop behavior (#8794) @LukasTy +- [pickers] Fix time picker `viewRenderers` overriding (#8830) @LukasTy +- [pickers] Remove last additional character when using LTR (#8848) @alexfauquette + +### Docs + +- [docs] Fix controlled mode demo on Editing page (#8800) @yaredtsy +- [docs] Fix scrolling demo not working with React 18 (#6489) @cherniavskii +- [docs] Update demo to support agregation on popular feature cell (#8617) @BalaM314 +- [docs] Clarify what `<path>` is (#8764) @alexfauquette + +### Core + +- [core] Do not include playground pages in `yarn typescript` script (#8822) @cherniavskii +- [core] Limit `typescript:ci` step memory limit (#8796) @LukasTy +- [core] Upgrade monorepo (#8835) @cherniavskii +- [test] Use `fake` clock on `MobileDateRangePicker` (#8861) @LukasTy +- [charts] Clean some styling (#8778) @alexfauquette +- [charts] Improve tooltip (#8792) @alexfauquette +- [charts] Improvement and docs on axis (#8654) @alexfauquette +- [charts] Defaultize attributes (#8788) @alexfauquette + +## 6.3.0 + +_Apr 28, 2023_ + +We'd like to offer a big thanks to the 15 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 New [time-picking UI](https://mui.com/x/react-date-pickers/digital-clock/) designed for desktops (#7958) @LukasTy + + <img src="https://user-images.githubusercontent.com/4941090/235072007-de39a397-e4a4-4c98-8e10-5ee4ad440108.gif" width="494" alt="New digital clock time picker" /> + +- ✨ Picker fields [now always include a leading zero](https://mui.com/x/react-date-pickers/adapters-locale/#respect-leading-zeros-in-fields) on digit sections (#8527) @flaviendelangle +- 🌍 Improve Chinese (zh-CN), French (fr-FR), and Turkish (tr-TR) locales +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.3.0` / `@mui/x-data-grid-pro@6.3.0` / `@mui/x-data-grid-premium@6.3.0` + +#### Changes + +- [DataGrid] Add overlay classes to `gridClasses` (#8686) @lindapaiste +- [DataGrid] Avoid passing `api` prop to div (#8679) @someden +- [DataGrid] Fix 'ResizeObserver loop limit exceeded' error (#8744) @m4theushw +- [DataGrid] Add Joy UI slots (button and switch) (#8699) @siriwatknp +- [DataGrid] Fix aggregation label alignment (#8694) @joserodolfofreitas +- [DataGridPremium] Fix infinite loop when updating grouped rows (#8693) @cherniavskii +- [DataGridPro] Fix error after updating `columns` and `columnGroupingModel` at once (#8730) @cherniavskii +- [l10n] Improve Chinese (zh-CN) locale (#8753) @SakumyZ +- [l10n] Improve French (fr-FR) locale (#8704) @Jul13nT +- [l10n] Improve Turkish (tr-TR) locale (#8783) @cccaaannn + +### `@mui/x-date-pickers@6.3.0` / `@mui/x-date-pickers-pro@6.3.0` + +#### Changes + +- [fields] Always add leading zeroes on digit sections (#8527) @flaviendelangle +- [fields] Pass the `readOnly` prop to `InputProps` instead of `inputProps` (#8659) @flaviendelangle +- [pickers] Add missing export for `caES` locale (#8782) @flaviendelangle +- [pickers] Add new `DigitalClock` desktop time picking experience (#7958) @LukasTy +- [pickers] Do not use `instanceOf DateTime` in `AdapterLuxon` (#8734) @flaviendelangle +- [pickers] Fix date calendar `selected` & `disabled` day style (#8773) @LukasTy +- [pickers] Migrate `AdapterDateFns` to our repository (#8736) @flaviendelangle +- [pickers] Migrate `AdapterLuxon` to our repository (#8600) @flaviendelangle +- [pickers] Migrate `AdapterMomentHijri` to our repository (#8776) @flaviendelangle +- [pickers] Migrate `AdapterMomentJalaali` and `AdapterDateFnsJalali` to our repository (#8741) @flaviendelangle +- [pickers] Migrate `AdapterMoment` to our repository (#8700) @flaviendelangle +- [pickers] Refactor the validation files (#8622) @flaviendelangle +- [pickers] Use `en dash` instead of `em dash` in multi input range fields (#8738) @flaviendelangle +- [l10n] Improve Chinese (zh-CN) locale (#8753) @SakumyZ +- [l10n] Improve Turkish (tr-TR) locale (#8783) @cccaaannn + +### Docs + +- [docs] Add icons for charts menu (#8752) @alexfauquette +- [docs] Document the supported formats (#8746) @flaviendelangle +- [docs] Fix Hijri demo (#8698) @alexfauquette +- [docs] Fix `x-codemod` package version in changelog (#8690) @MBilalShafi +- [docs] Fix columns special properties code example (#8414) @mikkelhl +- [docs] Fix error in `minDateTime` `validation` page section (#8777) @LukasTy +- [docs] Update custom field pickers using theme scoping (#8609) @siriwatknp +- [docs] Use community version of data grid for column grouping demo (#7346) @ASchwad +- [docs] Use new `slots` / `slotProps` props in the pickers migration guide (#8341) @flaviendelangle + +### Core + +- [core] Cleanup picker tests (#8652) @flaviendelangle +- [core] Use `adapter.lib` instead of `adapterName` in `describeAdapters` (#8779) @flaviendelangle +- [charts] Adapt line and scatter plot to the "band" scale type (#8701) @alexfauquette +- [charts] Link the Gantt Charts issue in the docs (#8739) @flaviendelangle + +## 6.2.1 + +_Apr 20, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Add virtualization to row detail panels (#7969) @yaredtsy +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.2.1` / `@mui/x-data-grid-pro@6.2.1` / `@mui/x-data-grid-premium@6.2.1` + +#### Changes + +- [DataGrid] Add `getTogglableColumns` to `Hide all` and `Show all` actions (#8496) @MBilalShafi +- [DataGrid] Add Grid + Joy UI experiment page (#8067) @cherniavskii +- [DataGrid] Fix print style when rendering inside Shadow DOM (#8656) @Bwatermelon +- [DataGrid] Replace `GridAutoSizer` with `ResizeObserver` (#8091) @m4theushw +- [DataGrid] Use stable ID for the placeholder filter item (#8603) @m4theushw +- [DataGridPro] Virtualize row detail panels (#7969) @yaredtsy + +### `@mui/x-date-pickers@6.2.1` / `@mui/x-date-pickers-pro@6.2.1` + +#### Changes + +- [pickers] Do not include the time in date components when going to today (#8657) @flaviendelangle +- [pickers] Sync internal state with controlled value (#8674) @alexfauquette + +### `@mui/x-codemod@6.2.1` + +#### Changes + +- [codemod] Avoid filter failures on object prototype properties (#8647) @LukasTy + +### Docs + +- [docs] Add no-op service worker to fix stale cache issue (#8598) @cherniavskii +- [docs] Clarify what `AdapterDayjs` is in the Getting Started page (#8219) @flaviendelangle +- [docs] Fix typo on picker page description (#8611) @maxolasersquad +- [docs] Improve section title in Getting Started page (#8648) @flaviendelangle +- [docs] Inform about input format modification (#8458) @alexfauquette + +### Core + +- [core] Fix release date (#8618) @flaviendelangle +- [core] Upgrade monorepo (#8668) @MBilalShafi +- [charts] Support Tooltip (#8356) @alexfauquette + +## 6.2.0 + +_Apr 14, 2023_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- Add `@mui/base` as a `peerDependency` of `@mui/x-date-pickers` and `@mui/x-date-pickers-pro` (#8590) @LukasTy + + Both libraries were not working correctly if used without `@mui/base`. + Most package manager should automatically use the `@mui/base` version installed for `@mui/material`. + +- The value rendered in the picker or field input no longer has spaces around the `/` characters (#8425) @flaviendelangle + + You can use the `formatDensity='spacious'` prop to add it back. + More information on [the dedicated doc section](https://mui.com/x/react-date-pickers/custom-field/#change-the-format-density) + +- 🌍 Improve French (fr-FR) and Urdu (ur-PK) and locales. +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.2.0` / `@mui/x-data-grid-pro@6.2.0` / `@mui/x-data-grid-premium@6.2.0` + +#### Changes + +- [DataGrid] Reset selection state on `checkboxSelection` toggle (#8522) @MBilalShafi +- [DataGrid] Use `baseSelect` slot instead of `baseTextField` with `select={true}` (#8110) @cherniavskii +- [l10n] Improve French (fr-FR) locale (#8537) @allereaugabriel +- [l10n] Improve Urdu (ur-PK) locale (#8513) @SFARPak + +### `@mui/x-date-pickers@6.2.0` / `@mui/x-date-pickers-pro@6.2.0` + +#### Changes + +- [DateTimePicker] Fix `TimeClock` validation ignoring date by default (#8570) @LukasTy +- [fields] Fix reliance on section order (#8545) @LukasTy +- [fields] Make the space between format separators controllable (#8425) @flaviendelangle +- [pickers] Add `@mui/base` to `peerDependencies` (#8590) @LukasTy +- [pickers] Fix JSDoc for `formatDensity` prop (#8601) @flaviendelangle +- [pickers] Improve value lifecycle on non-controlled pickers (#8312) @flaviendelangle +- [pickers] Migrate `AdapterDayjs` to our repository (#8487) @flaviendelangle + +### Docs + +- [docs] Fix "Custom day rendering" demo alignment (#8541) @LukasTy +- [docs] Fix **below** typo (#8576) @alexfauquette + +### Core + +- [core] Optimize `renovate` rules (#8575) @LukasTy +- [core] Upgrade monorepo (#8578) @cherniavskii +- [core] Update last release date (#8569) @DanailH + +## 6.1.0 + +_Apr 10, 2023_ + +We'd like to offer a big thanks to the 15 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Add Catalan (ca-ES), Kazakh (kz-KZ) and improve Spanish (es-ES), Dutch (nl-NL), Hebrew (he-IL), Hungarian (hu-HU), Japanese (ja-JP), Portuguese (pt-BR), and Russian (ru-RU) locales +- ✨ Allow to control visibility of columns shown in the columns panel (#8401) @MBilalShafi +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.1.0` / `@mui/x-data-grid-pro@6.1.0` / `@mui/x-data-grid-premium@6.1.0` + +#### Changes + +- [DataGrid] Allow to control visibility of columns shown in the `ColumnsPanel` component (#8401) @MBilalShafi +- [DataGrid] Fix filters with empty array value not being removed from the filter model (#8501) @cherniavskii +- [DataGrid] Fix memory leaks in development (#8301) @cherniavskii +- [DataGrid] Sync `date` column value when entering edit mode by pressing a digit (#8364) @m4theushw +- [DataGrid] Wrap column menu button with a tooltip (#7890) @cherniavskii +- [l10n] Improve Dutch (nl-NL) locale (#8491) @thedutchruben +- [l10n] Improve Hungarian (hu-HU) locale (#8486) @PetakCC +- [l10n] Improve Japanese (ja-JP) locale (#8462) @megos +- [l10n] Improve Portuguese (pt-BR) locale (#8480) @pwnedev +- [l10n] Improve Russian (ru-RU) locale (#8510) @alexrapro + +### `@mui/x-date-pickers@6.1.0` / `@mui/x-date-pickers-pro@6.1.0` + +#### Changes + +- [fields] Fix RTL navigation (#8490) @alexfauquette +- [fields] Fix usage of `slotProps.textField.InputProps` (#8428) @flaviendelangle +- [pickers] Fix `componentsProps.dialog` propagation (#8509) @LukasTy +- [pickers] Move `hasError` from `fieldValueManager` to `valueManager` (#8453) @flaviendelangle +- [pickers] Move the adapters interfaces to the X repository (#8412) @flaviendelangle +- [pickers] Update peer dependency versions (#8531) @LukasTy +- [pickers] Fix `isValid` regression (#8543) @LukasTy +- [l10n] Add Catalan (Spain) (ca-ES) and improve Spanish (es-ES) locales (#8498) @makenshikuro +- [l10n] Add Kazakh (kz-KZ) locale (#8451) @zhunus +- [l10n] Improve Dutch (nl-NL) locale (#8491) @thedutchruben +- [l10n] Improve Hebrew (he-IL) locale (#8464) @soris1989 +- [l10n] Improve Japanese (ja-JP) locale (#8462) @megos +- [l10n] Improve Portuguese (pt-BR) locale (#8480) @pwnedev + +### Docs + +- [docs] Fix 301 redirect (#8524) @alexfauquette +- [docs] Fix 404 links (#8454) @alexfauquette +- [docs] Fix broken API reference link (#8460) @oliviertassinari + +### Core + +- [core] Avoid 301 links (#8383) @oliviertassinari +- [core] Fix the l10n helper by using danger instead of actions (#8512) @alexfauquette +- [core] Help contributors for l10n PRs (#8503) @alexfauquette +- [core] Remove legacy token (#8457) @oliviertassinari +- [charts] Add a styling system (#8445) @alexfauquette + +## 6.0.4 + +_Mar 30, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Add Danish (da-DK), and improve Norwegian (nb-NO), Spanish (es-ES), and Swedish (sv-SE) locales +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.0.4` / `@mui/x-data-grid-pro@6.0.4` / `@mui/x-data-grid-premium@6.0.4` + +#### Changes + +- [DataGrid] Fix column header tooltip not showing when the title is truncated (#8433) @rohitnatesh +- [DataGrid] Fix filter model buttons' display condition (#8415) @MBilalShafi +- [DataGrid] Fix infinite rerender in a flex parent (#8436) @cherniavskii +- [DataGrid] Prevent reopening column menu when clicking in the button while it is open (#8286) @tanuj-22 +- [DataGrid] Rename `components` by `slots` in column menu API (#7999) @MBilalShafi +- [DataGrid] Remove hardcoded CSS classes' usages (#8444) @MBilalShafi +- [DataGridPremium] Fix aggregation initial state causing issue with quick filter (#8441) @MBilalShafi +- [l10n] Improve Danish (da-DK) locale (#8368) @BossElijah +- [l10n] Improve Danish (da-DK) locale (#8378) @BossElijah +- [l10n] Improve Norwegian (nb-NO) locale (#8367) @BossElijah +- [l10n] Improve Norwegian (nb-NO) locale (#8409) @BossElijah +- [l10n] Improve Spanish (es-ES) locale (#8420) @martjanz +- [l10n] Improve Swedish (sv-SE) locale (#8381) @BossElijah + +### `@mui/x-date-pickers@6.0.4` / `@mui/x-date-pickers-pro@6.0.4` + +#### Changes + +- [fields] Add missing tokens to `AdapterDateFnsJalali` (#8402) @flaviendelangle +- [fields] Clean the active date manager (#8370) @flaviendelangle +- [fields] Cleanup `useFieldState` (#8292) @flaviendelangle +- [fields] Only add RTL characters when needed (#8325) @flaviendelangle +- [pickers] Add support for single input fields in range pickers (#7927) @flaviendelangle +- [pickers] Allows non token characters in format (#8256) @alexfauquette +- [pickers] Avoid root imports and move public models to the models folder (#8337) @flaviendelangle +- [pickers] Update `view` when `views` or `openTo` changes (#8361) @LukasTy +- [l10n] Improve Norwegian (nb-NO) locale (#8382) @BossElijah +- [l10n] Add Danish (da-DK) locale (#8379) @BossElijah +- [l10n] Improve Swedish (sv-SE) locale (#8381) @BossElijah + +### `@mui/x-codemod@6.0.4` + +#### Changes + +- [codemod] Fix `remove-stabilized-experimentalFeatures` codemod (#8289) @alexfauquette + +### Docs + +- [docs] Fix `GridCellParams` signature in migration guide (#8427) @cherniavskii +- [docs] Fix "Custom field" demos responsive styles (#8408) @LukasTy +- [docs] Remove `label` from demos where it reduces clarity (#8416) @LukasTy +- [docs] Update slots' references in Data Grid migration guide (#8159) @MBilalShafi + +### Core + +- [charts] Work on typing (#8421) @flaviendelangle + +## 6.0.3 + +_Mar 23, 2023_ + +We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Bulgarian (bg-BG), Persian (fa-IR), Polish (pl-PL), and Dutch (nl-NL) locales +- 🐞 Bugfixes +- 📚 Documentation improvements + +### `@mui/x-data-grid@6.0.3` / `@mui/x-data-grid-pro@6.0.3` / `@mui/x-data-grid-premium@6.0.3` + +#### Changes + +- [DataGrid] Fix overflow calculation issue in column group headers (#8246) @MBilalShafi +- [DataGridPro] Fix column reorder glitches (#8335) @cherniavskii +- [l10n] Improve Bulgarian (bg-BG) locale (#8315) @todevmilen +- [l10n] Improve Persian (fa-IR) locale (#8268) @fakhamatia +- [l10n] improve Dutch (nl-NL) locale (#8317) @developenguin + +### `@mui/x-date-pickers@6.0.3` / `@mui/x-date-pickers-pro@6.0.3` + +#### Changes + +- [fields] Allow to reset the value from the outside (#8287) @flaviendelangle +- [fields] Cleanup section order generation (#8290) @flaviendelangle +- [fields] Fix Safari input selection resetting regression (#8295) @LukasTy +- [fields] Fix editing when all sections are selected (#8330) @flaviendelangle +- [fields] Fix iOS browser scroll jumping when entering data (#8328) @LukasTy +- [fields] New prop `unstableFieldRef` to imperatively interact with the selected sections (#8235) @flaviendelangle +- [pickers] Align date calendar colors (#8318) @LukasTy +- [pickers] Support invalid dates from the field (#8298) @flaviendelangle +- [l10n] Improve Persian (fa-IR) locale (#8268) @fakhamatia +- [l10n] Improve Polish (pl-PL) locale (#8344) @drmats +- [l10n] improve Dutch (nl-NL) locale (#8317) @developenguin + +### Docs + +- [docs] Create examples of pickers with custom fields (#8034) @flaviendelangle +- [docs] Fix 301 redirections @oliviertassinari +- [docs] Fix link to React's docs @oliviertassinari +- [docs] Fix Pro license links to point to the same page (#8303) @LukasTy +- [docs] Give an incentive to upgrade (#8269) @oliviertassinari +- [docs] Improve contrast on data grid navigation (#8239) @oliviertassinari +- [docs] Update shortcuts page to use slotProps (#8288) @dcorb +- [docs] Explain the `shouldDisableTime` migration in more depth (#8348) @LukasTy + +### Core + +- [core] Remove unused `visx` chart package (#8259) @LukasTy +- [core] Upgrade monorepo (#8331) @cherniavskii +- [charts] Project setup (#8308) @alexfauquette +- [test] Track visual regressions of column menu and filter/column panels (#8095) @cherniavskii + +## 6.0.2 + +_Mar 16, 2023_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Fire `onChange` when filling a partial date (#8082) @flaviendelangle +- 🎁 Support date format like `1st` (`do`) (#8188) @flaviendelangle +- 🌍 Add Hebrew (he-IL) locale (#8222) @ylarom +- 🌍 Improve Brazilian Portuguese (pt-BR), German (de-DE), and French (fr-FR) locales +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.2` / `@mui/x-data-grid-pro@6.0.2` / `@mui/x-data-grid-premium@6.0.2` + +#### Changes + +- [DataGrid] Fix <kbd>Space</kbd> triggering edit mode (#8180) @m4theushw +- [DataGrid] Remove warning when adding a custom column type (#8227) @m4theushw +- [l10n] Improve Brazilian Portuguese (pt-BR) locale (#8198) @JoaoSerafim3001 + +### `@mui/x-date-pickers@6.0.2` / `@mui/x-date-pickers-pro@6.0.2` + +#### Changes + +- [l10n] Add Hebrew (he-IL) locale (#8222) @ylarom +- [l10n] Improve German (de-DE) locale (#8204) @sebkasanzew +- [l10n] Improve French (fr-FR) locale (#8229) @marvinroger +- [DateRangePicker] Allow overriding `slotProps.textField` (#8201) @LukasTy +- [fields] Fire `onChange` when filling a partial date (#8082) @flaviendelangle +- [fields] Fix editing in shadow dom (#8254) @flaviendelangle +- [fields] Remove the duplicated warning about invalid adapter (#8187) @flaviendelangle +- [fields] Support date format like `1st` (`do`) (#8188) @flaviendelangle +- [pickers] Fix to avoid selecting sections on mobile picker field (#8228) @LukasTy +- [pickers] Inherit previous and next icons size from their parent button (#8218) @flaviendelangle + +### Docs + +- [docs] Add a warning in the migration guide for people re-enabling the clock on desktop (#8184) @flaviendelangle +- [docs] Add a warning for `luxon` macro tokens (#8245) @flaviendelangle +- [docs] Complete pickers customization pages (#8066) @alexfauquette +- [docs] Fix 301 redirection @oliviertassinari +- [docs] Fix 404 links to customization Material UI APIs (#8200) @oliviertassinari +- [docs] Fix `moment-hijri` demo (#8255) @LukasTy +- [docs] Improve migration diff (#8240) @oliviertassinari +- [docs] Change **What's new** page url to point to announcement blog post (#8186) @joserodolfofreitas +- [docs] Resolve 301 in changelog @oliviertassinari + +### Core + +- [core] Regen api docs (#8220) @flaviendelangle +- [core] Remove duplicated `/` (#8223) @alexfauquette + +## 6.0.1 + +_Mar 9, 2023_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve French (fr-FR) locale (#8122) @MaherSamiGMC +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.1` / `@mui/x-data-grid-pro@6.0.1` / `@mui/x-data-grid-premium@6.0.1` + +#### Changes + +- [DataGrid] Fix `MenuProps.onClose` being overridden for single select edit component (#8174) @rohitnatesh +- [DataGrid] Simplify `buildPrintWindow` (#8142) @oliviertassinari +- [l10n] Improve French (fr-FR) locale (#8122) @MaherSamiGMC + +### `@mui/x-date-pickers@6.0.1` / `@mui/x-date-pickers-pro@6.0.1` + +#### Changes + +- [pickers] Add a runtime warning when a `renderInput` prop is passed to a picker (#8183) @flaviendelangle +- [pickers] Don't pass `ownerState` to the `inputAdornment` slot (#8165) @flaviendelangle + +### Docs + +- [docs] Fix a typo in the migration guide (#8152) @flaviendelangle +- [docs] Fix package version used in CodeSandbox demos (#8125) @cherniavskii +- [docs] Fix typos across codebase (#8126) @stavares843 +- [docs] Improve Data Grid quick filter documentation (#8109) @MBilalShafi +- [docs] Improve link from npm to docs (#8141) @oliviertassinari +- [docs] Remove test sections (#8177) @m4theushw + +### Core + +- [core] Upgrade monorepo (#8162) @m4theushw + +## 6.0.0 + +_Mar 3, 2023_ + +We're excited to [announce the first v6 stable release](https://mui.com/blog/mui-x-v6/)! 🎉🚀 + +This is now the officially supported major version, where we'll keep rolling out new features, bug fixes, and improvements. +Migration guides are available with a complete list of the breaking changes: + +- [Data Grid](https://mui.com/x/migration/migration-data-grid-v5/) +- [Date Pickers](https://mui.com/x/migration/migration-pickers-v5/) + +We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 The row pinning is no longer experimental (#8055) @MBilalShafi + + You can now use the row pinning without the `experimentalFeatures.rowPinning` flag enabled. + + ```diff + <DataGridPro + - experimentalFeatures={{ rowPinning: true }} + /> + ``` + +- ⚡️ Improved grid performance by rows and cells memoization (#7846) @m4theushw +- ✨ Fields have a distinct visual state when empty (#8069) @LukasTy +- 🌍 Improve Czech (cs-CZ) locale (#8113) @BlastyCZ +- 🌍 Improve Arabic (ar-SD) locale (#8100) @atf98 +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0` / `@mui/x-data-grid-pro@6.0.0` / `@mui/x-data-grid-premium@6.0.0` + +#### Breaking changes + +- The `componentsProps` and `slotProps` props are now typed for better DX +- The `cellFocus`, `cellTabIndex` and `editRowsState` props are not passed to the component used in the row slot. You can use the new `focusedCell` and `tabbableCell` props instead. For the editing state, use the API methods. + The flag `experimentalFeatures.rowPinning` is no longer needed. + +#### Changes + +- [DataGrid] Add typing for `componentsProps` (#7968) @MBilalShafi +- [DataGrid] Allow multiple modules' augmentation (#8098) @MBilalShafi +- [DataGrid] Extract `BaseInputLabel` slot (#8068) @cherniavskii +- [DataGrid] Extract `BaseSelectOption` slot (#8072) @cherniavskii +- [DataGrid] Make possible to memoize rows and cells (#7846) @m4theushw +- [DataGrid] Register `getLocaleText` synchronously (#8029) @m4theushw +- [DataGrid] Start extracting material slots to a separate directory (#8004) @cherniavskii +- [DataGrid] Use `styled` from system (#8032) @siriwatknp +- [DataGridPro] Improve typing for `getColumnForNewFilter` method (#8043) @MBilalShafi +- [DataGridPro] Remove row pinning from experimental features (#8055) @MBilalShafi +- [l10n] Improve Czech (cs-CZ) locale (#8113) @BlastyCZ +- [l10n] Improve Arabic (ar-SD) locale (#8100) @atf98 + +### `@mui/x-date-pickers@6.0.0` / `@mui/x-date-pickers-pro@6.0.0` + +#### Breaking changes + +On desktop, `DateTimePicker` shows the am/pm controls in the toolbar instead of the clock by default. +It can be overridden by specifying `ampmInClock` prop. + +#### Changes + +- [DateRangePicker] Generalize the highlight between months (#8079) @alexfauquette +- [fields] Clean the order of the tokens in the `formatTokenMap` of each adapter (#8112) @flaviendelangle +- [fields] Implement empty visual state (#8069) @LukasTy +- [fields] Replace `sectionOrder` state with a memoized variable (#8090) @flaviendelangle +- [pickers] Add support for UTC on `moment` adapter (#8031) @flaviendelangle +- [pickers] Document and deprecate `onClose` callback on static pickers (#8021) @LukasTy +- [pickers] Fix am/pm buttons position and responsiveness (#5149) @alexfauquette +- [pickers] Fix layout `sx` propagation (#8064) @alexfauquette +- [pickers] Increase `moment` peer dependency minimum version (#8046) @oliviertassinari +- [pickers] Remove `WrapperVariantContext` (#8088) @LukasTy +- [pickers] Stop using `WrapperVariantContext` in `Clock` (#8083) @LukasTy + +### Docs + +- [docs] Add `aggregation` experimental flag removal to the migration guide (#8056) @MBilalShafi +- [docs] Add expansion state behavioral change to v6 migration guide (#8108) @MBilalShafi +- [docs] Change default date from 4th of April to 17th of April for readability (#8089) @flaviendelangle +- [docs] Clarify the MIT license restriction for grid pagination (#8045) @arunkp +- [docs] Fix typo replacing "bellow" by "below" (#8080) @TheBox193 +- [docs] Link `API object` in the `apiRef` sections (#8106) @MBilalShafi +- [docs] Link to demonstrations in the interfaces API docs (#8028) @cherniavskii +- [docs] Remove the `@next` tag from installation instructions (#8102) @cherniavskii +- [docs] Start enforcing consistency in documentation vocabulary (#6871) @alexfauquette +- [docs] Update accessibility guidelines (#7970) @oliviertassinari +- [docs] Update the DataGrid demo to leverage the latest features (#7863) @joserodolfofreitas +- [docs] Update migration guide for stable release (#8092) @joserodolfofreitas + +### Core + +- [core] Add modified docs page links in the PR (#7848) @alexfauquette +- [core] Add test on value timezone (#7867) @alexfauquette +- [core] Bump monorepo (#8006) @LukasTy +- [core] Change default branch back to `master` (#8081) @m4theushw +- [core] Upgrade monorepo (#8115) @MBilalShafi +- [core] Mention the use of Support key as an alternative to the OrderID (#6968) @joserodolfofreitas +- [test] Fix flaky tests (#8097) @cherniavskii + +## 6.0.0-beta.5 + +_Feb 23, 2023_ + +We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: + +- ⚡️ Add web worker support for Excel export (#7770) @m4theushw +- 🎁 Add a button to remove all filters on the data grid filter panel (#7326) @MBilalShafi +- ⚙️ Allow to customize options label and value in the data grid `singleSelect` column (#7684) @m4theushw +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-beta.5` / `@mui/x-data-grid-pro@6.0.0-beta.5` / `@mui/x-data-grid-premium@6.0.0-beta.5` + +#### Changes + +- [DataGrid] Allow to customize label and value for `singleSelect` (#7684) @m4theushw +- [DataGrid] Fix `ownerState` being `undefined` in theme style overrides (#7964) @lolaignatova +- [DataGrid] Introduce `slots` and deprecate `components` (#7882) @MBilalShafi +- [DataGridPro] Add `Remove All` option in filter panel (#7326) @MBilalShafi +- [DataGridPremium] Add web worker support for Excel export (#7770) @m4theushw + +### `@mui/x-date-pickers@6.0.0-beta.5` / `@mui/x-date-pickers-pro@6.0.0-beta.5` + +#### Breaking changes + +- The `MuiDateSectionName` type was renamed to `FieldSectionType` + +#### Changes + +- [fields] Fix multi input range fields validation when uncontrolled (#8002) @LukasTy +- [fields] Fix single input time range fields slot props (#7988) @LukasTy +- [fields] Make the `ArrowUp` / `ArrowDown` edition only impact the active section (#7993) @flaviendelangle +- [fields] Fix single input range fields clearing (#7995) @flaviendelangle +- [fields] Clean the section object (#8009) @flaviendelangle +- [pickers] Fix `textField` slot `error` prop propagation (#7987) @LukasTy + +### `@mui/x-codemod@6.0.0-beta.5` + +#### Changes + +- [codemod] Add `apiRef.current.getRowIndex` to `DataGrid` renaming codemod (#8001) @MBilalShafi + +### Docs + +- [docs] Fine tune range fields demos (#7992) @LukasTy +- [docs] Fix a few scroll issues on mobile (#7900) @oliviertassinari +- [docs] Fix inconsistency in the data grid migration guide (#7963) @MBilalShafi + +### Core + +- [core] Fix `moment` locale on adapter tests (#8020) @flaviendelangle +- [test] Support all adapters on the field tests about the formats (#7996) @flaviendelangle + +## 6.0.0-beta.4 + +_Feb 16, 2023_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- ⚡️ Improve grid performance by reducing rerenders (#7857) @cherniavskii +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-beta.4` / `@mui/x-data-grid-pro@6.0.0-beta.4` / `@mui/x-data-grid-premium@6.0.0-beta.4` + +#### Changes + +- [DataGrid] Add interface for `singleSelect` column (#7685) @m4theushw +- [DataGrid] Allow to pass props to the `FocusTrap` inside the panel wrapper (#7733) @ivek-Prajapatii +- [DataGrid] Avoid unnecessary rerenders after `updateRows` (#7857) @cherniavskii +- [DataGridPro] Change cursor when dragging a column (#7725) @sai6855 +- [DataGridPremium] Fix `leafField` to have correct focus value (#7950) @MBilalShafi + +### `@mui/x-date-pickers@6.0.0-beta.4` / `@mui/x-date-pickers-pro@6.0.0-beta.4` + +#### Changes + +- [DateRangePicker] Fix slide transition by avoiding useless component re-rendering (#7874) @LukasTy +- [fields] Support Backspace key on `Android` (#7842) @flaviendelangle +- [fields] Support escaped characters on `Luxon` (#7888) @flaviendelangle +- [pickers] Prepare new pickers for custom fields (#7806) @flaviendelangle + +### `@mui/x-codemod@6.0.0-beta.4` + +#### Changes + +- [codemod] Fix import path (#7952) @LukasTy + +### Docs + +- [docs] Add an info callout specifying the current state of desktop time view (#7933) @LukasTy +- [docs] Add missing param in `useGridApiEventHandler` examples (#7939) @flaviendelangle +- [docs] Fix markdown table alignments (#7898) @oliviertassinari +- [docs] Improve `DataGrid` migration guide (#7861) @MBilalShafi +- [docs] Update `LocalizationProvider` `dateAdapter` with a link to the doc (#7872) @LukasTy + +### Core + +- [core] Run editing field tests on all major adapters (#7868) @flaviendelangle + +## 6.0.0-beta.3 + +_Feb 9, 2023_ + +We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: + +- ⬅️ Add right-to-left support for the data grid (#6580) @yaredtsy +- ⚡️ Improve grid resize performance (#7864) @cherniavskii +- ✨ New codemods for migrating to v6 @MBilalShafi +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-beta.3` / `@mui/x-data-grid-pro@6.0.0-beta.3` / `@mui/x-data-grid-premium@6.0.0-beta.3` + +#### Changes + +- [DataGrid] Add `BaseIconButton` component slot (#7329) @123joshuawu +- [DataGrid] Allow to customize the value displayed in the filter button tooltip (#6956) @ithrforu +- [DataGrid] Improve grid resize performance (#7864) @cherniavskii +- [DataGrid] Make `apiRef.current.getRowWithUpdatedValues` stable (#7788) @m4theushw +- [DataGrid] Support RTL (#6580) @yaredtsy +- [DataGrid] Improve query selectors for selecting cell element (#7354) @yaredtsy +- [l10n] Improve Brazilian Portuguese (pt-BR) locale (#7854) @ed-ateixeira + +### `@mui/x-date-pickers@6.0.0-beta.3` / `@mui/x-date-pickers-pro@6.0.0-beta.3` + +#### Changes + +- [fields] Allow to select year 2000 on 2-digit year section (#7858) @flaviendelangle +- [fields] Fix year editing on `day.js` (#7862) @flaviendelangle +- [fields] Fix year editing on valid date (#7834) @flaviendelangle +- [fields] Reset query when pressing `Backspace` or `Delete` (#7855) @flaviendelangle +- [pickers] Clean Popper position on new pickers (#7445) @flaviendelangle +- [pickers] Ditch pickers `skipLibCheck` (#7808) @LukasTy +- [pickers] Improve JSDoc and resulting API docs pages (#7847) @LukasTy + +### `@mui/x-codemod@6.0.0-beta.3` + +#### Changes + +- [codemod] Add more cases to `rename-selectors-and-events` codemod (#7856) @MBilalShafi +- [codemod] Add warning message to the codemods and migration guide (#7813) @MBilalShafi +- [codemod] Add codemod to remove unnecessary `experimentalFeatures` flag (#7836) @MBilalShafi +- [codemod] Rename `GridFilterItem` props (#7483) @MBilalShafi +- [codemod] Rename `linkOperators` to `logicOperators` (#7707) @MBilalShafi +- [codemod] Replace `onCellFocusOut` prop for Data Grid (#7786) @MBilalShafi + +### Docs + +- [docs] Add a "Whats new in v6" page linked on the sidebar (#7820) @joserodolfofreitas +- [docs] Fix hydration crash in pickers (#7734) @oliviertassinari +- [docs] Remove no longer relevant range shortcuts section (#7840) @LukasTy +- [docs] Use `@next` tag in grid and pickers installation instructions (#7814) @cherniavskii + +### Core + +- [core] Remove `tslint` package leftovers (#7841) @LukasTy +- [test] Use `createDescribes` for `describeValue` and `describeValidation` (#7866) @flaviendelangle + +## 6.0.0-beta.2 + +We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Support week day formats in the field components +- 🌍 Add Hungarian (hu-HU) and Urdu (ur-PK) locales +- 🌍 Improve French (fr-FR) and Italian (it-IT) locales +- ✨ New codemods for migrating to v6 +- 📚 Documentation improvements +- 🐞 Bug fixes + +### `@mui/x-data-grid@6.0.0-beta.2` / `@mui/x-data-grid-pro@6.0.0-beta.2` / `@mui/x-data-grid-premium@6.0.0-beta.2` + +#### Changes + +- [DataGrid] Handle non-numeric values returned by `getRowHeight` prop (#7703) @cherniavskii +- [DataGrid] Merge row styles with `componentsProps.row.style` (#7641) @marktoman +- [l10n] Add Hungarian (hu-HU) locale (#7776) @noherczeg +- [l10n] Add Urdu (ur-PK) locale (#6866) @MBilalShafi +- [l10n] Improve French (fr-FR) locale (#7777) @ivek-Prajapatii +- [l10n] Improve Italian (it-IT) locale (#7761) @simonecervini + +### `@mui/x-date-pickers@6.0.0-beta.2` / `@mui/x-date-pickers-pro@6.0.0-beta.2` + +#### Changes + +- [fields] Support week day formats (#7392) @flaviendelangle +- [pickers] Allow to initialize and control the `rangePosition` on all range components (#7764) @flaviendelangle +- [pickers] Fix theme augmentation (#7800) @LukasTy +- [pickers] Hide scrollbars in the date calendar container (#7766) @ivek-Prajapatii +- [pickers] Remove the dependency on `rifm` (#7785) @alexfauquette + +### `@mui/x-codemod@6.0.0-beta.2` + +#### Changes + +- [codemod] Add pickers `rename-default-toolbar-title-localeText` codemod (#7752) @LukasTy +- [codemod] Add pickers `rename-inputFormat-prop` codemod (#7736) @LukasTy + +### Docs + +- [docs] Fix a typo in data grid layout page (#7113) @sfbaker7 +- [docs] Fix require context path to avoid duplicate key creation (#7781) @LukasTy +- [docs] Polish pickers migration docs (#7737) @LukasTy +- [docs] Rename `next` translation docs and remove duplicates with `-next` (#7729) @LukasTy + +### Core + +- [core] Fix l10n data file (#7804) @flaviendelangle +- [core] Fix Next.js warning (#7754) @oliviertassinari +- [core] Remove unused demos (#7758) @flaviendelangle + +## 6.0.0-beta.1 + +_Jan 27, 2023_ + +We'd like to offer a big thanks to the 17 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 New shortcuts component for the date pickers (#7154) @alexfauquette +- 🌍 Add Belarusian (be-BY), Czech (cs-CZ) and Russian (ru-RU) locales +- 🌍 Improve Spanish (es-ES), Japanese (ja-JP), Slovak (sk-SK), and Vietnamese (vi-VN) locales +- ✨ New codemods for migrating to v6 +- 📚 Documentation improvements +- 🐞 Bug fixes + +### `@mui/x-data-grid@6.0.0-beta.1` / `@mui/x-data-grid-pro@6.0.0-beta.1` / `@mui/x-data-grid-premium@6.0.0-beta.1` + +#### Changes + +- [DataGrid] Add `title` attribute to cells (#7682) @thupi +- [DataGrid] Fix `autoHeight` not working properly inside of a flex container (#7701) @cherniavskii +- [DataGrid] Fix grid state not being updated after print preview is closed (#7642) @cherniavskii +- [DataGrid] Fix non-hideable columns visibility toggling (#7637) @cherniavskii +- [DataGrid] Fix scrolling on resize for data grids inside shadow root (#7298) @akiradev +- [l10n] Add Slovak (sk-SK) translation for aggregation functions (#7702) @msidlo +- [l10n] Add missing core locales for `MuiTablePagination` (#7717) @MBilalShafi +- [l10n] Improve Spanish (es-ES) and Vietnamese (vi-VN) locale (#7634) @WiXSL and @SpacerZ +- [l10n] Add Belarusian (be-BY) locale (#7646) @olhalink + +### `@mui/x-date-pickers@6.0.0-beta.1` / `@mui/x-date-pickers-pro@6.0.0-beta.1` + +#### Changes + +- [pickers] Fix `aria-labelledby` assignment to dialog (#7608) @LukasTy +- [pickers] Support `UTC` with `dayjs` (#7610) @flaviendelangle +- [pickers] Update focus when opening a UI view (#7620) @alexfauquette +- [DateRangePickers] Add shortcuts component (#7154) @alexfauquette +- [l10n] Add Czech (cs-CZ) locale (#7645) @OndrejHj04 +- [l10n] Add Russian (ru-RU) locale (#7706) @rstmzh +- [l10n] Improve Japanese (ja-JP) locale (#7624) @makoto14 + +### `@mui/x-codemod@6.0.0-beta.1` + +#### Changes + +- [codemod] Add pickers `replace-toolbar-props-by-slot` codemod (#7687) @alexfauquette +- [codemod] Add `GridColumnMenuItemProps` to `column-menu-components-rename` codemod (#7710) @MBilalShafi +- [codemod] Add `headerHeight` prop update to `row-selection-props-rename` codemod (#7711) @MBilalShafi +- [codemod] Add pickers codemod for `components` to `slots` renaming (#7533) @alexfauquette +- [codemod] Add pickers `migrate-to-components-componentsProps` and `replace-arrows-button-slot` codemods (#7698) @alexfauquette +- [codemod] Add data grid codemod renaming `rowsPerPageOptions` prop to `pageSizeOptions` (#7603) @MBilalShafi +- [codemod] Add pickers `rename-should-disable-time` codemod (#7709) @alexfauquette +- [codemod] Add data grid `row-selection-props-rename` codemod (#7485) @MBilalShafi +- [codemod] Add data grid `rename-selectors-and-events` codemod (#7699) @MBilalShafi +- [codemod] Add pickers `replace-tabs-props` codemod (#7639) @alexfauquette + +### Docs + +- [docs] Add info callout about available component `slots` (#7714) @ivek-Prajapatii +- [docs] Add recipe for pinning grouped column (#7712) @MBilalShafi +- [docs] Fix 404 links to picker API page @oliviertassinari +- [docs] Update `DemoContainer` `components` prop using a codemod (#7574) @alexfauquette + +### Core + +- [core] Fix `innerslotProps` typo (#7697) @LukasTy +- [core] Upgrade monorepo (#7676) @cherniavskii + +## 6.0.0-beta.0 + +_Jan 19, 2023_ + +After a long period in alpha, we're glad to announce the first MUI X v6 beta! +We encourage you to try out this version, packed with improvements, bug fixes, and a few highlighted features ✨: + +**Data Grid** + +- [Access to the API Object in the community version](https://mui.com/x/react-data-grid/api-object/) +- [Improved column menu](https://mui.com/x/react-data-grid/column-menu/) +- [Cell selection range](https://mui.com/x/react-data-grid/cell-selection/) (Premium) + +**Date and Time pickers** + +- [Fields: the new default input for pickers](https://mui.com/x/react-date-pickers/fields/). +- [Improved layout customization](https://mui.com/x/react-date-pickers/custom-layout/) +- [Edit date ranges with drag and drop](https://mui.com/x/react-date-pickers/date-range-calendar/) (Pro) + +You can check the migration guides for the [Data Grid](https://mui.com/x/migration/migration-data-grid-v5/) and [Date Pickers](https://mui.com/x/migration/migration-pickers-v5/) in the documentation. + +We'd like to offer a big thanks to the 10 contributors who made this release possible. + +- ✨ Merge `page` and `pageSize` props into `paginationModel` +- 🚀 Replace old masked picker components with field based ones +- 🌍 Improve Swedish (sv-SE) and Italian (it-IT) locales +- 📚 Documentation improvements +- 🐞 Bug fixes + +### `@mui/x-data-grid@6.0.0-beta.0` / `@mui/x-data-grid-pro@6.0.0-beta.0` / `@mui/x-data-grid-premium@6.0.0-beta.0` + +#### Breaking changes + +- The `disableExtendRowFullWidth` prop was removed. + Use `showCellVerticalBorder` or `showColumnVerticalBorder` props to show or hide right border for cells and header cells respectively. + +- The `GridCellIdentifier` type was removed. Use `GridCellCoordinates` instead. + +- The `singleSelect` column type now has a default value formatter that returns the `label` corresponding to the selected value when `valueOptions` is an array of objects. + As consequence, any existing value formatter will not be applied to the individual options anymore, but only to the text of the cell. + It is recommended to migrate `valueOptions` to an array of objects to be able to add a custom label for each value. + To override the label used for each option when the cell is in edit mode or in the filter panel, the following components now support a `getOptionLabel` prop. + This prop accepts a callback that is called with the item from `valueOptions` and must return the new label. + + - `GridEditSingleSelectCell` + - `GridFilterInputSingleSelect` + - `GridFilterInputMultipleSingleSelect` + +- The `getGridSingleSelectQuickFilterFn` function was removed. + You can copy the old function and pass it to the `getApplyQuickFilterFn` property of the `singleSelect` column definition. + +- The `page` and `pageSize` props and their respective event handlers `onPageChange` and `onPageSizeChange` were removed. + Use `paginationModel` and `onPaginationModelChange` instead. + + ```diff + <DataGrid + rows={rows} + columns={columns} + - page={page} + - pageSize={pageSize} + - onPageChange={handlePageChange} + - onPageSizeChange={handlePageSizeChange} + + paginationModel={{ page, pageSize }} + + onPaginationModelChange={handlePaginationModelChange} + /> + ``` + +- The properties `initialState.pagination.page` and `initialState.pagination.pageSize` were also removed. + Use `initialState.pagination.paginationModel` instead. + + ```diff + -initialState={{ pagination: { page: 1, pageSize: 10 } }} + +initialState={{ pagination: { paginationModel: { page: 1, pageSize: 10 } } }} + ``` + +- The `rowsPerPageOptions` prop was renamed to `pageSizeOptions`. + + ```diff + -<DataGrid rowsPerPageOptions={[10, 20, 50]} /> + +<DataGrid pageSizeOptions={[10, 20, 50]} /> + ``` + +- The `error` and `onError` props were removed - the grid no longer catches errors during rendering. + To catch errors that happen during rendering use the [error boundary](https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary). + +- The `components.ErrorOverlay` slot was removed. + +- The `GridErrorOverlay` component was removed. + +- The `componentError` event was removed. + Use the [error boundary](https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary) to catch errors thrown during rendering. + +- The `apiRef.current.showError` method was removed. + The UI for errors is no longer handled by the grid. + +- The `date` and `dateTime` columns now only support `Date` objects as values. + To parse a string value, use the [`valueGetter`](https://mui.com/x/react-data-grid/column-definition/#value-getter): + + ```tsx + <DataGrid + columns={[ + { + field: 'date', + type: 'date', + valueGetter: (params) => new Date(params.value), + }, + ]} + /> + ``` + +- The following selectors have been renamed: + + - `gridVisibleSortedRowIdsSelector` renamed to `gridExpandedSortedRowIdsSelector` + - `gridVisibleSortedRowEntriesSelector` renamed to `gridExpandedSortedRowEntriesSelector` + - `gridVisibleRowCountSelector` renamed to `gridExpandedRowCountSelector` + - `gridVisibleSortedTopLevelRowEntriesSelector` renamed to `gridFilteredSortedTopLevelRowEntriesSelector` + - `gridVisibleTopLevelRowCountSelector` renamed to `gridFilteredTopLevelRowCountSelector` + +- The `apiRef.current.getVisibleRowModels` method was removed. Use the `gridVisibleSortedRowEntriesSelector` selector instead. + +- The `GridRowScrollEndParams["virtualRowsCount"]` parameter was renamed to `GridRowScrollEndParams["visibleRowsCount"]`. + +#### Changes + +- [DataGrid] Add default value formatter to `singleSelect` (#7290) @m4theushw +- [DataGrid] Fix flickering on grid scroll (#7549) @cherniavskii +- [DataGrid] Merge `page` and `pageSize` props into `paginationModel` (#7147) @MBilalShafi +- [DataGrid] Only support `Date` as value in `date` and `dateTime` column types (#7594) @cherniavskii +- [DataGrid] Remove error boundary (#7579) @cherniavskii +- [DataGrid] Remove `GridCellIdentifier` redundant type (#7578) @MBilalShafi +- [DataGrid] Remove `disableExtendRowFullWidth` prop (#7373) @MBilalShafi +- [DataGrid] Remove tag limit from `isAnyOf` operator input (#7592) @m4theushw +- [DataGrid] Use v6 terminology (#7473) @DanailH +- [DataGridPremium] Keep focus on first selected cell (#7482) @m4theushw +- [l10n] Update Swedish (sv-SE) locale (#7585) @MaanTyringe + +### `@mui/x-date-pickers@6.0.0-beta.0` / `@mui/x-date-pickers-pro@6.0.0-beta.0` + +#### Breaking changes + +- The `showToolbar` prop has been moved to the `toolbar` component slot props: + + ```diff + <DatePicker + - showToolbar + + slotProps={{ + + toolbar: { + + hidden: false, + + } + + }} + /> + ``` + +- The new pickers have replaced the legacy one. + + If you were using the new pickers with their temporary name, you just have to change your imports. + + ```diff + -import { Unstable_NextDatePicker as NextDatePicker } from '@mui/x-date-pickers/NextDatePicker'; + +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; + -import { Unstable_DesktopNextDatePicker as DesktopNextDatePicker } from '@mui/x-date-pickers/DesktopNextDatePicker'; + +import { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker'; + + // Same for all the other pickers with an `Unstable_` prefix + ``` + + If you were still using the legacy picker (`DatePicker`, `DesktopDatePicker`, ...), please take a look at our [migration guide](https://mui.com/x/migration/migration-pickers-v5/#picker-components) for detailed explanations on how to start using the new ones. + +- The fields components are no longer unstable + + ```diff + -import { Unstable_DateField as DateField } from '@mui/x-date-pickers/DateField'; + +import { DateField } from '@mui/x-date-pickers/DateField'; + ``` + +#### Changes + +- [DateRangeCalendar] Ignore `calendars` prop on mobile (#7526) @flaviendelangle +- [DateRangeCalendar] Ignore `showDaysOutsideCurrentMonth` when `calendars > 1` (#7529) @flaviendelangle +- [DateRangePicker] Propagate `rangePosition` to view (#7602) @LukasTy +- [fields] Fix upper boundary on 12-hours sections (#7618) @flaviendelangle +- [fields] Publish value when cleaning the last section of a date (#7519) @flaviendelangle +- [fields] Remove the `Unstable_` prefix for field components (#7185) @flaviendelangle +- [pickers] Add missing `slots` and `slotProps` on the date range view renderer (#7586) @flaviendelangle +- [pickers] Drop legacy pickers (#7545) @flaviendelangle +- [pickers] Fix day calendar row and column index (#7589) @LukasTy +- [pickers] Go to the default view when opening a picker (#7484) @flaviendelangle +- [pickers] Make sure the `className` and `sx` props are applied to the field / static root of the picker and never to the view (#7600) @flaviendelangle +- [pickers] Rename new pickers (#7575) @flaviendelangle +- [pickers] Rename remaining `components` and `componentSlots` references (#7576) @LukasTy +- [pickers] Replace `showToolbar` with toolbar slot `hidden` prop (#7498) @LukasTy +- [pickers] Spread props to the DOM in `DateCalendar` and `TimeClock` (#7587) @flaviendelangle +- [pickers] Stop using the `WrapperVariantContext` in `DateRangeCalendar` (#7488) @flaviendelangle +- [l10n] Improve Italian (it-IT) locale (#7582) @marikadeveloper + +### `@mui/x-codemod@6.0.0-beta.0` + +#### Changes + +- [codemod] Remove `disableExtendRowFullWidth` prop (#7508) @MBilalShafi + +### Docs + +- [docs] Clean-up the `field components` page (#7605) @flaviendelangle +- [docs] List all pickers toolbar pages in api docs side menu (#7577) @LukasTy +- [docs] Remove "Flex layout" docs section and demo (#7477) @cherniavskii +- [docs] Rework the pickers "Getting Started" page (#7140) @flaviendelangle + +### Core + +- [core] Add missing `status: needs triage` label on RFC @oliviertassinari +- [core] Add release documentation step detailing `x-codemod` package tag change (#7617) @LukasTy +- [core] Fix typo in `CHANGELOG` (#7611) @flaviendelangle +- [test] Fix date range picker tests to work with western time zones (#7581) @m4theushw + +## 6.0.0-alpha.15 + +_Jan 13, 2023_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Support components and slots for new pickers (#7390) @alexfauquette +- ✨ Update `onColumnOrderChange` behavior to match `onRowsOrderChange` (#7385) @DanailH +- 🌍 Improve Spanish (es-ES) and Belarusian (be-BY) locales +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.15` / `@mui/x-data-grid-pro@6.0.0-alpha.15` / `@mui/x-data-grid-premium@6.0.0-alpha.15` + +#### Breaking changes + +- Remove the `onCellFocusOut` prop (#6302) @cherniavskii + + The `onCellFocusOut` prop was removed. Use `componentsProps.cell.onBlur` instead: + + ```tsx + <DataGrid + componentsProps={{ + cell: { + onBlur: (event) => { + const cellElement = event.currentTarget; + const field = cellElement.getAttribute('data-field'); + const rowId = cell.parentElement.getAttribute('data-id'); + }, + }, + }} + /> + ``` + +- [DataGrid] Stop exporting editing selector (#7456) @m4theushw + + The `gridEditRowsStateSelector` selector was removed. + +- [DataGrid] Rework column headers and virtual scroller positioning (#7001) @cherniavskii + + The `headerHeight` prop was renamed to `columnHeaderHeight`. + +- [DataGrid] Remove the `columnTypes` prop (#7309) @cherniavskii + + The `columnTypes` prop was removed. For custom column types see [Custom column types](https://mui.com/x/react-data-grid/column-definition/#custom-column-types) docs. + +- [DataGrid] Rename `linkOperators` to `logicOperators` (#7310) @cherniavskii + + The `apiRef.current.setFilterLinkOperator` method was renamed to `apiRef.current.setFilterLogicOperator`. + The `GridLinkOperator` enum was renamed to `GridLogicOperator`. + The `GridFilterModel['linkOperator']` was renamed to `GridFilterModel['logicOperator']`. + The `linkOperators` prop of `GridFilterForm` and `GridFilterPanel` components was renamed to `logicOperators`. + The `linkOperatorInputProps` prop of `GridFilterForm` component was renamed to `logicOperatorInputProps`. + The `filterFormProps.linkOperatorInputProps` prop in `GridFilterForm` component was renamed to `filterFormProps.logicOperatorInputProps`. + The `GridLocaleText['filterPanelLinkOperator']` property was renamed to `GridLocaleText['filterPanelLogicOperator']`. + The `.MuiDataGrid-filterFormLinkOperatorInput`CSS class was renamed to `.MuiDataGrid-filterFormLogicOperatorInput`. + +- [DataGrid] Remove `Alt+C` keyboard shortcut (#7466) @MBilalShafi + + <kbd>Alt</kbd> (or <kbd>⌥ Option</kbd>) + <kbd>C</kbd> keyboard shortcut is no longer supported. + +#### Changes + +- [DataGrid] Fix <kbd>Tab</kbd> between portaled and non-portaled edit components (#7098) @m4theushw +- [DataGrid] Remove the `columnTypes` prop (#7309) @cherniavskii +- [DataGrid] Remove the `onCellFocusOut` prop (#6302) @cherniavskii +- [DataGrid] Rename `linkOperators` to `logicOperators` (#7310) @cherniavskii +- [DataGrid] Rework column headers and virtual scroller positioning (#7001) @cherniavskii +- [DataGrid] Stop exporting editing selector (#7456) @m4theushw +- [DataGrid] Update `onColumnOrderChange` behavior to match `onRowsOrderChange` (#7385) @DanailH +- [DataGrid] Improve Spanish (es-ES) locale (#7447) @Anderssxn +- [DataGrid] Remove Alt+C keyboard shortcut (#7466) @MBilalShafi +- [DataGridPremium] Fix Excel export not working with date strings (#7396) @cherniavskii + +### `@mui/x-date-pickers@6.0.0-alpha.15` / `@mui/x-date-pickers-pro@6.0.0-alpha.15` + +#### Breaking changes + +- [pickers] Stop using the `WrapperVariantContext` in `MonthCalendar` and `YearCalendar` (#7382) @flaviendelangle + + The `modeMobile` and `modeDesktop` classes have been removed from the `PickersMonth` and `PickersYear` internal components. + + If you were using those classes on responsive components, + you can import `DEFAULT_DESKTOP_MODE_MEDIA_QUERY` from `@mui/x-date-pickers` or `@mui/x-date-pickers-pro` (or use your custom media query if any): + + ```diff + <GlobalStyles + styles={{ + - [`.${pickersYearClasses.modeDesktop}`]: { + - backgroundColor: 'red' + - } + + [DEFAULT_DESKTOP_MODE_MEDIA_QUERY]: { + + [`.${pickersYearClasses.root}`]: { + + backgroundColor: 'red' + + } + + } + - [`.${pickersYearClasses.modeMobile}`]: { + - backgroundColor: 'red' + - } + + [DEFAULT_DESKTOP_MODE_MEDIA_QUERY.replace('@media', '@media not')]: { + + [`.${pickersYearClasses.root}`]: { + + backgroundColor: 'red' + + } + + } + }} + /> + ``` + + Works exactly the same way for `PickersMonth`. + +- [pickers] Refactor `shouldDisableTime` (#7299) @LukasTy + + The `shouldDisableTime` prop signature has been changed. Either rename the prop usage to `shouldDisableClock` or refactor usage. + + ```diff + <DateTimePicker + - shouldDisableTime={(timeValue, view) => view === 'hours' && timeValue < 12} + + shouldDisableClock={(timeValue, view) => view === 'hours' && timeValue < 12} + /> + ``` + + ```diff + <DateTimePicker + - shouldDisableTime={(timeValue, view) => view === 'hours' && timeValue < 12} + + shouldDisableTime={(value, view) => view === 'hours' && value.hour() < 12} + /> + ``` + +#### Changes + +- [fields] Fix Android editing (#7444) @flaviendelangle +- [pickers] Add Belarusian (be-BY) locale (#7395) @olhalink +- [pickers] Hide am/pm controls when there is no hour view (#7380) @flaviendelangle +- [pickers] Hide the tabs by default on `DesktopNextDateTimePicker` (#7503) @flaviendelangle +- [pickers] Refactor `shouldDisableTime` (#7299) @LukasTy +- [pickers] Remove `WrapperVariantContext` from `DateTimePickerTabs` (#7374) @LukasTy +- [pickers] Stop using the `WrapperVariantContext` in `MonthCalendar` and `YearCalendar` (#7382) @flaviendelangle +- [pickers] Support `components` and `slots` for new pickers (#7390) @alexfauquette +- [pickers] Replace `slotsProps` by `slotProps` (#7528) @alexfauquette + +### Docs + +- [docs] Fix codesandboxes using `DemoContainer` (#7388) @LukasTy +- [docs] Fix wrong reference to currentView (#7441) @oliviertassinari +- [docs] New page for `DateRangeCalendar` (#7378) @flaviendelangle +- [docs] Update the migration guide with the breaking changes between the legacy and the new pickers (#7345) @flaviendelangle +- [docs] Use new pickers on "Custom components" demos (#7194) @flaviendelangle + +### Core + +- [core] Handle selection edge case (#7350) @oliviertassinari +- [core] Improve license message @oliviertassinari +- [core] Move default `closeOnSelect` to prop definition in `usePickerValue` (#7459) @flaviendelangle +- [core] Move interfaces of UI views to dedicated files (#7458) @flaviendelangle +- [core] Update package used to import LicenseInfo (#7442) @oliviertassinari +- [test] Add a few inheritComponent (#7352) @oliviertassinari + +## 6.0.0-alpha.14 + +_Jan 5, 2023_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- 📆 Add `SingleInputTimeRangeField` and `SingleInputDateTimeRangeField` components (#7186) @alexfauquette +- 🚀 Use grid for modifying pickers layout (#6900) @alexfauquette +- ✨ Improve field components editing experience (#7272) @flaviendelangle +- 💻 Multiple codemods +- 📚 Many documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.14` / `@mui/x-data-grid-pro@6.0.0-alpha.14` / `@mui/x-data-grid-premium@6.0.0-alpha.14` + +#### Breaking changes + +- [DataGrid] Set default `GridCellParams['value']` type to `unknown` (#6959) @cherniavskii + + The default type of `GridCellParams['value']` was changed from `any` to `unknown`. + +#### Changes + +- [DataGrid] Fix flickering on mount (#7205) @cherniavskii +- [DataGrid] Fix selected text in cell input not being copied in Firefox (#6593) @cherniavskii +- [DataGrid] Invert generic parameters order (#6874) @DanailH +- [DataGrid] Remove legacy logic for `singleSelect` inside `GridFilterInputValue` (#7386) @m4theushw +- [DataGrid] Remove remaining props from legacy editing API (#7381) @m4theushw +- [DataGrid] Set default `GridCellParams['value']` type to `unknown` (#6959) @cherniavskii + +### `@mui/x-date-pickers@6.0.0-alpha.14` / `@mui/x-date-pickers-pro@6.0.0-alpha.14` + +#### Breaking changes + +- [fields] Rename the `input` slot of the fields to `textField` to avoid confusion (#7369) @flaviendelangle + +#### Changes + +- [fields] Add `SingleInputTimeRangeField` and `SingleInputDateTimeRangeField` components (#7186) @alexfauquette +- [fields] Improve editing (automatic section switch, allow letter editing in digit section, allow numeric editing in letter section) (#7272) @flaviendelangle +- [fields] Rename the `input` slot of the fields to `textField` to avoid confusion (#7369) @flaviendelangle +- [fields] Prevent date change on `TimeField` arrow edition (#7383) @flaviendelangle +- [pickers] Clean some JSDoc descriptions (#7384) @flaviendelangle +- [pickers] Remove redundant `variants` in theme augmentation (#7356) @LukasTy +- [pickers] Remove the `PaperContent` slot from the new pickers (#7342) @flaviendelangle +- [pickers] Use grid for modifying the layout (#6900) @alexfauquette + +### `@mui/x-codemod@6.0.0-alpha.14` + +#### Changes + +- [codemod] Add new codemod for adapter import (#7348) @flaviendelangle +- [codemod] Add new codemod for the value prop renaming on the view components (#7338) @flaviendelangle +- [codemod] Reorganize codemods and add rename column menu components codemod (#7368) @MBilalShafi + +### Docs + +- [docs] Add example to add back the mobile keyboard view (#7347) @flaviendelangle +- [docs] Cleanup the doc pages of the community pickers (#7339) @flaviendelangle +- [docs] Drop security fixes support for v4 (#7322) @oliviertassinari +- [docs] Fix `disablePast` and `disableFuture` definition swap (#7324) @alexfauquette +- [docs] Hide ad for paid docs pages (#7321) @oliviertassinari +- [docs] New page for `TimeClock` (#7280) @flaviendelangle +- [docs] Note the pickers breaking changes supported by the codemod (#7337) @flaviendelangle +- [docs] Redirect translated pages (#7341) @cherniavskii +- [docs] Reorganize v6 pickers migration guide (#7257) @flaviendelangle + +### Core + +- [core] Apply eslint rule for React component @oliviertassinari +- [core] Apply title capitalization convention @oliviertassinari +- [core] Fix the product license reference name (#7367) @oliviertassinari +- [core] Order the slots alphabetically in the JSON files (#7349) @flaviendelangle +- [core] Remove blanklines in `_redirects` @oliviertassinari +- [core] Remove dead prettier config @oliviertassinari +- [core] Sync back with the mono repo (#7351) @oliviertassinari +- [core] Sync monorepo, fix layout scrollbar @oliviertassinari +- [core] Upgrade monorepo (#7307) @LukasTy + +## 6.0.0-alpha.13 + +_Dec 24, 2022_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 New column menu design and API +- 🌍 Improve Russian (ru-RU) and Korean (ko-KR) locales +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.13` / `@mui/x-data-grid-pro@6.0.0-alpha.13` / `@mui/x-data-grid-premium@6.0.0-alpha.13` + +#### Breaking changes + +- New column menu design and API (#6619) MBilalShafi + + The `currentColumn` prop passed to `components.ColumnMenu` was renamed to `colDef`. + The `column` prop passed to the items of the column menu was renamed to `colDef`. + The `DATA_GRID_DEFAULT_SLOTS_COMPONENTS` export has been removed. + The following components and interfaces were been renamed for consistency: + + **Community Package:** + + ```diff + -<GridFilterMenuItem /> + +<GridColumnMenuFilterItem /> + ``` + + ```diff + -<HideGridColMenuItem /> + +<GridColumnMenuHideItem /> + ``` + + ```diff + -<GridColumnsMenuItem /> + +<GridColumnMenuColumnsItem /> + ``` + + ```diff + -<SortGridMenuItems /> + +<GridColumnMenuSortItem /> + ``` + + ```diff + -interface GridFilterItemProps + +interface GridColumnMenuItemProps + ``` + + **Pro package:** + + ```diff + -<GridColumnPinningMenuItems /> + +<GridColumnMenuPinningItem /> + ``` + + **Premium package:** + + ```diff + -<GridAggregationColumnMenuItem /> + +<GridColumnMenuAggregationItem /> + ``` + + ```diff + -<GridRowGroupingColumnMenuItems /> + -<GridRowGroupableColumnMenuItems /> + +<GridColumnMenuGroupingItem /> + ``` + +- Improve column definition typing (#7224) @cherniavskii + + The `GridColumns` type was removed. Use `GridColDef[]` instead. + The `GridActionsColDef` interface was removed. Use `GridColDef` instead. + The `GridEnrichedColDef` type was removed. Use `GridColDef` instead. + The `GridStateColDef` type was removed. + + If you use it to type `searchPredicate`, use `GridColumnsPanelProps['searchPredicate']` instead. + If you use it to type `getApplyFilterFn`, `GridFilterOperator['getApplyFilterFn']` can be used as replacement. + +- Remove GridDensityType enum (#7304) @cherniavskii + + The `GridDensityTypes` enum was removed. Use `GridDensity` type instead. + +#### Changes + +- [DataGrid] Allow disabling of buttons in column panel (#6947) @MBilalShafi +- [DataGrid] Improve column definition typing (#7224) @cherniavskii +- [DataGrid] Improve column menu design and API (#6619) @MBilalShafi +- [DataGrid] Remove `GridDensityType` enum (#7304) @cherniavskii +- [DataGrid] Remove `rowHeight` and `headerHeight` from state (#7199) @DanailH +- [DataGrid] Remove column separator to match table styles (#7067) @MBilalShafi +- [DataGrid] Update Russian (ru-RU) locale (#7220) @eceluXa +- [DataGridPro] Use row ID as `key` of the detail panels (#7302) @m4theushw +- [DataGridPremium] Fix `exceljs` import with parcel (#7284) @alexfauquette + +### `@mui/x-date-pickers@6.0.0-alpha.13` / `@mui/x-date-pickers-pro@6.0.0-alpha.13` + +#### Breaking changes + +- Require Luxon 3.0.2 or higher (#7249) @flaviendelangle + + `AdapterLuxon` now requires `luxon` in version `3.0.2` or higher in order to work. + + Take a look at the [Upgrading Luxon](https://moment.github.io/luxon/#/upgrading) guide if you are using an older version. + +#### Changes + +- [DateRangePicker] Fix to propagate `disabled` and `readOnly` on multi input picker (#7135) @LukasTy +- [fields] Fix multi input fields root element props order and types (#7225) @LukasTy +- [fields] Support escaped characters (#7184) @flaviendelangle +- [pickers] Allow to define custom view renderers on the pickers (#7176) @flaviendelangle +- [pickers] Avoid running validation methods several times in `DateCalendar` (#7247) @flaviendelangle +- [pickers] Improve Korean (ko-KR) locale (#7266) @hanbin9775 +- [pickers] Require Luxon 3.0.2 or higher (#7249) @flaviendelangle +- [pickers] Rework view internals (#7097) @flaviendelangle + +### `@mui/x-codemod@6.0.0-alpha.13` + +#### Changes + +- [codemod] New codemod for view component renaming (#7264) @flaviendelangle + +### Docs + +- [docs] Fix some selectors not being documented (#7218) @cherniavskii +- [docs] New page for `DateCalendar` (#7053) @flaviendelangle +- [docs] Split selection docs (#7213) @m4theushw + +### Core + +- [core] Fix API demos callout spacing @oliviertassinari + +## 6.0.0-alpha.12 + +_Dec 16, 2022_ + +We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 The `apiRef` prop is now available in the `@mui/x-data-grid` package: + + ```tsx + const apiRef = useGridApiRef(); + + return <DataGrid apiRef={apiRef} {...other} />; + ``` + + See [the documentation](https://mui.com/x/react-data-grid/api-object/) for more information. + +- 🎁 The `DataGridPremium` now supports cell selection: + + ```tsx + <DataGridPremium unstable_cellSelection /> + ``` + + See [the documentation](https://mui.com/x/react-data-grid/cell-selection/) for more information + +- 🌍 Support the Right To Left orientation on the fields components +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.12` / `@mui/x-data-grid-pro@6.0.0-alpha.12` / `@mui/x-data-grid-premium@6.0.0-alpha.12` + +#### Breaking changes + +- The `showCellRightBorder` was renamed to `showCellVerticalBorder` +- The `showColumnRightBorder` was renamed to `showColumnVerticalBorder` +- The `.MuiDataGrid-withBorder` CSS class was renamed to `.MuiDataGrid-withBorderColor` and it only sets `border-color` CSS property now. +- The following undocumented properties from `apiRef` were removed: `footerRef`, `headerRef`, `columnHeadersElementRef`, `columnHeadersContainerElementRef` +- The `GridHeaderPlaceholder` component was removed. +- The `MAX_PAGE_SIZE` constant was removed. +- The `useGridScrollFn` hook was removed. + +#### Changes + +- [DataGrid] Display sort column menu items as per `sortingOrder` prop (#7180) @MBilalShafi +- [DataGrid] Support `apiRef` in Community package (#6773) @cherniavskii +- [DataGridPremium] Add support for cell selection (#6567) @m4theushw +- [DataGridPremium] Use separate cache for aggregation columns pre-processor (#7142) @m4theushw +- [DataGridPro] Fix missing border in right-pinned columns (#4197) @cherniavskii +- [DataGridPro] Fix wrong border color on skeleton cells (#7202) @cherniavskii + +### `@mui/x-date-pickers@6.0.0-alpha.12` / `@mui/x-date-pickers-pro@6.0.0-alpha.12` + +#### Changes + +- [fields] Fix bug introduced by RTL in single input range fields (#7189) @alexfauquette +- [fields] Support RTL out of the box (#6715) @alexfauquette +- [pickers] Clean `autoFocus` behavior on fields and new pickers (#7153) @flaviendelangle +- [pickers] Fix label on the new range pickers (#7210) @flaviendelangle +- [pickers] Fix wrong component name on `StaticNextDateTime` (#7187) @flaviendelangle + +### Docs + +- [docs] Add docs section about field placeholders' localization (#7139) @flaviendelangle +- [docs] Create a `DemoGrid` component to unify demos with several components (#7057) @flaviendelangle +- [docs] Document aggregation selectors (#7148) @cherniavskii +- [docs] Fix 301 links to demo pages in API pages (#7197) @oliviertassinari +- [docs] Fix errors and warning in demos (#7209) @LukasTy +- [docs] Use `DemoContainer` and `DemoItem` on every picker demo (#7149) @flaviendelangle + +### Core + +- [core] Fix broken test (#7179) @flaviendelangle + +## 6.0.0-alpha.11 + +_Dec 8, 2022_ + +We'd like to offer a big thanks to the 7 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Add dragging support for the new Date Range Picker (`NextDateRangePicker`) (#6763) @LukasTy +- ⚡️ Improve performance of the `day` view (#7066) @flaviendelangle +- ✨ Fix lazy-loading feature not working in `DataGridPremium` (#7124) @m4theushw +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.11` / `@mui/x-data-grid-pro@6.0.0-alpha.11` / `@mui/x-data-grid-premium@6.0.0-alpha.11` + +#### Breaking changes + +- The `filterPanelOperators` translation key was renamed to `filterPanelOperator` (#7062) @MBilalShafi +- The `components.Header` slot was removed. Use `components.Toolbar` slot instead (#6999) @cherniavskii + +#### Changes + +- [DataGrid] Fix rows not rendering properly after height change (#6892) @MBilalShafi +- [DataGrid] Remove `Header` slot (#6999) @cherniavskii +- [DataGrid] Rename `filterPanelOperators` -> `filterPanelOperator` (#7062) @MBilalShafi +- [DataGridPremium] Add support for lazy-loading (#7124) @m4theushw +- [DataGridPremium] Pass `groupId` to aggregation function (#7003) @m4theushw + +### `@mui/x-date-pickers@6.0.0-alpha.11` / `@mui/x-date-pickers-pro@6.0.0-alpha.11` + +#### Breaking changes + +- Remove the callback version of the `action` prop on the `actionBar` slot (#7038) @flaviendelangle + + The `action` prop of the `actionBar` slot is no longer supporting a callback. + Instead, you can pass a callback at the slot level: + + ```diff + <DatePicker + componentsProps={{ + - actionBar: { + - actions: (variant) => (variant === 'desktop' ? [] : ['clear']), + - }, + + actionBar: ({ wrapperVariant }) => ({ + + actions: wrapperVariant === 'desktop' ? [] : ['clear'], + + }), + }} + /> + ``` + +- The `selectedDays` prop has been removed from the `Day` component (#7066) @flaviendelangle + If you need to access it, you can control the value and pass it to the slot using `componentsProps`: + + ```tsx + function CustomDay({ selectedDay, ...other }) { + // do something with 'selectedDay' + return <PickersDay {...other} />; + } + function App() { + const [value, setValue] = React.useState(null); + return ( + <DatePicker + value={value} + onChange={(newValue) => setValue(newValue)} + components={{ Day: CustomDay }} + componentsProps={{ + day: { selectedDay: value }, + }} + /> + ); + } + ``` + +- The `currentlySelectingRangeEnd` / `setCurrentlySelectingRangeEnd` props on the Date Range Picker toolbar have been renamed to `rangePosition` / `onRangePositionChange` (#6989) @flaviendelangle + + ```diff + const CustomToolbarComponent = props => ( + <div> + - <button onChange={() => props.setCurrentlySelectingRangeEnd('end')}>Edit end date</button> + + <button onClick={() => props.onRangePositionChange('end')}>Edit end date</button> + - <div>Is editing end date: {props.currentlySelectingRangeEnd === 'end'}</div> + + <div>Is editing end date: {props.rangePosition === 'end'}</div> + </div> + ) + <DateRangePicker + components={{ + Toolbar: CustomToolbarComponent + }} + /> + ``` + +#### Changes + +- [DateRangePicker] Add dragging support to edit range (#6763) @LukasTy +- [pickers] Fix lost props on Date Range Pickers (#7092) @flaviendelangle +- [pickers] Fix toolbar on the new range pickers (#6989) @flaviendelangle +- [pickers] Improve performance of `DayCalendar` (#7066) @flaviendelangle +- [pickers] Initialize date without time when selecting year or month (#7120) @LukasTy +- [pickers] Remove the callback version of the `action` prop in the `actionBar` component slot (#7038) @flaviendelangle + +### Docs + +- [docs] Add `GridCell` change in migration guide (#7087) @MBilalShafi +- [docs] Fix API page ad space regression (#7051) @oliviertassinari +- [docs] Update localization doc to use existing locale (#7102) @LukasTy + +### Core + +- [core] Add codemod to move l10n translation (#7027) @alexfauquette +- [core] Add notes to remove the legacy pickers internals (#7133) @flaviendelangle +- [core] Remove `internals-fields` imports (#7119) @flaviendelangle +- [core] Remove unused code (#7094) @flaviendelangle +- [core] Sync `ApiPage.js` with monorepo (#7073) @oliviertassinari +- [test] Fix karma-mocha assertion error messages (#7054) @cherniavskii + +## 6.0.0-alpha.10 + +_Dec 1, 2022_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Improve Ukrainian (uk-UA) and add Urdu (ur-PK) locales +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.10` / `@mui/x-data-grid-pro@6.0.0-alpha.10` / `@mui/x-data-grid-premium@6.0.0-alpha.10` + +### Breaking changes + +- [DataGrid] Removes `GridCell` fallback to `valueToRender` on `null` children (#7023) @MBilalShafi + + Returning `null` in `column.renderCell` or `column.renderEditCell` now renders an empty cell instead of the default formatted value. + +- [DataGrid] Refactor `GridFilterItem` props (#6985) @MBilalShafi + + Properties `columnField` and `operatorValue` of `GridFilterItem` are renamed `field` and `operator`. And `operator` property is now required. + + ```diff + filterModel: { + items: [{ + - columnField: 'rating', + + field: 'rating', + - operatorValue: '>', + + operator: '>', // required + value: '2.5' + }], + }, + ``` + +#### Changes + +- [DataGrid] Fix row selection when clicking blank cell (#6974) @yami03 +- [DataGrid] Refactor `GridFilterItem` props (#6985) @MBilalShafi +- [DataGrid] Removes `<GridCell />` fallback to `valueToRender` on `null` children (#7023) @MBilalShafi +- [DataGridPremium] Fix empty column group in Excel export (#7029) @alexfauquette +- [DataGridPremium] Update cache before hydrating columns (#7040) @m4theushw +- [DataGridPremium] Use custom cell component for grouping cell by default (#6692) @cherniavskii +- [l10n] Improve Ukrainian (uk-UA) locale (#7009) @rettoua + +### `@mui/x-date-pickers@6.0.0-alpha.10` / `@mui/x-date-pickers-pro@6.0.0-alpha.10` + +#### Breaking changes + +- Rename `dateRangeIcon` to `dateIcon` (#7024) @LukasTy + + The `dateRangeIcon` prop has been renamed to `dateIcon`: + + ```diff + // Same on all other Date Time Picker variations + <DateTimePicker + componentsProps={{ + tabs: { + - dateRangeIcon: <LightModeIcon />, + + dateIcon: <LightModeIcon />, + } + }} + /> + ``` + +#### Changes + +- [DateTimePicker] Rename `dateRangeIcon` to `dateIcon` (#7024) @LukasTy +- [pickers] Allow non-controlled usage of `TimeClock` (#6962) @flaviendelangle +- [pickers] Throw error when using adapter from `@date-io` (#6972) @flaviendelangle +- [l10n] Add Urdu (ur-PK) locale (#7007) @MBilalShafi +- [l10n] Improve Ukrainian (uk-UA) locale (#7009) @rettoua + +### Docs + +- [docs] Add Demos section on the pickers API pages (#6909) @flaviendelangle +- [docs] Add missing pickers migration docs (#7000) @LukasTy +- [docs] Fix broken link (#7048) @flaviendelangle +- [docs] Improve demo about customizing pagination (#6724) @m4theushw +- [docs] Keep track of localization completion (#7002) @alexfauquette +- [docs] Remove `LocalizationProvider` from previews (#6869) @flaviendelangle +- [docs] Remove the statement of support to RTL (#6521) @joserodolfofreitas +- [docs] Rework localization doc pages (#6625) @flaviendelangle +- [docs] Setup GitHub issue template for feedbacks about docs (#7026) @alexfauquette +- [docs] Test links with API page ignoring url hash (#7004) @alexfauquette +- [docs] Update API links from clock-picker to time-clock (#6993) @alexfauquette +- [docs] Use new pickers on the validation page (#7047) @flaviendelangle + +### Core + +- [core] Remove useless type casting in field hooks (#7045) @flaviendelangle +- [test] Sync `test:unit` with monorepo (#6907) @oliviertassinari + +## 6.0.0-alpha.9 + +_Nov 24, 2022_ + +We'd like to offer a big thanks to the 14 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Introduce the v6 pickers, built on top of the field components [DatePicker](https://mui.com/x/react-date-pickers/date-picker/), [TimePicker](https://mui.com/x/react-date-pickers/time-picker/), [DateTimePicker](https://mui.com/x/react-date-pickers/date-time-picker/), [DateRangePicker](https://mui.com/x/react-date-pickers/date-range-picker/). + + The old (legacy) components will be removed at the end of the v6 beta. + +- 💅 Add support for `theme.vars` in the pickers and the DataGrid (#6784, #6778) @alexfauquette +- ✨ Improve DataGrid theme augmentation (#5818) @iigrik +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.9` / `@mui/x-data-grid-pro@6.0.0-alpha.9` / `@mui/x-data-grid-premium@6.0.0-alpha.9` + +### Breaking changes + +- <kbd>Ctrl</kbd> + <kbd>Enter</kbd> will no longer toggle the master detail panel (#6945) @MBilalShafi + You can restore the old behavior by listening to `cellKeyDown` and calling `apiRef.current.toggleDetailPanel()`. + +- Remove unnecessary keyboard navigation events (#6863) @m4theushw + The `cellNavigationKeyDown` event was removed. Use `cellKeyDown` and check the key provided in the event argument. + The `columnHeaderNavigationKeyDown` event was removed. Use `columnHeaderKeyDown` and check the key provided in the event argument. + +- Rename `rowsScroll` event to `scrollPositionChange` (#6957) @DanailH + +#### Changes + +- [DataGrid] Add spacing in `GridToolbar` for better visibility (#6904) @MBilalShafi +- [DataGrid] Improve typing for the theme in `styleOverrides` (#5818) @iigrik +- [DataGrid] Prevents master detail panel toggle with <kbd>Ctrl</kbd> + <kbd>Enter</kbd> (#6945) @MBilalShafi +- [DataGrid] Remove unnecessary keyboard navigation events (#6863) @m4theushw +- [DataGrid] Rename `ErrorOverlay` to `GridErrorOverlay` (#6946) @MBilalShafi +- [DataGrid] Stop exporting root base state selectors (#6912) @DanailH +- [DataGrid] Support `theme.vars` (#6784) @alexfauquette +- [DataGrid] Rename `rowsScroll` event to `scrollPositionChange` (#6957) @DanailH +- [DataGridPro] Fix lazy-loaded rows not working with `updateRows` API method (#6976) @cherniavskii +- [DataGridPremium] Improve typing for theme in `styleOverrides` (#6920) @m4theushw +- [l10n] Fix translation of `filterOperatorBefore` in Arabic (ar-SD) locale (#6884) @HassanGhazy + +### `@mui/x-date-pickers@6.0.0-alpha.9` / `@mui/x-date-pickers-pro@6.0.0-alpha.9` + +#### Changes + +- [DatePicker] Display week number (#6144) @alexfauquette +- [pickers] Clean `PickersCalendarHeader` slots (#6943) @flaviendelangle +- [pickers] Do not loose the translations when using nested `LocalizationProvider` with each a `localeText` prop (#6895) @flaviendelangle +- [pickers] Fix calendar header switch view button hover circle (#6938) @rajendraarora16 +- [pickers] Fix focus management (#6914) @alexfauquette +- [pickers] Fix usage with Shadow DOM (#6952) @flaviendelangle +- [pickers] New `MobileDateRangePicker`, `DesktopDateRangePicker`, `DateRangePicker` and `StaticDateRangePicker` based on `MultiInputDateRangeField` (#6888) @flaviendelangle +- [pickers] Support `theme.vars` (#6778) @alexfauquette + +### Docs + +- [docs] Add new "Expired package version" error type (#6937) @oliviertassinari +- [docs] Add support for API pages of unstable components (#6981) @flaviendelangle +- [docs] Create docs for the new date pickers (#6902) @flaviendelangle +- [docs] Create docs for the new time, date time and date range pickers (#6958) @flaviendelangle +- [docs] Fix demos live edit (#6975) @oliviertassinari +- [docs] Fix toggle button bug in demos in Custom Components page (#6913) @01zulfi +- [docs] Remove partial Portuguese and Chinese translations of the pickers pages (#6893) @flaviendelangle + +### Core + +- [core] Cleanup `describeValidation` (#6942) @flaviendelangle +- [core] Group renovate GitHub Action dependency updates @oliviertassinari +- [core] Introduce `x-codemod` package (#6876) @LukasTy +- [core] Update minimum supported version of Node.js to 14.0.0 (#6966) @cherniavskii +- [core] Upgrade monorepo (#6905) @cherniavskii +- [core] Upgrade node to v14.21 (#6916) @piwysocki +- [core] Upgrade ESLint (#6738) @Janpot +- [test] Test validation on date range view (#6941) @alexfauquette + +## 6.0.0-alpha.8 + +_Nov 17, 2022_ + +We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Support aggregating data from multiple row fields (#6656) @cherniavskii +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.8` / `@mui/x-data-grid-pro@6.0.0-alpha.8` / `@mui/x-data-grid-premium@6.0.0-alpha.8` + +#### Changes + +- [DataGrid] Fix `ErrorOverlay` not receiving defined input props (#6819) @banoth-ravinder +- [DataGrid] Fix conflict with the latest version of `@types/react` (#6797) @izv +- [DataGrid] Make more `apiRef` methods private (#6700) @cherniavskii +- [DataGrid] Provide a clear error message when upgrading (#6685) @oliviertassinari +- [DataGridPremium] Allow to customize the indent of group expansion toggle (#6837) @MBilalShafi +- [DataGridPremium] Support aggregating data from multiple row fields (#6656) @cherniavskii +- [DataGridPro] Fix detail panel not working with `getRowSpacing` prop (#6707) @cherniavskii +- [DataGridPro] Opt-out for column jump back on re-order (#6733) @gavbrennan +- [l10n] Improve Finnish (fi-FI) locale (#6859) @RainoPikkarainen + +### `@mui/x-date-pickers@6.0.0-alpha.8` / `@mui/x-date-pickers-pro@6.0.0-alpha.8` + +#### Breaking changes + +- The `ClockPicker` view component has been renamed to `TimeClock` to better fit its usage: + + ```diff + -<ClockPicker {...props} /> + +<TimeClock {...props} /> + ``` + + Component name in the theme has changed as well: + + ```diff + -MuiClockPicker: { + +MuiTimeClock: { + ``` + +#### Changes + +- [pickers] Fix typing and prop drilling on `DateRangeCalendar` and multi input range fields (#6852) @flaviendelangle +- [pickers] Pass the `ampm` prop from the new pickers to their field (#6868) @flaviendelangle +- [pickers] Rename `CalendarPickerView`, `ClockPickerView` and `CalendarOrClockPickerView` (#6855) @flaviendelangle +- [pickers] Rename `ClockPicker` into `TimeClock` (#6851) @flaviendelangle + +### Docs + +- [docs] Add `dayjs` to the dependencies (#6862) @m4theushw +- [docs] Clarify how the Row Pinning works with other features of the DataGrid (#6853) @cherniavskii +- [docs] Fix typo in Export page (#6848) @m4theushw +- [docs] Group picker pages (#6369) @flaviendelangle +- [docs] Remove default prop and improve format (#6781) @oliviertassinari +- [docs] Sync prism-okaidia.css with source (#6820) @oliviertassinari + +### Core + +- [core] Convert scripts to ESM (#6789) @LukasTy +- [core] Feedback on branch protection @oliviertassinari +- [core] Fix `test-types` out of memory error (#6850) @LukasTy +- [core] Import from `@mui/utils` instead of `@mui/material/utils` (#6816) @cherniavskii +- [core] Show the whole version to make blame easier @oliviertassinari +- [core] Small changes on new pickers internals (#6840) @flaviendelangle +- [core] Remove prettier scripts (#6815) @Janpot +- [license] Polish error messages (#6881) @oliviertassinari +- [test] Verify `onError` call on the pickers (#6771) @alexfauquette + +## 6.0.0-alpha.7 + +_Nov 10, 2022_ + +We'd like to offer a big thanks to the 5 contributors who made this release possible. Here are some highlights ✨: + +- ⚙️ Removed everything marked as `@deprecated` +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.7` / `@mui/x-data-grid-pro@6.0.0-alpha.7` / `@mui/x-data-grid-premium@6.0.0-alpha.7` + +#### Changes + +- [DataGrid] Fix cell focus causing scroll jump when virtualization enabled (#6785) @yaredtsy +- [DataGrid] Remove items marked as `@deprecated` (#6505) @DanailH + +### `@mui/x-date-pickers@6.0.0-alpha.7` / `@mui/x-date-pickers-pro@6.0.0-alpha.7` + +#### Changes + +- [fields] Rename section names to match the picker view nomenclature (#6779) @flaviendelangle +- [pickers] Fix pickers toolbar styling (#6793) @LukasTy +- [pickers] Improve validation JSDoc descriptions (#6777) @flaviendelangle +- [pickers] New `MobileDateTimePicker`, `DesktopDateTimePicker`, `DateTimePicker` and `StaticDateTimePicker` based on `DateTimeField` (#6767) @flaviendelangle +- [pickers] New `MobileTimePicker`, `DesktopTimePicker`, `TimePicker` and `StaticTimePicker` based on `TimeField` (#6728) @flaviendelangle +- [pickers] Support the `onError` prop and add context on the `onChange` prop (#6731) @flaviendelangle + +### Docs + +- [docs] Add missing Pro header suffix (#6775) @oliviertassinari +- [docs] Upgrade to Next.js 13 (#6790) @cherniavskii + +### Core + +- [core] Add OSSF Scorecard action (#6760) @oliviertassinari +- [core] Fix Pinned-Dependencies @oliviertassinari +- [core] Fix Scorecard fail Action @oliviertassinari +- [core] Pin GitHub Action dependencies (#6739) @renovate[bot] +- [core] Remove default access to GitHub action scopes @oliviertassinari +- [test] Fix test case name: Pro-> Premium @oliviertassinari + +## 6.0.0-alpha.6 + +_Nov 4, 2022_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- 🎁 Allow non-controlled usage of the calendar components (#6643) @flaviendelangle + + ```tsx + <DateCalendar defaultValue={dayjs()} /> + <MonthCalendar defaultValue={dayjs()} /> + <YearCalendar defaultValue={dayjs()} /> + ``` + +- 🌍 Add Ukrainian (uk-UA) locale to pickers (#6661) @Dufran +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.6` / `@mui/x-data-grid-pro@6.0.0-alpha.6` / `@mui/x-data-grid-premium@6.0.0-alpha.6` + +#### Breaking changes + +- The `disableIgnoreModificationsIfProcessingProps` prop has been removed and its behavior when `true` was incorporated as the default behavior. + The old behavior can be restored by using `apiRef.current.stopRowEditMode({ ignoreModifications: true })` or `apiRef.current.stopCellEditMode({ ignoreModifications: true })`. + +#### Changes + +- [DataGrid] Add `rowSelection` prop (#6499) @m4theushw +- [DataGrid] Avoid future regression with React 19 (#6638) @oliviertassinari +- [DataGrid] Refactor `@mui/material` imports to `@mui/utils` (#6569) @LukasTy +- [DataGrid] Remove `disableIgnoreModificationsIfProcessingProps` prop (#6640) @m4theushw +- [DataGrid] Separate private and public `apiRef` properties (#6388) @cherniavskii + +### `@mui/x-date-pickers@6.0.0-alpha.6` / `@mui/x-date-pickers-pro@6.0.0-alpha.6` + +#### Changes + +- [DateRangePicker] Fix input focused style and mobile behavior (#6645) @LukasTy +- [fields] Update sections when the locale changes (#6649) @flaviendelangle +- [pickers] Add Ukrainian (uk-UA) locale (#6661) @Dufran +- [pickers] Allow non-controlled usage of the calendar components (#6643) @flaviendelangle +- [pickers] Export other adapters derived from moment or date-fns (#6571) @alexfauquette +- [pickers] New `MobileDatePicker` and `DatePicker` based on `DateField` (#6690) @flaviendelangle +- [pickers] New `StaticDatePicker` component (#6708) @flaviendelangle +- [pickers] Rename `inputFormat` prop to `format` on the new pickers (#6722) @flaviendelangle + +### Core + +- [core] Fix `typescript:ci` failures (#6705) @LukasTy +- [core] Fixes for upcoming eslint upgrade (#6667) @Janpot +- [core] Pin GitHub Action to digests (#6683) @oliviertassinari + +## 6.0.0-alpha.5 + +_Oct 31, 2022_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- ⚡ Fix memory leak during unmount of the DataGrid (#6620) @cherniavskii +- 📝 New guide for migrating pickers from v5 to v6 (#6472) @flaviendelangle +- 🎁 Allow to disable the autofocus of the search field when opening the column visibility panel (#6444) @e-cloud +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.5` / `@mui/x-data-grid-pro@6.0.0-alpha.5` / `@mui/x-data-grid-premium@6.0.0-alpha.5` + +#### Breaking changes + +- Stop exporting `gridColumnsSelector` (#6693) @m4theushw + + The `gridColumnsSelector` was deprecated during v5 and is now removed from the export list. + + Please consider using one of the following selectors as a replacement: + + - `gridColumnFieldsSelector`, to obtain the column fields in the order they appear on the screen; + - `gridColumnLookupSelector`, to access column definitions by field; + - `gridColumnVisibilityModelSelector`, for the visibility state of each column. + +#### Changes + +- [DataGrid] Allow to disable autofocusing the search field in the columns panel (#6444) @e-cloud +- [DataGrid] Fix `setRows` method not persisting new rows data after `loading` prop change (#6493) @cherniavskii +- [DataGrid] Fix memory leak on grid unmount (#6620) @cherniavskii +- [DataGrid] Rename `GridColumnsState['all']` to `GridColumnsState['orderedFields']` (#6562) @DanailH +- [DataGrid] Remove `React.memo` from `GridCellCheckboxRenderer` (#6655) @mattcorner +- [DataGrid] Stop exporting `gridColumnsSelector` (#6693) +- [l10n] Improve Bulgarian (bg-BG) locale (#6578) @AtanasVA + +### `@mui/x-date-pickers@6.0.0-alpha.5` / `@mui/x-date-pickers-pro@6.0.0-alpha.5` + +#### Breaking changes + +- [pickers] Rename remaining `private` components (#6550) @LukasTy + Previously we had 4 component names with `Private` prefix in order to avoid breaking changes in v5. + These components were renamed: + + - `PrivatePickersMonth` -> `MuiPickersMonth` + - `PrivatePickersSlideTransition` -> `MuiPickersSlideTransition` + - `PrivatePickersToolbarText` -> `MuiPickersToolbarText` + - `PrivatePickersYear` -> `MuiPickersYear` + + Manual style overriding will need to use updated classes: + + ```diff + -.PrivatePickersMonth-root { + +.MuiPickersMonth-root { + + -.PrivatePickersSlideTransition-root { + +.MuiPickersSlideTransition-root { + + -.PrivatePickersToolbarText-root { + +.MuiPickersToolbarText-root { + + -.PrivatePickersYear-root { + +.MuiPickersYear-root { + ``` + + Component name changes are also reflected in `themeAugmentation`: + + ```diff + const theme = createTheme({ + components: { + - PrivatePickersMonth: { + + MuiPickersMonth: { + // overrides + }, + - PrivatePickersSlideTransition: { + + MuiPickersSlideTransition: { + // overrides + }, + - PrivatePickersToolbarText: { + + MuiPickersToolbarText: { + // overrides + }, + - PrivatePickersYear: { + + MuiPickersYear: { + // overrides + }, + }, + }); + ``` + +#### Changes + +- [DateTimePicker] Fix toolbar time order when `theme.rtl=true` (#6636) @alexfauquette +- [pickers] Import fixes for mask editing (#6623) @alexfauquette +- [pickers] Rename remaining `private` components (#6550) @LukasTy +- [pickers] New `DesktopDatePicker` based on `DateField` (#6548) @flaviendelangle + +### Docs + +- [docs] Add feedback in next doc (#6591) @alexfauquette +- [docs] Check link validity in PR (#6497) @alexfauquette +- [docs] Disable translations (#6560) @cherniavskii +- [docs] Fix typo in DataGrid demo page (#6632) @banoth-ravinder +- [docs] New page to migrate pickers from v5 to v6 (#6472) @flaviendelangle +- [docs] Remove broken welcome page (#6585) @alexfauquette +- [docs] Mark data grid column group as available (#6660) @alexfauquette +- [docs] Fix double space @oliviertassinari + +### Core + +- [core] Fix duplicate CodeQL build @oliviertassinari +- [core] Fix spreading on validation page (#6624) @flaviendelangle +- [core] Small TypeScript improvements (#6575) @flaviendelangle +- [core] Upgrade monorepo (#6594) @oliviertassinari +- [core] Change reproduction position (#6621) @oliviertassinari +- [core] Fix permissions in `no-response` workflow (#6658) @cherniavskii +- [core] Remove legacy migration function (#6669) @oliviertassinari +- [license] Improve the license content (#6459) @oliviertassinari +- [test] Test Arrow up/down on every token (#6563) @alexfauquette + +## 6.0.0-alpha.4 + +_Oct 20, 2022_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 📝 Manage pickers' toolbar customization with slots +- 🐞 Bugfixes +- 🌍 Improve Turkish (tr-TR) locale on the data grid and pickers (#6542) @ramazansancar + +### `@mui/x-data-grid@6.0.0-alpha.4` / `@mui/x-data-grid-pro@6.0.0-alpha.4` / `@mui/x-data-grid-premium@6.0.0-alpha.4` + +#### Breaking changes + +- To avoid confusion with the props that will be added for the cell selection feature, some props related to row selection were renamed to have "row" in their name. + The renamed props are the following: + + | Old name | New name | + | :------------------------- | :---------------------------- | + | `selectionModel` | `rowSelectionModel` | + | `onSelectionModelChange` | `onRowSelectionModelChange` | + | `disableSelectionOnClick` | `disableRowSelectionOnClick` | + | `disableMultipleSelection` | `disableMultipleRowSelection` | + +- The `gridSelectionStateSelector` selector was renamed to `gridRowSelectionStateSelector`. + +- The `selectionChange` event was renamed to `rowSelectionChange`. + +#### Changes + +- [DataGrid] Add `searchPredicate` prop to `GridColumnsPanel` component (#6557) @cherniavskii +- [DataGrid] Support keyboard navigation in column group header (#5947) @alexfauquette +- [DataGrid] Fix grid not updating state on `rowCount` prop change (#5982) @cherniavskii +- [DataGrid] Rename selection props (#6556) @m4theushw +- [l10n] Improve Turkish (tr-TR) locale on the data grid and pickers (#6542) @ramazansancar + +### `@mui/x-date-pickers@6.0.0-alpha.4` / `@mui/x-date-pickers-pro@6.0.0-alpha.4` + +#### Breaking changes + +- The `ToolbarComponent` has been replaced by a `Toolbar` component slot. + You can find more information about this pattern in the [Base UI documentation](https://mui.com/base-ui/getting-started/usage/#shared-props): + + ```diff + // Same on all other pickers + <DatePicker + - ToolbarComponent: MyToolbar, + + components={{ Toolbar: MyToolbar }} + /> + ``` + +- The `toolbarPlaceholder` and `toolbarFormat` props have been moved to the `toolbar` components props slot: + + ```diff + // Same on all other pickers + <DatePicker + - toolbarPlaceholder="__" + - toolbarFormat="DD / MM / YYYY" + + componentsProps={{ + + toolbar: { + + toolbarPlaceholder: '__', + + toolbarFormat: 'DD / MM / YYYY', + + } + + }} + /> + ``` + +- The `toolbarTitle` prop has been moved to the localization object: + + ```diff + // Same on all other pickers + <DatePicker + - toolbarTitle="Title" + + localeText={{ toolbarTitle: 'Title' }} + /> + ``` + +- The toolbar related translation keys have been renamed to better fit their usage: + + ```diff + <LocalizationProvider + localeText={{ + - datePickerDefaultToolbarTitle: 'Date Picker', + + datePickerToolbarTitle: 'Date Picker', + + - timePickerDefaultToolbarTitle: 'Time Picker', + + timePickerToolbarTitle: 'Time Picker', + + - dateTimePickerDefaultToolbarTitle: 'Date Time Picker', + + dateTimePickerToolbarTitle: 'Date Time Picker', + + - dateRangePickerDefaultToolbarTitle: 'Date Range Picker', + + dateRangePickerToolbarTitle: 'Date Range Picker', + }} + /> + ``` + +- The `onChange` / `openView` props on the toolbar have been renamed `onViewChange` / `view` + +#### Changes + +- [fields] Add a `validationError` property to the `onChange` callback (#6539) @flaviendelangle +- [fields] Distinguish start and end input error on multi input fields (#6503) @flaviendelangle +- [pickers] Clean the `Tabs` component slot (#6543) @flaviendelangle +- [pickers] Fix localization of the placeholder (#6547) @alexfauquette +- [pickers] Fix TypeScript issues (#6322) @flaviendelangle +- [pickers] Improve error consistency between single and multiple range pickers (#6561) @alexfauquette +- [pickers] Refactor `@mui/material` imports to `@mui/utils` (#6443) @LukasTy +- [pickers] Replace toolbar's props by a component slot (#6445) @flaviendelangle + +### Docs + +- [docs] Enable inlined preview for disabled date picker (#6477) @oliviertassinari +- [docs] Fix 404 errors (#6541) @alexfauquette +- [docs] Fix broken links on field pages (#6501) @flaviendelangle +- [docs] Improve markdownlint (#6518) @oliviertassinari + +### Core + +- [core] Run CodeQL only on schedule @oliviertassinari +- [core] Fix trailing spaces and git diff format (#6523) @oliviertassinari +- [core] Harden GitHub Actions permissions (#6396) @step-security-bot +- [core] Improve the playground DX (#6514) @oliviertassinari +- [core] Link Netlify in the danger comment (#6513) @oliviertassinari +- [core] Organize tests for pickers slots (#6546) @flaviendelangle +- [core] Remove outdated `docsearch.js` dependency (#6242) @oliviertassinari +- [core] Upgrade monorepo (#6549) @cherniavskii +- [test] Add validation test on range pickers (#6504) @alexfauquette +- [test] Remove BrowserStack (#6263) @DanailH + +## 6.0.0-alpha.3 + +_Oct 13, 2022_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- ⌚️ New components to edit date and time with <kbd>keyboard</kbd>—without using any modal or dropdown UI. + Please check out our [documentation](https://mui.com/x/react-date-pickers/fields/) to discover those new components. + + - [`DateField`](https://mui.com/x/react-date-pickers/date-field/) to edit date + - [`TimeField`](https://mui.com/x/react-date-pickers/time-field/) to edit time + - [`DateTimeField`](https://mui.com/x/react-date-pickers/date-time-field/) to edit date and time + - [`MultiInputDateRangeField` / `SingleInputDateRangeField`](https://mui.com/x/react-date-pickers/date-range-field/) to edit date range + - [`MultiInputTimeRangeField`](https://mui.com/x/react-date-pickers/time-range-field/) to edit time range with two inputs + - [`MultiInputDateTimeRangeField`](https://mui.com/x/react-date-pickers/date-time-range-field/) to edit date and time range with two inputs + + ⚠️ These components are unstable. + They might receive breaking changes on their props to have the best components possible by the time of the stable release. + +- 📝 Allow to limit to one filter per column for `DataGridPro` and `DataGridPremium` (#6333) @MBilalShafi +- 📚 New [page describing the validation props on each picker](https://mui.com/x/react-date-pickers/validation/) (#6064) @flaviendelangle +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.3` / `@mui/x-data-grid-pro@6.0.0-alpha.3` / `@mui/x-data-grid-premium@6.0.0-alpha.3` + +#### Breaking changes + +- [DataGrid] Remove legacy editing API + + The editing API that is enabled by default was replaced with a new API that contains better support for server-side persistence, validation and customization. This new editing feature was already available in v5 under the `newEditingApi` experimental flag. In v6, this flag can be removed. + + ```diff + <DataGrid + - experimentalFeatures={{ newEditingApi: true }} + /> + ``` + + For users that didn't migrate to the new editing API in v5, additional work may be needed because the new API is not equivalent to the legacy API. Although, some migration steps are available to help in this task. + + - The `editCellPropsChange` event was removed. If you still need it please file a new issue so we can propose an alternative. + - The `cellEditCommit` event was removed and the `processRowUpdate` prop can be used in place. More information, check the [docs](https://mui.com/x/react-data-grid/editing/#persistence) section about the topic. + - The `editRowsModel` and `onEditRowsModelChange` props were removed. The [`cellModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) or [`rowModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) props can be used to achieve the same goal. + - The following API methods were removed: + - Use `apiRef.current.stopCellEditMode` to replace `apiRef.current.commitCellChange` + - Use `apiRef.current.startCellEditMode` to replace `apiRef.current.setCellMode(id, field, 'edit')` + - Use `apiRef.current.stopRowEditMode` to replace `apiRef.current.commitRowChange` + - Use `apiRef.current.startRowMode` to replace `apiRef.current.setRowMode(id, 'edit')` + - Use the [`cellModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) or [`rowModesModel`](https://mui.com/x/react-data-grid/editing/#controlled-mode) props to replace `apiRef.current.setEditRowsModel` + +#### Changes + +- [DataGrid] Fix start edit mode with printable character in React 18 (#6257) @m4theushw +- [DataGrid] Remove legacy editing API (#6016) @m4theushw +- [DataGrid] Simplify `useGridApiContext` and `useGridApiRef` type overrides (#6423) @cherniavskii +- [DataGrid] Use generics instead of verbose state overrides (#6409) @cherniavskii +- [DataGridPro] Allow to limit to one filter per column (#6333) @MBilalShafi + +### `@mui/x-date-pickers@6.0.0-alpha.3` / `@mui/x-date-pickers-pro@6.0.0-alpha.3` + +#### Breaking changes + +- All the props used by the mobile and desktop wrappers to override components or components' props have been replaced by component slots. You can find more information about this pattern in the [Base UI documentation](https://mui.com/base-ui/getting-started/usage/#shared-props). + + Some of the names have also been prefixed by `desktop` when it was unclear that the behavior was only applied on the desktop version of the pickers (or the responsive version when used on a desktop). + + The `DialogProps` prop has been replaced by a `dialog` component props slot on responsive and mobile pickers: + + ```diff + // Same on MobileDatePicker, DateTimePicker, MobileDateTimePicker, + // TimePicker, MobileTimePicker, DateRangePicker and MobileDateRangePicker. + <DatePicker + - DialogProps={{ backgroundColor: 'red' }} + + componentsProps={{ dialog: { backgroundColor: 'red' }}} + /> + ``` + + The `PaperProps` prop has been replaced by a `desktopPaper` component props slot on all responsive and desktop pickers: + + ```diff + // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, + // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. + <DatePicker + - PaperProps={{ backgroundColor: 'red' }} + + componentsProps={{ desktopPaper: { backgroundColor: 'red' }}} + /> + ``` + + The `PopperProps` prop has been replaced by a `popper` component props slot on all responsive and desktop pickers: + + ```diff + // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, + // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. + <DatePicker + - PopperProps={{ onClick: handleClick }} + + componentsProps={{ popper: { onClick: handleClick }}} + /> + ``` + + The `TransitionComponent` prop has been replaced by a `DesktopTransition` component slot on all responsive and desktop pickers: + + ```diff + // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, + // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. + <DatePicker + - TransitionComponent={Fade} + + components={{ DesktopTransition: Fade }} + /> + ``` + + The `TrapFocusProps` prop has been replaced by a `desktopTrapFocus` component props slot on all responsive and desktop pickers: + + ```diff + // Same on DesktopDatePicker, DateTimePicker, DesktopDateTimePicker, + // TimePicker, DesktopTimePicker, DateRangePicker and DesktopDateRangePicker. + <DatePicker + - TrapFocusProps={{ isEnabled: () => false }} + + componentsProps={{ desktopTrapFocus: { isEnabled: () => false }}} + /> + ``` + +- The view components allowing to pick a date or parts of a date without an input have been renamed to better fit their usage: + + ```diff + -<CalendarPicker {...props} /> + +<DateCalendar {...props} /> + ``` + + ```diff + -<DayPicker {...props} /> + +<DayCalendar {...props} /> + ``` + + ```diff + -<CalendarPickerSkeleton {...props} /> + +<DayCalendarSkeleton {...props} /> + ``` + + ```diff + -<MonthPicker {...props} /> + +<MonthCalendar {...props} /> + ``` + + ```diff + -<YearPicker {...props} /> + +<YearCalendar {...props} /> + ``` + +- Component names in the theme have changed as well: + + ```diff + -MuiCalendarPicker: { + +MuiDateCalendar: { + ``` + + ```diff + -MuiDayPicker: { + +MuiDayCalendar: { + ``` + + ```diff + -MuiCalendarPickerSkeleton: { + +MuiDayCalendarSkeleton: { + ``` + + ```diff + -MuiMonthPicker: { + +MuiMonthCalendar: { + ``` + + ```diff + -MuiYearPicker: { + +MuiYearCalendar: { + ``` + +#### Changes + +- [DatePicker] Allows to fix the number of week displayed (#6299) @alexfauquette +- [DateRangePicker] Fix calendar day outside of month layout shifting on hover (#6448) @alexfauquette +- [fields] New components: `MultiInputDateTimeRangePicker` and `MultiInputTimeRangePicker` (#6392) @alexfauquette +- [fields] Prepare the field exports for the public release (#6467) @flaviendelangle +- [fields] Support paste in single section (#6422) @alexfauquette +- [pickers] Add field placeholders to the locale (#6337) @flaviendelangle +- [pickers] Do not use `Partial` for `components` and `componentsProps` props (#6463) @flaviendelangle +- [pickers] New component: `DateRangeCalendar` (#6416) @flaviendelangle +- [pickers] Replace the `Picker` prefix in the view component by `Calendar` (eg: `MonthPicker` => `MonthCalendar`) (#6389) @flaviendelangle +- [pickers] Support pasting on fields (#6364) @flaviendelangle +- [pickers] Use slots in the mobile and desktop wrappers instead of `XXXComponent` and `XXXProps` (#6381) @flaviendelangle + +### Docs + +- [docs] Add migration to DataGrid v6 page (#6235) @m4theushw +- [docs] Create first publishable version of the field doc (#6323) @flaviendelangle +- [docs] Fix trailing spaces in the readme @oliviertassinari +- [docs] New page for the pickers: Validation (#6064) @flaviendelangle +- [docs] Organize migration pages (#6480) @flaviendelangle + +### Core + +- [core] Add CodeQL workflow (#6387) @DanailH +- [core] Add missing breaking change to the changelog (#6471) @flaviendelangle +- [core] Fix playground structure (#6466) @LukasTy +- [core] Fix tests for pasting on fields (#6465) @flaviendelangle +- [core] Remove absolute link (#6420) @flaviendelangle +- [core] Remove unused `react-text-mask` package (#6408) @LukasTy +- [core] Send explicit warning when dayjs locale is not found (#6424) @alexfauquette +- [core] Test validation on textfield and date views (#6265) @alexfauquette +- [test] Sync comment with monorepo @oliviertassinari + +## 6.0.0-alpha.2 + +_Oct 7, 2022_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Further progress on stabilizing new date field components +- 🎁 Improve support for theme augmentation in the DataGrid (#6269) @cherniavskii +- 🌍 Add Japanese (ja-JP) locale to pickers (#6365) @sho918 +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.2` / `@mui/x-data-grid-pro@6.0.0-alpha.2` / `@mui/x-data-grid-premium@6.0.0-alpha.2` + +#### Breaking changes + +- 🎁 The aggregation is no longer experimental. + + You can now use the aggregation without the `experimentalFeatures.aggregation` flag enabled. + + ```diff + <DataGridPremium + - experimentalFeatures={{ aggregation: true }} + /> + ``` + + The aggregation of the columns through the column menu is now enabled by default on `DataGridPremium`. You can set `disableAggregation={true}` to disable it. + +#### Changes + +- [DataGrid] Add filter item ID to `.MuiDataGrid-filterForm` (#6313) @m4theushw +- [DataGrid] Add missing `valueOptions` (#6401) @DanailH +- [DataGrid] Don't start edit mode when pressing Shift + Space (#6228) @m4theushw +- [DataGrid] Fix error when using column grouping with all columns hidden (#6405) @alexfauquette +- [DataGrid] Pass generics to the components in the theme augmentation (#6269) @cherniavskii +- [DataGridPremium] Remove the aggregation from the experimental features (#6372) @flaviendelangle + +### `@mui/x-date-pickers@6.0.0-alpha.2` / `@mui/x-date-pickers-pro@6.0.0-alpha.2` + +#### Breaking changes + +- The `renderDay` prop has been replaced by a `Day` component slot. + You can find more information about this pattern in the [Base UI documentation](https://mui.com/base-ui/getting-started/usage/#shared-props). + + ```diff + // Same for any other date, date time or date range picker. + <DatePicker + - renderDay={(_, dayProps) => <CustomDay {...dayProps} />} + + components={{ Day: CustomDay }} + /> + ``` + +#### Changes + +- [DateRangePicker] Fix the shape of the first selected day when the start date has an hour set (#6403) @flaviendelangle +- [l10n] Add Japanese (ja-JP) locale to pickers (#6365) @sho918 +- [DateRangePicker] Force focus to stay on inputs (#6324) @alexfauquette +- [pickers] Improve edition on field components (#6339) @flaviendelangle +- [pickers] Improve field selection behaviors (#6317) @flaviendelangle +- [pickers] Replace the `renderDay` prop with a `Day` component slot (#6293) @flaviendelangle + +### Docs + +- [docs] Apply style guide to Data Grid Aggregation page (#5781) @samuelsycamore +- [docs] Fix code examples of editing cells (#6004) @TiagoPortfolio +- [docs] Fix customized day rendering demo style (#6342) (#6399) @Ambrish-git +- [docs] Implement Style Guide on "Advanced" Data Grid doc pages (#6331) @samuelsycamore +- [docs] Use components instead of demos for `SelectorsDocs` (#6103) @flaviendelangle +- [license] Add new license status 'Out of scope' (#5260) @flaviendelangle + +### Core + +- [core] Speedup of yarn install in the CI (#6395) @oliviertassinari +- [test] Remove redundant test clean-ups (#6377) @oliviertassinari +- [test] Replace `React.render` with `React.createRoot` in e2e tests (#6393) @m4theushw + +## 6.0.0-alpha.1 + +_Sep 29, 2022_ + +We'd like to offer a big thanks to the 8 contributors who made this release possible. Here are some highlights ✨: + +- 🚀 Better support for custom overlays (#5808) @cherniavskii +- 🖨️ Improve print export (#6273) @oliviertassinari +- 🎁 Reduce confusion when initializing pickers with a date value (#6170) @flaviendelangle +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.1` / `@mui/x-data-grid-pro@6.0.0-alpha.1` / `@mui/x-data-grid-premium@6.0.0-alpha.1` + +#### Breaking changes + +- New internal rows structure for v6 (#4927) @flaviendelangle + + Some selectors related to the rows have been renamed to better describe the type of rows they are returning: + + ```diff + -const result = gridRowsIdToIdLookupSelector(apiRef); + +const result = gridRowsDataRowIdToIdLookupSelector(apiRef); + ``` + + ```diff + -const result = gridRowTreeDepthSelector(apiRef); + +const result = gridRowMaximumTreeDepthSelector(apiRef); + ``` + + The format of the tree nodes (the element accessible in `params.node` or with the `apiRef.current.getRowNode` method) have changed. + You have a new `type` property, which can be useful, for example, to apply custom behavior on groups. + Here is an example of the old and new approach showing how to apply a custom value formatter in groups for the grouping column: + + ```diff + <DataGridPremium + groupingColDef={() => ({ + valueFormatter: (params) => { + if (params.id == null) { + return params.value; + } + + const rowNode = apiRef.current.getRowNode(params.id!)!; + - if (rowNode.children?.length) { + + if (rowNode.type === 'group') { + return `by ${rowNode.groupingKey ?? ''}`; + } + + return params.value; + } + })} + /> + ``` + +- The `GridFeatureModeConstant` constant no longer exists (#6077) @DanailH + + ```diff + -import { GridFeatureModeConstant } from '@mui/x-data-grid'; + ``` + +#### Changes + +- [DataGrid] Fix `GridPagination` props typing (#6238) @cherniavskii +- [DataGrid] Fix `GridRow` not forwarding `ref` to the root element (#6274) @cherniavskii +- [DataGrid] Fix `undefined` value being showed in filter button tooltip text (#6259) @cherniavskii +- [DataGrid] Fix blank space when changing page with dynamic row height (#6049) @m4theushw +- [DataGrid] New internal rows structure for v6 (#4927) @flaviendelangle +- [DataGrid] Revert cell/row mode if `processRowUpdate` fails (#6185) @m4theushw +- [DataGrid] Rework overlays layout (#5808) @cherniavskii +- [DataGrid] Improve print support (#6273) @oliviertassinari +- [DataGridPremium] Add missing `themeAugmentation` module (#6270) @cherniavskii + +### `@mui/x-date-pickers@6.0.0-alpha.1` / `@mui/x-date-pickers-pro@6.0.0-alpha.1` + +#### Breaking changes + +- The `value` prop of the pickers now expects a parsed value. + + Until now, it was possible to provide any format that your date management library was able to parse. + For instance, you could pass `value={new Date()}` when using `AdapterDayjs`. + + This brought a lot of confusion so we decided to remove this behavior. + The format expected by the `value` prop is now the same as for any other prop holding a date. + Here is the syntax to initialize a date picker at the current date for each adapter: + + ```tsx + // Date-fns + <DatePicker value={new Date()} />; + + // Dayjs + import dayjs from 'dayjs'; + <DatePicker value={dayjs()} />; + + // Moment + import moment from 'moment'; + <DatePicker value={moment()} />; + + // Luxon + import { DateTime } from 'luxon'; + <DatePicker value={DateTime.now()} />; + ``` + +#### Changes + +- [DatePicker] Respect `minDate` and `maxDate` when opening a `DatePicker` or `DateTimePicker` (#6309) @alexfauquette +- [DateTimePicker] Fix validation with `shouldDisableMonth` and `shouldDisableYear` (#6266) @flaviendelangle +- [TimePicker] Add support for `disablePast` and `disableFuture` validation props (#6226) @LukasTy +- [CalendarPicker] Prevent getting focus when `autoFocus=false` (#6304) @alexfauquette +- [DateField] Extend moment adapter to support `expandFormat` and `formatTokenMap` (#6215) @alexfauquette +- [pickers] Allow to control the selected sections (#6209, #6307) @flaviendelangle +- [pickers] Do not loose the value of date sections not present in the format in the new field components (#6141) @flaviendelangle +- [pickers] Do not support unparsed date formats anymore (#6170) @flaviendelangle +- [pickers] Support slots on the `DateField` component (#6048) @flaviendelangle +- [pickers] Support Luxon v3 in `AdapterLuxon` (#6069) @alexfauquette +- [pickers] New components `TimeField` and `DateTimeField` (#6312) @flaviendelangle +- [pickers] Support basic mobile edition on new field components (#5958) @flaviendelangle + +### Docs + +- [docs] Fix issue in DataGrid/DataGridPro row styling demo (#6264) @MBilalShafi +- [docs] Improve pickers Getting Started examples (#6292) @flaviendelangle +- [docs] Pass model change callbacks in controlled grid editing demos (#6296) @cherniavskii +- [docs] Update the CodeSandbox to use the `next` branch (#6275) @oliviertassinari + +### Core + +- [core] Fix typing error (#6291) @flaviendelangle +- [core] Fix typo in the state updater of `useField` (#6311) @flaviendelangle +- [core] Remove `GridFeatureModeConstant` (#6077) @DanailH +- [core] Simplify testing architecture (#6043) @flaviendelangle +- [test] Skip test in Chrome non-headless and Edge (#6318) @m4theushw + +## 6.0.0-alpha.0 + +_Sep 22, 2022_ + +We'd like to offer a big thanks to the 12 contributors who made this release possible. Here are some highlights ✨: + +- 🌍 Add a `localeText` prop to all pickers to customize the translations (#6212) @flaviendelangle +- 🌍 Add Finnish (fi-FI) locale to the pickers (#6219) @PetroSilenius +- 🌍 Add Persian (fa-IR) locale to the pickers (#6181) @fakhamatia +- 📚 Documentation improvements +- 🐞 Bugfixes + +### `@mui/x-data-grid@6.0.0-alpha.0` / `@mui/x-data-grid-pro@6.0.0-alpha.0` / `@mui/x-data-grid-premium@6.0.0-alpha.0` + +#### Breaking changes + +- The deprecated `hide` column property has been removed in favor of the `columnVisibilityModel` prop and initial state. + + ```diff + <DataGrid + columns={[ + field: 'id, + - hide: true, + ]} + + initialState={{ + + columns: { + + columnVisibilityModel: { id: false }, + + }, + + }} + /> + ``` + + You can find more information about this new API on our [documentation](https://mui.com/x/react-data-grid/column-visibility/). + +- The `GridEvents` enum is now a TypeScript type. + + ```diff + -apiRef.current.subscribeEvent(GridEvents.rowClick', handleRowClick); + +apiRef.current.subscribeEvent('rowClick', handleRowClick); + ``` + +#### Changes + +- [DataGrid] Do not publish `cellFocusOut` event if the row was removed (#6251) @cherniavskii +- [DataGrid] Fix scroll anchoring with master details (#6054) @oliviertassinari +- [DataGrid] Improve Polish (pl-PL) locale on the data grid (#6245) @grzegorz-bach +- [DataGrid] Remove the `GridEvents` enum (#6003) @flaviendelangle +- [DataGrid] Remove the deprecated `hide` column property (#5999) @flaviendelangle + +### `@mui/x-date-pickers@6.0.0-alpha.0` / `@mui/x-date-pickers-pro@6.0.0-alpha.0` + +#### Breaking changes + +- All the deprecated props that allowed you to set the text displayed in the pickers have been removed. + + You can now use the `localText` prop available on all picker components: + + | Removed prop | Property in the new `localText` prop | + | :--------------------------- | :-------------------------------------------------------------------------------- | + | `endText` | `end` | + | `getClockLabelText` | `clockLabelText` | + | `getHoursClockNumberText` | `hoursClockNumberText` | + | `getMinutesClockNumberText` | `minutesClockNumberText` | + | `getSecondsClockNumberText` | `secondsClockNumberText` | + | `getViewSwitchingButtonText` | `calendarViewSwitchingButtonAriaLabel` | + | `leftArrowButtonText` | `openPreviousView` (or `previousMonth` when the button changes the visible month) | + | `rightArrowButtonText` | `openNextView` (or `nextMonth` when the button changes the visible month) | + | `startText` | `start` | + + For instance if you want to replace the `startText` / `endText` + + ```diff + <DateRangePicker + - startText="From" + - endText="To" + + localeText={{ + + start: 'From', + + end: 'To', + + }} + /> + ``` + +You can find more information about the new api, including how to set those translations on all your components at once in the [documentation](https://mui.com/x/react-date-pickers/localization/) + +- The deprecated `locale` prop of the `LocalizationProvider` component have been renamed `adapterLocale`: + + ```diff + <LocalizationProvider + dateAdapter={AdapterDayjs} + - locale="fr" + + adapterLocale="fr" + > + {children} + </LocalizationProvider> + ``` + +- The component slots `LeftArrowButton` and `RightArrowButton` have been renamed `PreviousIconButton` and `NextIconButton` to better describe there usage: + + ```diff + <DatePicker + components={{ + - LeftArrowButton: CustomButton, + + PreviousIconButton: CustomButton, + + - RightArrowButton: CustomButton, + + NextIconButton: CustomButton, + }} + componentsProps={{ + - leftArrowButton: {}, + + previousIconButton: {}, + + - rightArrowButton: {}, + + nextIconButton: {}, + }} + /> + ``` + +- The `date` prop has been renamed `value` on `MonthPicker` / `YearPicker`, `ClockPicker` and `CalendarPicker`. + + ```diff + -<MonthPicker date={dayjs()} onChange={handleMonthChange} /> + +<MonthPicker value={dayjs()} onChange={handleMonthChange} /> + + -<YearPicker date={dayjs()} onChange={handleYearChange} /> + +<YearPicker value={dayjs()} onChange={handleYearChange} /> + + -<ClockPicker date={dayjs()} onChange={handleTimeChange} /> + +<ClockPicker value={dayjs()} onChange={handleTimeChange} /> + + -<CalendarPicker date={dayjs()} onChange={handleDateChange} /> + +<CalendarPicker value={dayjs()} onChange={handleDateChange} /> + ``` + +#### Changes + +- [CalendarPicker] Don't move to closest enabled date when `props.date` contains a disabled date (#6146) @flaviendelangle +- [DateRangePicker] Switch to new month when changing the value from the outside (#6166) @flaviendelangle +- [pickers] Add a `localeText` prop to all pickers to customize the translations (#6212) @flaviendelangle +- [pickers] Add Finnish (fi-FI) locale to the pickers (#6219) (#6230) @PetroSilenius +- [pickers] Add Persian (fa-IR) locale to the pickers (#6181) @fakhamatia +- [pickers] Allow nested `LocalizationProvider` (#6011) @flaviendelangle +- [pickers] Clean slots on `PickersArrowSwitcher` component (#5890) @flaviendelangle +- [pickers] Fix invalid date error when decreasing `DateField` day (#6071) @alexfauquette +- [pickers] Fix mobile section selection (#6207) @oliviertassinari +- [pickers] Fix usage with Typescript 4.8 (#6229) @flaviendelangle +- [pickers] Improve error message when no adapter context is found (#6211) @flaviendelangle +- [pickers] Remove `valueStr` from the field state (#6142) @flaviendelangle +- [pickers] Remove remaining deprecated locale props (#6233) @flaviendelangle +- [pickers] Rename the `date` prop `value` on `MonthPicker` / `YearPicker`, `ClockPicker` and `CalendarPicker` (#6128) @flaviendelangle +- [pickers] Rename the `onClose` prop of `PickersPopper` `onDismiss` to simplify typing (#6155) @flaviendelangle +- [pickers] Support the `sx` prop on all public component with a root HTML elements (#5944) @flaviendelangle +- [pickers] Unify `PickersMonth` and `PickersYear` behaviors (#6034) @flaviendelangle +- [pickers] Use `shouldDisableMonth` and `shouldDisableYear` for date validation (#6066) @flaviendelangle +- [YearPicker] Scroll to the current year even with `autoFocus=false` (#6224) @alexfauquette + +### Docs + +- [docs] Add automatic vale check (#5429) @alexfauquette +- [docs] Add Pro logo in "column ordering" link (#6127) @alexfauquette +- [docs] Fix 301 link (#6239) @oliviertassinari +- [docs] Fix broken link (#6163) @alexfauquette +- [docs] Fix broken links (#6101) @alexfauquette +- [docs] Fix demonstration date to avoid hydration errors (#6032) @alexfauquette +- [docs] Fix hidden popper in restore state example (#6191) @heyfirst +- [docs] Fix invalid links causing 404 & 301 errors (#6105) @oliviertassinari +- [docs] Fix npm repository url in the pickers `package.json` (#6172) @oliviertassinari +- [docs] Fix typo in linked issue (#6162) @flaviendelangle +- [docs] Import `generateUtilityClass` from `@mui/utils` (#6216) @michaldudak +- [docs] Improve Upgrade plan docs (#6018) @oliviertassinari +- [docs] Link the OpenSSF Best Practices card (#6171) @oliviertassinari + +### Core + +- [core] Add `v5.17.3` changelog to next branch (#6250) @flaviendelangle +- [core] Add link to the security page on the `README` (#6073) @oliviertassinari +- [core] Fix scroll restoration in the docs (#5938) @oliviertassinari +- [core] Remove the Storybook (#6099) @flaviendelangle +- [core] Tag release as `next` in npm (#6256) @m4theushw +- [core] Update monorepo (#6180) @flaviendelangle +- [core] Use the `next` branch for Prettier (#6097) @flaviendelangle +- [core] Use the official repository for `@mui/monorepo` instead of a fork (#6189) @oliviertassinari +- [test] Fix logic to skip column pinning tests (#6133) @m4theushw +- [test] Hide the date on the print regression test (#6120) @flaviendelangle +- [test] Skip tests for column pinning and dynamic row height (#5997) @m4theushw +- [website] Improve security header @oliviertassinari diff --git a/docs/README.md b/docs/README.md index ff8a508a012f..39624d913e8c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,8 +10,12 @@ pnpm i && pnpm docs:dev If you do not have pnpm installed, follow the instructions on the [pnpm website](https://pnpm.io/installation). +<!-- vale MUI.CorrectReferenceAllCases = NO --> + _DO NOT USE NPM, use pnpm to install the dependencies._ +<!-- vale MUI.CorrectReferenceAllCases = YES --> + ## How can I add a new demo to the documentation? [You can follow this guide](https://github.com/mui/material-ui/blob/HEAD/CONTRIBUTING.md) diff --git a/docs/data/charts-component-api-pages.ts b/docs/data/charts-component-api-pages.ts index aff842dcf219..3a0d808b2d06 100644 --- a/docs/data/charts-component-api-pages.ts +++ b/docs/data/charts-component-api-pages.ts @@ -25,6 +25,10 @@ const apiPages: MuiPage[] = [ pathname: '/x/api/charts/bar-element', title: 'BarElement', }, + { + pathname: '/x/api/charts/bar-label', + title: 'BarLabel', + }, { pathname: '/x/api/charts/bar-plot', title: 'BarPlot', diff --git a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx b/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx index 06b172320360..e2571d8f5105 100644 --- a/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx +++ b/docs/data/charts/bar-demo/PositiveAndNegativeBarChart.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; import { BarChart } from '@mui/x-charts/BarChart'; -import { AxisConfig } from '@mui/x-charts/models'; const uData = [4000, 3000, 2000, 2780, 1890, 2390, 3490]; const pData = [2400, 1398, -9800, 3908, 4800, -3800, 4300]; @@ -34,7 +33,7 @@ export default function PositiveAndNegativeBarChart() { { data: xLabels, scaleType: 'band', - } as Omit<AxisConfig, 'id'>, + }, ]} yAxis={[{ max: 10000 }]} /> diff --git a/docs/data/charts/bars/BarLabel.js b/docs/data/charts/bars/BarLabel.js new file mode 100644 index 000000000000..c684e33fa3e4 --- /dev/null +++ b/docs/data/charts/bars/BarLabel.js @@ -0,0 +1,14 @@ +import * as React from 'react'; +import { BarChart } from '@mui/x-charts/BarChart'; + +export default function BarLabel() { + return ( + <BarChart + xAxis={[{ scaleType: 'band', data: ['group A', 'group B', 'group C'] }]} + series={[{ data: [4, 3, 5] }, { data: [1, 6, 3] }, { data: [2, 5, 6] }]} + width={500} + height={300} + barLabel="value" + /> + ); +} diff --git a/docs/data/charts/bars/BarLabel.tsx b/docs/data/charts/bars/BarLabel.tsx new file mode 100644 index 000000000000..c684e33fa3e4 --- /dev/null +++ b/docs/data/charts/bars/BarLabel.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import { BarChart } from '@mui/x-charts/BarChart'; + +export default function BarLabel() { + return ( + <BarChart + xAxis={[{ scaleType: 'band', data: ['group A', 'group B', 'group C'] }]} + series={[{ data: [4, 3, 5] }, { data: [1, 6, 3] }, { data: [2, 5, 6] }]} + width={500} + height={300} + barLabel="value" + /> + ); +} diff --git a/docs/data/charts/bars/BarLabel.tsx.preview b/docs/data/charts/bars/BarLabel.tsx.preview new file mode 100644 index 000000000000..12bc56aa174e --- /dev/null +++ b/docs/data/charts/bars/BarLabel.tsx.preview @@ -0,0 +1,7 @@ +<BarChart + xAxis={[{ scaleType: 'band', data: ['group A', 'group B', 'group C'] }]} + series={[{ data: [4, 3, 5] }, { data: [1, 6, 3] }, { data: [2, 5, 6] }]} + width={500} + height={300} + barLabel="value" +/> \ No newline at end of file diff --git a/docs/data/charts/bars/CustomLabels.js b/docs/data/charts/bars/CustomLabels.js new file mode 100644 index 000000000000..8e22ead90487 --- /dev/null +++ b/docs/data/charts/bars/CustomLabels.js @@ -0,0 +1,22 @@ +import * as React from 'react'; +import { BarChart } from '@mui/x-charts/BarChart'; + +export default function CustomLabels() { + return ( + <BarChart + series={[ + { data: [4, 2, 5, 4, 1], stack: 'A', label: 'Series A1' }, + { data: [2, 8, 1, 3, 1], stack: 'A', label: 'Series A2' }, + { data: [14, 6, 5, 8, 9], label: 'Series B1' }, + ]} + barLabel={(item, context) => { + if ((item.value ?? 0) > 10) { + return 'High'; + } + return context.bar.height < 60 ? null : item.value?.toString(); + }} + width={600} + height={350} + /> + ); +} diff --git a/docs/data/charts/bars/CustomLabels.tsx b/docs/data/charts/bars/CustomLabels.tsx new file mode 100644 index 000000000000..8e22ead90487 --- /dev/null +++ b/docs/data/charts/bars/CustomLabels.tsx @@ -0,0 +1,22 @@ +import * as React from 'react'; +import { BarChart } from '@mui/x-charts/BarChart'; + +export default function CustomLabels() { + return ( + <BarChart + series={[ + { data: [4, 2, 5, 4, 1], stack: 'A', label: 'Series A1' }, + { data: [2, 8, 1, 3, 1], stack: 'A', label: 'Series A2' }, + { data: [14, 6, 5, 8, 9], label: 'Series B1' }, + ]} + barLabel={(item, context) => { + if ((item.value ?? 0) > 10) { + return 'High'; + } + return context.bar.height < 60 ? null : item.value?.toString(); + }} + width={600} + height={350} + /> + ); +} diff --git a/docs/data/charts/bars/CustomLabels.tsx.preview b/docs/data/charts/bars/CustomLabels.tsx.preview new file mode 100644 index 000000000000..44fe9443bee5 --- /dev/null +++ b/docs/data/charts/bars/CustomLabels.tsx.preview @@ -0,0 +1,15 @@ +<BarChart + series={[ + { data: [4, 2, 5, 4, 1], stack: 'A', label: 'Series A1' }, + { data: [2, 8, 1, 3, 1], stack: 'A', label: 'Series A2' }, + { data: [14, 6, 5, 8, 9], label: 'Series B1' }, + ]} + barLabel={(item, context) => { + if ((item.value ?? 0) > 10) { + return 'High'; + } + return context.bar.height < 60 ? null : item.value?.toString(); + }} + width={600} + height={350} +/> \ No newline at end of file diff --git a/docs/data/charts/bars/bars.md b/docs/data/charts/bars/bars.md index 9ac226e43ddd..04483c3724f7 100644 --- a/docs/data/charts/bars/bars.md +++ b/docs/data/charts/bars/bars.md @@ -1,7 +1,7 @@ --- title: React Bar chart productId: x-charts -components: BarChart, BarElement, BarPlot, ChartsGrid, ChartsOnAxisClickHandler +components: BarChart, BarElement, BarPlot, ChartsGrid, ChartsOnAxisClickHandler, BarLabel --- # Charts - Bars @@ -108,6 +108,25 @@ It will work with any positive value and will be properly applied to horizontal {{"demo": "BorderRadius.js"}} +## Labels + +You can display labels on the bars. +To do so, the `BarChart` or `BarPlot` accepts a `barLabel` property. +It can either get a function that gets the bar item and some context. +Or you can pass `'value'` to display the raw value of the bar. + +{{"demo": "BarLabel.js"}} + +### Custom Labels + +You can display, change or hide labels based on conditional logic. +To do so, provide a function to the `barLabel`. +Labels are not displayed if the function returns `null`. + +In the example we display a `'High'` text on values higher than 10, and hide values when the generated bar height is lower than 60px. + +{{"demo": "CustomLabels.js"}} + ## Click event Bar charts provides two click handlers: diff --git a/docs/data/charts/line-demo/LineWithPrediction.js b/docs/data/charts/line-demo/LineWithPrediction.js new file mode 100644 index 000000000000..277ce031aeb0 --- /dev/null +++ b/docs/data/charts/line-demo/LineWithPrediction.js @@ -0,0 +1,70 @@ +import * as React from 'react'; +import { LineChart, AnimatedLine } from '@mui/x-charts/LineChart'; +import { useChartId, useDrawingArea, useXScale } from '@mui/x-charts/hooks'; + +function CustomAnimatedLine(props) { + const { limit, sxBefore, sxAfter, ...other } = props; + const { top, bottom, height, left, width } = useDrawingArea(); + const scale = useXScale(); + const chartId = useChartId(); + + if (limit === undefined) { + return <AnimatedLine {...other} />; + } + + const limitPosition = scale(limit); // Convert value to x coordinate. + + if (limitPosition === undefined) { + return <AnimatedLine {...other} />; + } + + const clipIdleft = `${chartId}-${props.ownerState.id}-line-limit-${limit}-1`; + const clipIdRight = `${chartId}-${props.ownerState.id}-line-limit-${limit}-2`; + return ( + <React.Fragment> + {/* Clip to show the line before the limit */} + <clipPath id={clipIdleft}> + <rect + x={left} + y={0} + width={limitPosition - left} + height={top + height + bottom} + /> + </clipPath> + {/* Clip to show the line after the limit */} + <clipPath id={clipIdRight}> + <rect + x={limitPosition} + y={0} + width={left + width - limitPosition} + height={top + height + bottom} + /> + </clipPath> + <g clipPath={`url(#${clipIdleft})`}> + <AnimatedLine {...other} sx={sxBefore} /> + </g> + <g clipPath={`url(#${clipIdRight})`}> + <AnimatedLine {...other} sx={sxAfter} /> + </g> + </React.Fragment> + ); +} + +export default function LineWithPrediction() { + return ( + <LineChart + series={[ + { + type: 'line', + data: [1, 2, 3, 4, 1, 2, 3, 4, 5], + valueFormatter: (v, i) => `${v}${i.dataIndex > 5 ? ' (estimated)' : ''}`, + }, + ]} + xAxis={[{ data: [0, 1, 2, 3, 4, 5, 6, 7, 8] }]} + height={200} + width={400} + slots={{ line: CustomAnimatedLine }} + slotProps={{ line: { limit: 5, sxAfter: { strokeDasharray: '10 5' } } }} + /> + ); +} diff --git a/docs/data/charts/line-demo/LineWithPrediction.tsx b/docs/data/charts/line-demo/LineWithPrediction.tsx new file mode 100644 index 000000000000..55fd42deb244 --- /dev/null +++ b/docs/data/charts/line-demo/LineWithPrediction.tsx @@ -0,0 +1,77 @@ +import * as React from 'react'; +import { LineChart, AnimatedLine, AnimatedLineProps } from '@mui/x-charts/LineChart'; +import { useChartId, useDrawingArea, useXScale } from '@mui/x-charts/hooks'; +import { SxProps, Theme } from '@mui/system'; + +interface CustomAnimatedLineProps extends AnimatedLineProps { + limit?: number; + sxBefore?: SxProps<Theme>; + sxAfter?: SxProps<Theme>; +} + +function CustomAnimatedLine(props: CustomAnimatedLineProps) { + const { limit, sxBefore, sxAfter, ...other } = props; + const { top, bottom, height, left, width } = useDrawingArea(); + const scale = useXScale(); + const chartId = useChartId(); + + if (limit === undefined) { + return <AnimatedLine {...other} />; + } + + const limitPosition = scale(limit); // Convert value to x coordinate. + + if (limitPosition === undefined) { + return <AnimatedLine {...other} />; + } + + const clipIdleft = `${chartId}-${props.ownerState.id}-line-limit-${limit}-1`; + const clipIdRight = `${chartId}-${props.ownerState.id}-line-limit-${limit}-2`; + return ( + <React.Fragment> + {/* Clip to show the line before the limit */} + <clipPath id={clipIdleft}> + <rect + x={left} + y={0} + width={limitPosition - left} + height={top + height + bottom} + /> + </clipPath> + {/* Clip to show the line after the limit */} + <clipPath id={clipIdRight}> + <rect + x={limitPosition} + y={0} + width={left + width - limitPosition} + height={top + height + bottom} + /> + </clipPath> + <g clipPath={`url(#${clipIdleft})`}> + <AnimatedLine {...other} sx={sxBefore} /> + </g> + <g clipPath={`url(#${clipIdRight})`}> + <AnimatedLine {...other} sx={sxAfter} /> + </g> + </React.Fragment> + ); +} + +export default function LineWithPrediction() { + return ( + <LineChart + series={[ + { + type: 'line', + data: [1, 2, 3, 4, 1, 2, 3, 4, 5], + valueFormatter: (v, i) => `${v}${i.dataIndex > 5 ? ' (estimated)' : ''}`, + }, + ]} + xAxis={[{ data: [0, 1, 2, 3, 4, 5, 6, 7, 8] }]} + height={200} + width={400} + slots={{ line: CustomAnimatedLine }} + slotProps={{ line: { limit: 5, sxAfter: { strokeDasharray: '10 5' } } as any }} + /> + ); +} diff --git a/docs/data/charts/line-demo/LineWithPrediction.tsx.preview b/docs/data/charts/line-demo/LineWithPrediction.tsx.preview new file mode 100644 index 000000000000..1dc0a8f94a59 --- /dev/null +++ b/docs/data/charts/line-demo/LineWithPrediction.tsx.preview @@ -0,0 +1,14 @@ +<LineChart + series={[ + { + type: 'line', + data: [1, 2, 3, 4, 1, 2, 3, 4, 5], + valueFormatter: (v, i) => `${v}${i.dataIndex > 5 ? ' (estimated)' : ''}`, + }, + ]} + xAxis={[{ data: [0, 1, 2, 3, 4, 5, 6, 7, 8] }]} + height={200} + width={400} + slots={{ line: CustomAnimatedLine }} + slotProps={{ line: { limit: 5, sxAfter: { strokeDasharray: '10 5' } } as any }} +/> \ No newline at end of file diff --git a/docs/data/charts/line-demo/line-demo.md b/docs/data/charts/line-demo/line-demo.md index d79eae58f84a..e74ae9c5cade 100644 --- a/docs/data/charts/line-demo/line-demo.md +++ b/docs/data/charts/line-demo/line-demo.md @@ -31,3 +31,15 @@ components: LineChart, LineElement, LineHighlightElement, LineHighlightPlot, Lin ## LineChartConnectNulls {{"demo": "LineChartConnectNulls.js"}} + +## Line with forecast + +To show that parts of the data have different meanings, you can render stylised lines for each of them. + +In the following example, the chart shows a dotted line to exemplify that the data is estimated. +To do so, the `slots.line` is set with a custom components that render the default line twice. + +- The first one is clipped to show known values (from the left of the chart to the limit). +- The second one is clipped to show predictions (from the limit to the right of the chart) with dash styling. + +{{"demo": "LineWithPrediction.js"}} diff --git a/docs/data/charts/tooltip/ControlledHighlight.js b/docs/data/charts/tooltip/ControlledHighlight.js new file mode 100644 index 000000000000..6106b70cd9d8 --- /dev/null +++ b/docs/data/charts/tooltip/ControlledHighlight.js @@ -0,0 +1,131 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import Box from '@mui/material/Box'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import ToggleButton from '@mui/material/ToggleButton'; + +import { BarChart } from '@mui/x-charts/BarChart'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormLabel from '@mui/material/FormLabel'; +import Radio from '@mui/material/Radio'; +import RadioGroup from '@mui/material/RadioGroup'; + +export default function ControlledHighlight() { + const [highlightedItem, setHighLightedItem] = React.useState({ + seriesId: 'A', + dataIndex: 0, + }); + const [highlighted, setHighlighted] = React.useState('item'); + const [faded, setFaded] = React.useState('global'); + + const handleHighLightedSeries = (event, newHighLightedSeries) => { + if (newHighLightedSeries !== null) { + setHighLightedItem((prev) => ({ + ...prev, + seriesId: newHighLightedSeries, + })); + } + }; + + const handleHighLightedItem = (event) => { + setHighLightedItem((prev) => ({ + ...prev, + dataIndex: Number(event.target.value), + })); + }; + + return ( + <Stack + direction={{ xs: 'column', xl: 'row' }} + spacing={1} + sx={{ width: '100%' }} + > + <Box sx={{ flexGrow: 1 }}> + <Stack spacing={2} alignItems={'center'}> + <ToggleButtonGroup + value={highlightedItem?.seriesId ?? null} + exclusive + onChange={handleHighLightedSeries} + aria-label="highlighted series" + fullWidth + > + {['A', 'B'].map((type) => ( + <ToggleButton key={type} value={type} aria-label="left aligned"> + Series {type} + </ToggleButton> + ))} + </ToggleButtonGroup> + <FormControl> + <FormLabel id="item-id-radio-group">Item ID</FormLabel> + <RadioGroup + aria-labelledby="item-id-radio-group" + name="radio-buttons-group" + value={highlightedItem?.dataIndex ?? null} + onChange={handleHighLightedItem} + row + > + <FormControlLabel value="0" control={<Radio />} label="0" /> + <FormControlLabel value="1" control={<Radio />} label="1" /> + <FormControlLabel value="2" control={<Radio />} label="2" /> + <FormControlLabel value="3" control={<Radio />} label="3" /> + <FormControlLabel value="4" control={<Radio />} label="4" /> + </RadioGroup> + </FormControl> + </Stack> + <BarChart + {...barChartsProps} + series={barChartsProps.series.map((series) => ({ + ...series, + highlightScope: { + highlighted, + faded, + }, + }))} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} + /> + </Box> + <Stack + direction={{ xs: 'row', xl: 'column' }} + spacing={3} + justifyContent="center" + flexWrap="wrap" + useFlexGap + > + <TextField + select + label="highlighted" + value={highlighted} + onChange={(event) => setHighlighted(event.target.value)} + sx={{ minWidth: 150 }} + > + <MenuItem value={'none'}>none</MenuItem> + <MenuItem value={'item'}>item</MenuItem> + <MenuItem value={'series'}>series</MenuItem> + </TextField> + <TextField + select + label="faded" + value={faded} + onChange={(event) => setFaded(event.target.value)} + sx={{ minWidth: 150 }} + > + <MenuItem value={'none'}>none</MenuItem> + <MenuItem value={'series'}>series</MenuItem> + <MenuItem value={'global'}>global</MenuItem> + </TextField> + </Stack> + </Stack> + ); +} + +const barChartsProps = { + series: [ + { data: [3, 4, 1, 6, 5], label: 'A', id: 'A' }, + { data: [4, 3, 1, 5, 8], label: 'B', id: 'B' }, + ], + height: 400, +}; diff --git a/docs/data/charts/tooltip/ControlledHighlight.tsx b/docs/data/charts/tooltip/ControlledHighlight.tsx new file mode 100644 index 000000000000..4de4eb1b81ae --- /dev/null +++ b/docs/data/charts/tooltip/ControlledHighlight.tsx @@ -0,0 +1,132 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import Box from '@mui/material/Box'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import ToggleButton from '@mui/material/ToggleButton'; +import { HighlightItemData, HighlightScope } from '@mui/x-charts/context'; +import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormLabel from '@mui/material/FormLabel'; +import Radio from '@mui/material/Radio'; +import RadioGroup from '@mui/material/RadioGroup'; + +export default function ControlledHighlight() { + const [highlightedItem, setHighLightedItem] = + React.useState<HighlightItemData | null>({ + seriesId: 'A', + dataIndex: 0, + }); + const [highlighted, setHighlighted] = React.useState('item'); + const [faded, setFaded] = React.useState('global'); + + const handleHighLightedSeries = (event: any, newHighLightedSeries: string) => { + if (newHighLightedSeries !== null) { + setHighLightedItem((prev) => ({ + ...prev, + seriesId: newHighLightedSeries, + })); + } + }; + + const handleHighLightedItem = (event: any) => { + setHighLightedItem((prev) => ({ + ...prev, + dataIndex: Number(event.target.value), + })); + }; + + return ( + <Stack + direction={{ xs: 'column', xl: 'row' }} + spacing={1} + sx={{ width: '100%' }} + > + <Box sx={{ flexGrow: 1 }}> + <Stack spacing={2} alignItems={'center'}> + <ToggleButtonGroup + value={highlightedItem?.seriesId ?? null} + exclusive + onChange={handleHighLightedSeries} + aria-label="highlighted series" + fullWidth + > + {['A', 'B'].map((type) => ( + <ToggleButton key={type} value={type} aria-label="left aligned"> + Series {type} + </ToggleButton> + ))} + </ToggleButtonGroup> + <FormControl> + <FormLabel id="item-id-radio-group">Item ID</FormLabel> + <RadioGroup + aria-labelledby="item-id-radio-group" + name="radio-buttons-group" + value={highlightedItem?.dataIndex ?? null} + onChange={handleHighLightedItem} + row + > + <FormControlLabel value="0" control={<Radio />} label="0" /> + <FormControlLabel value="1" control={<Radio />} label="1" /> + <FormControlLabel value="2" control={<Radio />} label="2" /> + <FormControlLabel value="3" control={<Radio />} label="3" /> + <FormControlLabel value="4" control={<Radio />} label="4" /> + </RadioGroup> + </FormControl> + </Stack> + <BarChart + {...barChartsProps} + series={barChartsProps.series.map((series) => ({ + ...series, + highlightScope: { + highlighted, + faded, + } as HighlightScope, + }))} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} + /> + </Box> + <Stack + direction={{ xs: 'row', xl: 'column' }} + spacing={3} + justifyContent="center" + flexWrap="wrap" + useFlexGap + > + <TextField + select + label="highlighted" + value={highlighted} + onChange={(event) => setHighlighted(event.target.value)} + sx={{ minWidth: 150 }} + > + <MenuItem value={'none'}>none</MenuItem> + <MenuItem value={'item'}>item</MenuItem> + <MenuItem value={'series'}>series</MenuItem> + </TextField> + <TextField + select + label="faded" + value={faded} + onChange={(event) => setFaded(event.target.value)} + sx={{ minWidth: 150 }} + > + <MenuItem value={'none'}>none</MenuItem> + <MenuItem value={'series'}>series</MenuItem> + <MenuItem value={'global'}>global</MenuItem> + </TextField> + </Stack> + </Stack> + ); +} + +const barChartsProps: BarChartProps = { + series: [ + { data: [3, 4, 1, 6, 5], label: 'A', id: 'A' }, + { data: [4, 3, 1, 5, 8], label: 'B', id: 'B' }, + ], + height: 400, +}; diff --git a/docs/data/charts/tooltip/SyncHighlight.js b/docs/data/charts/tooltip/SyncHighlight.js new file mode 100644 index 000000000000..5e80c02859ba --- /dev/null +++ b/docs/data/charts/tooltip/SyncHighlight.js @@ -0,0 +1,67 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; + +import { BarChart } from '@mui/x-charts/BarChart'; +import { PieChart } from '@mui/x-charts/PieChart'; + +export default function SyncHighlight() { + const [highlightedItem, setHighLightedItem] = React.useState(null); + + return ( + <Stack + direction={{ xs: 'column', xl: 'row' }} + spacing={1} + sx={{ width: '100%' }} + > + <BarChart + {...barChartsProps} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} + /> + <PieChart + {...pieChartProps} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} + /> + </Stack> + ); +} + +const barChartsProps = { + series: [ + { + data: [3, 4, 1, 6, 5], + id: 'sync', + highlightScope: { highlighted: 'item', faded: 'global' }, + }, + ], + xAxis: [{ scaleType: 'band', data: ['A', 'B', 'C', 'D', 'E'] }], + height: 400, + slotProps: { + legend: { + hidden: true, + }, + }, +}; + +const pieChartProps = { + series: [ + { + id: 'sync', + data: [ + { value: 3, label: 'A', id: 'A' }, + { value: 4, label: 'B', id: 'B' }, + { value: 1, label: 'C', id: 'C' }, + { value: 6, label: 'D', id: 'D' }, + { value: 5, label: 'E', id: 'E' }, + ], + highlightScope: { highlighted: 'item', faded: 'global' }, + }, + ], + height: 400, + slotProps: { + legend: { + hidden: true, + }, + }, +}; diff --git a/docs/data/charts/tooltip/SyncHighlight.tsx b/docs/data/charts/tooltip/SyncHighlight.tsx new file mode 100644 index 000000000000..9575512dcd47 --- /dev/null +++ b/docs/data/charts/tooltip/SyncHighlight.tsx @@ -0,0 +1,68 @@ +import * as React from 'react'; +import Stack from '@mui/material/Stack'; +import { HighlightItemData } from '@mui/x-charts/context'; +import { BarChart, BarChartProps } from '@mui/x-charts/BarChart'; +import { PieChart, PieChartProps } from '@mui/x-charts/PieChart'; + +export default function SyncHighlight() { + const [highlightedItem, setHighLightedItem] = + React.useState<HighlightItemData | null>(null); + + return ( + <Stack + direction={{ xs: 'column', xl: 'row' }} + spacing={1} + sx={{ width: '100%' }} + > + <BarChart + {...barChartsProps} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} + /> + <PieChart + {...pieChartProps} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} + /> + </Stack> + ); +} + +const barChartsProps: BarChartProps = { + series: [ + { + data: [3, 4, 1, 6, 5], + id: 'sync', + highlightScope: { highlighted: 'item', faded: 'global' }, + }, + ], + xAxis: [{ scaleType: 'band', data: ['A', 'B', 'C', 'D', 'E'] }], + height: 400, + slotProps: { + legend: { + hidden: true, + }, + }, +}; + +const pieChartProps: PieChartProps = { + series: [ + { + id: 'sync', + data: [ + { value: 3, label: 'A', id: 'A' }, + { value: 4, label: 'B', id: 'B' }, + { value: 1, label: 'C', id: 'C' }, + { value: 6, label: 'D', id: 'D' }, + { value: 5, label: 'E', id: 'E' }, + ], + highlightScope: { highlighted: 'item', faded: 'global' }, + }, + ], + height: 400, + slotProps: { + legend: { + hidden: true, + }, + }, +}; diff --git a/docs/data/charts/tooltip/SyncHighlight.tsx.preview b/docs/data/charts/tooltip/SyncHighlight.tsx.preview new file mode 100644 index 000000000000..636b509cd93f --- /dev/null +++ b/docs/data/charts/tooltip/SyncHighlight.tsx.preview @@ -0,0 +1,10 @@ +<BarChart + {...barChartsProps} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} +/> +<PieChart + {...pieChartProps} + highlightedItem={highlightedItem} + onHighlightChange={setHighLightedItem} +/> \ No newline at end of file diff --git a/docs/data/charts/tooltip/tooltip.md b/docs/data/charts/tooltip/tooltip.md index b61cef8290f8..fb73719e2df5 100644 --- a/docs/data/charts/tooltip/tooltip.md +++ b/docs/data/charts/tooltip/tooltip.md @@ -40,7 +40,7 @@ axisHighlight={{ ### Highlighting series -In parallel with the tooltip, you can highlight/fade elements. +In parallel with the tooltip, you can highlight and fade elements. This kind of interaction is controlled by series properties `highlightScope` which contains two options: @@ -55,6 +55,21 @@ This kind of interaction is controlled by series properties `highlightScope` whi {{"demo": "ElementHighlights.js"}} +### Controlled Highlight + +The highlight can be controlled by the user when they set `highlightedItem` and `onHighlightChange`. + +You can set the `highlightedItem` value based on inputs, and sync it when the user hover over an item themselves. + +{{"demo": "ControlledHighlight.js"}} + +#### Synchronizing Highlights + +Having a controlled highlight allows you to control it in multiple charts at the same time. +You just need to ensure that the `series` have the same `ids` and the data is in the same order. + +{{"demo": "SyncHighlight.js"}} + ## Customization ### Formatting @@ -90,6 +105,26 @@ In this demo, you can see: {{"demo": "AxisFormatter.js"}} +### Label formatting + +The label text inside the tooltip can also be formatted conditionally by providing a function to the series `label` property. + +```jsx +<LineChart + // ... + series={[ + { + data: [ ... ], + label: (location) => location === 'tooltip' ? 'BR' : 'Brazil' + } + ]} +/> +``` + +:::info +See [Label—Conditional formatting](/x/react-charts/label/#conditional-formatting) for more details. +::: + ### Hiding values You can hide the axis value with `hideTooltip` in the `xAxis` props. diff --git a/docs/data/data-grid/accessibility/accessibility.md b/docs/data/data-grid/accessibility/accessibility.md index afb47c68a23a..b52b8c3bcbd5 100644 --- a/docs/data/data-grid/accessibility/accessibility.md +++ b/docs/data/data-grid/accessibility/accessibility.md @@ -4,7 +4,7 @@ ## Guidelines -The most commonly encountered conformance guidelines for accessibility are: +Common conformance guidelines for accessibility include: - Globally accepted standard: [WCAG](https://www.w3.org/WAI/standards-guidelines/wcag/) - US: @@ -13,8 +13,7 @@ The most commonly encountered conformance guidelines for accessibility are: - Europe: [EAA](https://ec.europa.eu/social/main.jsp?catId=1202) (European Accessibility Act) WCAG 2.1 has three levels of conformance: A, AA, and AAA. -Level AA meets the most commonly encountered conformance guidelines. -This is the most common target for organizations so what we aims to support very well. +Level AA exceeds the basic criteria for accessibility and is a common target for most organizations, so this is what we aim to support. The [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/patterns/grid/) provide valuable information on how to optimize the accessibility of a data grid. @@ -106,17 +105,27 @@ renderCell: (params) => ( ### Navigation -The following key assignments apply to Windows and Linux users. +:::info +The key assignments in the table below apply to Windows and Linux users. -On macOS: +On macOS replace: -- replace <kbd class="key">Ctrl</kbd> with <kbd class="key">⌘ Command</kbd> -- replace <kbd class="key">Alt</kbd> with <kbd class="key">⌥ Option</kbd> +- <kbd class="key">Ctrl</kbd> with <kbd class="key">⌘ Command</kbd> +- <kbd class="key">Alt</kbd> with <kbd class="key">⌥ Option</kbd> + +Some devices may lack certain keys, requiring the use of key combinations. In this case, replace: + +- <kbd class="key">Page Up</kbd> with <kbd class="key">Fn</kbd>+<kbd class="key">Arrow Up</kbd> +- <kbd class="key">Page Down</kbd> with <kbd class="key">Fn</kbd>+<kbd class="key">Arrow Down</kbd> +- <kbd class="key">Home</kbd> with <kbd class="key">Fn</kbd>+<kbd class="key">Arrow Left</kbd> +- <kbd class="key">End</kbd> with <kbd class="key">Fn</kbd>+<kbd class="key">Arrow Right</kbd> + +::: | Keys | Description | | -----------------------------------------------------------------: | :---------------------------------------------------------- | | <kbd class="key">Arrow Left</kbd> | Navigate between cell elements | -| <kbd class="key">Arrow Bottom</kbd> | Navigate between cell elements | +| <kbd class="key">Arrow Down</kbd> | Navigate between cell elements | | <kbd class="key">Arrow Right</kbd> | Navigate between cell elements | | <kbd class="key">Arrow Up</kbd> | Navigate between cell elements | | <kbd class="key">Home</kbd> | Navigate to the first cell of the current row | diff --git a/docs/data/data-grid/clipboard/ClipboardPastePersistence.js b/docs/data/data-grid/clipboard/ClipboardPastePersistence.js index 23e7fe9c5cf1..24d44b7291df 100644 --- a/docs/data/data-grid/clipboard/ClipboardPastePersistence.js +++ b/docs/data/data-grid/clipboard/ClipboardPastePersistence.js @@ -186,19 +186,21 @@ const initialRows = [ }, ]; +const visibleFields = [ + 'commodity', + 'traderName', + 'traderEmail', + 'quantity', + 'filledQuantity', +]; + const useSessionStorageData = () => { const { data } = useDemoData({ dataSet: 'Commodity', rowLength: 0, maxColumns: 7, editable: true, - visibleFields: [ - 'commodity', - 'traderName', - 'traderEmail', - 'quantity', - 'filledQuantity', - ], + visibleFields, }); const [rows] = React.useState(() => { diff --git a/docs/data/data-grid/clipboard/ClipboardPastePersistence.tsx b/docs/data/data-grid/clipboard/ClipboardPastePersistence.tsx index 5041a80fdee3..2fdddb4e822f 100644 --- a/docs/data/data-grid/clipboard/ClipboardPastePersistence.tsx +++ b/docs/data/data-grid/clipboard/ClipboardPastePersistence.tsx @@ -190,19 +190,21 @@ const initialRows = [ }, ]; +const visibleFields = [ + 'commodity', + 'traderName', + 'traderEmail', + 'quantity', + 'filledQuantity', +]; + const useSessionStorageData = () => { const { data } = useDemoData({ dataSet: 'Commodity', rowLength: 0, maxColumns: 7, editable: true, - visibleFields: [ - 'commodity', - 'traderName', - 'traderEmail', - 'quantity', - 'filledQuantity', - ], + visibleFields, }); const [rows] = React.useState(() => { diff --git a/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.js b/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.js index 8295de57e9dc..8fcabe12685f 100644 --- a/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.js +++ b/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.js @@ -32,8 +32,11 @@ export default function ColumnMenuGridPremiumSnap() { }); React.useEffect(() => { - apiRef.current.showColumnMenu('gross'); - console.log('after showColumnMenu'); + // To avoid an issue around Popper being open before the ref is set. + Promise.resolve().then(() => { + apiRef.current.showColumnMenu('gross'); + console.log('after showColumnMenu'); + }); }, [apiRef]); return ( diff --git a/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.tsx b/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.tsx index 8295de57e9dc..8fcabe12685f 100644 --- a/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.tsx +++ b/docs/data/data-grid/column-menu/ColumnMenuGridPremiumSnap.tsx @@ -32,8 +32,11 @@ export default function ColumnMenuGridPremiumSnap() { }); React.useEffect(() => { - apiRef.current.showColumnMenu('gross'); - console.log('after showColumnMenu'); + // To avoid an issue around Popper being open before the ref is set. + Promise.resolve().then(() => { + apiRef.current.showColumnMenu('gross'); + console.log('after showColumnMenu'); + }); }, [apiRef]); return ( diff --git a/docs/data/data-grid/export/export.md b/docs/data/data-grid/export/export.md index 41145286c6f0..3bdd96395695 100644 --- a/docs/data/data-grid/export/export.md +++ b/docs/data/data-grid/export/export.md @@ -144,6 +144,21 @@ For more details on these options, please visit the [`csvOptions` API page](/x/a /> ``` +### Escape formulas + +By default, the formulas in the cells are escaped. +This is to prevent the formulas from being executed when [the CSV file is opened in Excel](https://owasp.org/www-community/attacks/CSV_Injection). + +If you want to keep the formulas working, you can set the `escapeFormulas` option to `false`. + +```jsx +<DataGrid slotProps={{ toolbar: { csvOptions: { escapeFormulas: false } } }} /> + +// or + +<GridToolbarExport csvOptions={{ escapeFormulas: false }} /> +``` + ## Print export ### Modify the data grid style @@ -395,6 +410,21 @@ setupExcelExportWebWorker({ ::: +### Escape formulas + +By default, the formulas in the cells are escaped. +This is to prevent the formulas from being executed when [the file is opened in Excel](https://owasp.org/www-community/attacks/CSV_Injection). + +If you want to keep the formulas working, you can set the `escapeFormulas` option to `false`. + +```jsx +<DataGridPremium slotProps={{ toolbar: { excelOptions: { escapeFormulas: false } } }} /> + +// or + +<GridToolbarExport excelOptions={{ escapeFormulas: false }} /> +``` + ## Clipboard The clipboard export allows you to copy the content of the data grid to the clipboard. diff --git a/docs/data/data-grid/faq/faq.md b/docs/data/data-grid/faq/faq.md index 823b9a6d1f7d..7c3d17e7c94b 100644 --- a/docs/data/data-grid/faq/faq.md +++ b/docs/data/data-grid/faq/faq.md @@ -120,3 +120,30 @@ A few common use-cases are: - Formatting a boolean value to `Yes` or `No` It only impacts the rendering part and does not impact the internal calculations like filtering or sorting. You can know more about it in the [value formatter](/x/react-data-grid/column-definition/#value-formatter) section. + +## What is the purpose of useDemoData hook used in the documentation examples? + +The `useDemoData` hook is a utility hook from the `@mui/x-data-grid-generator` package. +It generates random data for the Data Grid. It is often used in documentation examples to provide realistic data without polluting the code with data generation logic. + +Here's how it's used: + +```tsx +import * as React from 'react'; +import { DataGrid } from '@mui/x-data-grid'; +import { useDemoData } from '@mui/x-data-grid-generator'; + +export default function Demo() { + const { data } = useDemoData({ dataSet: 'Commodity', rowLength: 100 }); + + return <DataGrid {...data} />; +} +``` + +It comes with two datasets: `Commodity` and `Employee`. You can customize the data generation by passing the custom options of type [`UseDemoDataOptions`](https://github.com/mui/mui-x/blob/6aad22644ee710690b90dc2ac6bbafceb91fecf0/packages/x-data-grid-generator/src/hooks/useDemoData.ts#L29-L36). + +:::error +`@mui/x-data-grid-generator` is a development-only package and should not be used in production. +You can use it to create a reproduction of a bug or generate demo data in your development environment. +You should not rely on its API – we don't follow semver for this package. +::: diff --git a/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js index f2dfefdc34c6..74746adaa6f9 100644 --- a/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js +++ b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.js @@ -1,74 +1,90 @@ import * as React from 'react'; import Box from '@mui/material/Box'; -import { DataGrid, GridToolbar } from '@mui/x-data-grid'; -import { randomTraderName, randomEmail } from '@mui/x-data-grid-generator'; -import FormControlLabel from '@mui/material/FormControlLabel'; import Switch from '@mui/material/Switch'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import { DataGrid, GridToolbar } from '@mui/x-data-grid'; +import { useMovieData } from '@mui/x-data-grid-generator'; -const columns = [ - { field: 'id', headerName: 'ID', width: 80 }, - { field: 'name', headerName: 'Name', width: 150 }, - { field: 'email', headerName: 'Email', width: 150 }, - { field: 'age', headerName: 'Age', type: 'number' }, -]; - -const rows = [ - { id: 1, name: randomTraderName(), email: randomEmail(), age: 25 }, - { id: 2, name: randomTraderName(), email: randomEmail(), age: 36 }, - { id: 3, name: randomTraderName(), email: randomEmail(), age: 19 }, - { id: 4, name: randomTraderName(), email: randomEmail(), age: 28 }, - { id: 5, name: randomTraderName(), email: randomEmail(), age: 23 }, - { id: 6, name: randomTraderName(), email: randomEmail(), age: 27 }, - { id: 7, name: randomTraderName(), email: randomEmail(), age: 18 }, - { id: 8, name: randomTraderName(), email: randomEmail(), age: 31 }, - { id: 9, name: randomTraderName(), email: randomEmail(), age: 24 }, - { id: 10, name: randomTraderName(), email: randomEmail(), age: 35 }, -]; +const VISIBLE_FIELDS = ['title', 'company', 'director', 'year', 'cinematicUniverse']; export default function QuickFilteringExcludeHiddenColumns() { + const data = useMovieData(); + + const columns = React.useMemo( + () => data.columns.filter((column) => VISIBLE_FIELDS.includes(column.field)), + [data.columns], + ); + const [filterModel, setFilterModel] = React.useState({ items: [], quickFilterExcludeHiddenColumns: true, - quickFilterValues: ['1'], + quickFilterValues: ['War'], }); - const [columnVisibilityModel, setColumnVisibilityModel] = React.useState({}); + const [columnVisibilityModel, setColumnVisibilityModel] = React.useState({ + company: false, + }); + + const handleFilterModelChange = React.useCallback( + (newModel) => setFilterModel(newModel), + [], + ); + + const handleColumnVisibilityChange = React.useCallback( + (newModel) => setColumnVisibilityModel(newModel), + [], + ); + + const toggleYearColumn = React.useCallback( + (event) => setColumnVisibilityModel(() => ({ company: event.target.checked })), + [], + ); + + const toggleExcludeHiddenColumns = React.useCallback( + (event) => + setFilterModel((model) => ({ + ...model, + quickFilterExcludeHiddenColumns: event.target.checked, + })), + [], + ); return ( <Box sx={{ width: 1 }}> <FormControlLabel - checked={columnVisibilityModel.id !== false} - onChange={(event) => - setColumnVisibilityModel(() => ({ id: event.target.checked })) - } + checked={columnVisibilityModel.year} + onChange={toggleYearColumn} control={<Switch color="primary" />} - label="Show ID column" + label="Show company column" /> <FormControlLabel checked={filterModel.quickFilterExcludeHiddenColumns} - onChange={(event) => - setFilterModel((model) => ({ - ...model, - quickFilterExcludeHiddenColumns: event.target.checked, - })) - } + onChange={toggleExcludeHiddenColumns} control={<Switch color="primary" />} label="Exclude hidden columns" /> <Box sx={{ height: 400 }}> <DataGrid + {...data} columns={columns} - rows={rows} + initialState={{ + filter: { + filterModel, + }, + }} disableColumnFilter + disableColumnSelector disableDensitySelector slots={{ toolbar: GridToolbar }} + slotProps={{ + toolbar: { + showQuickFilter: true, + }, + }} filterModel={filterModel} - onFilterModelChange={(newModel) => setFilterModel(newModel)} - slotProps={{ toolbar: { showQuickFilter: true } }} + onFilterModelChange={handleFilterModelChange} columnVisibilityModel={columnVisibilityModel} - onColumnVisibilityModelChange={(newModel) => - setColumnVisibilityModel(newModel) - } + onColumnVisibilityModelChange={handleColumnVisibilityChange} /> </Box> </Box> diff --git a/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.tsx b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.tsx index 46597a6ecba9..07ae5379b7ef 100644 --- a/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.tsx +++ b/docs/data/data-grid/filtering/QuickFilteringExcludeHiddenColumns.tsx @@ -1,82 +1,95 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Switch from '@mui/material/Switch'; +import FormControlLabel from '@mui/material/FormControlLabel'; import { DataGrid, - GridToolbar, - GridRowsProp, - GridColDef, - GridFilterModel, GridColumnVisibilityModel, + GridFilterModel, + GridToolbar, } from '@mui/x-data-grid'; -import { randomTraderName, randomEmail } from '@mui/x-data-grid-generator'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Switch from '@mui/material/Switch'; +import { useMovieData } from '@mui/x-data-grid-generator'; -const columns: GridColDef[] = [ - { field: 'id', headerName: 'ID', width: 80 }, - { field: 'name', headerName: 'Name', width: 150 }, - { field: 'email', headerName: 'Email', width: 150 }, - { field: 'age', headerName: 'Age', type: 'number' }, -]; - -const rows: GridRowsProp = [ - { id: 1, name: randomTraderName(), email: randomEmail(), age: 25 }, - { id: 2, name: randomTraderName(), email: randomEmail(), age: 36 }, - { id: 3, name: randomTraderName(), email: randomEmail(), age: 19 }, - { id: 4, name: randomTraderName(), email: randomEmail(), age: 28 }, - { id: 5, name: randomTraderName(), email: randomEmail(), age: 23 }, - { id: 6, name: randomTraderName(), email: randomEmail(), age: 27 }, - { id: 7, name: randomTraderName(), email: randomEmail(), age: 18 }, - { id: 8, name: randomTraderName(), email: randomEmail(), age: 31 }, - { id: 9, name: randomTraderName(), email: randomEmail(), age: 24 }, - { id: 10, name: randomTraderName(), email: randomEmail(), age: 35 }, -]; +const VISIBLE_FIELDS = ['title', 'company', 'director', 'year', 'cinematicUniverse']; export default function QuickFilteringExcludeHiddenColumns() { + const data = useMovieData(); + + const columns = React.useMemo( + () => data.columns.filter((column) => VISIBLE_FIELDS.includes(column.field)), + [data.columns], + ); + const [filterModel, setFilterModel] = React.useState<GridFilterModel>({ items: [], quickFilterExcludeHiddenColumns: true, - quickFilterValues: ['1'], + quickFilterValues: ['War'], }); const [columnVisibilityModel, setColumnVisibilityModel] = - React.useState<GridColumnVisibilityModel>({}); + React.useState<GridColumnVisibilityModel>({ company: false }); + + const handleFilterModelChange = React.useCallback( + (newModel: GridFilterModel) => setFilterModel(newModel), + [], + ); + + const handleColumnVisibilityChange = React.useCallback( + (newModel: GridColumnVisibilityModel) => setColumnVisibilityModel(newModel), + [], + ); + + const toggleYearColumn = React.useCallback( + (event: React.SyntheticEvent) => + setColumnVisibilityModel(() => ({ company: (event.target as any).checked })), + [], + ); + + const toggleExcludeHiddenColumns = React.useCallback( + (event: React.SyntheticEvent) => + setFilterModel((model) => ({ + ...model, + quickFilterExcludeHiddenColumns: (event.target as any).checked, + })), + [], + ); return ( <Box sx={{ width: 1 }}> <FormControlLabel - checked={columnVisibilityModel.id !== false} - onChange={(event) => - setColumnVisibilityModel(() => ({ id: (event.target as any).checked })) - } + checked={columnVisibilityModel.year} + onChange={toggleYearColumn} control={<Switch color="primary" />} - label="Show ID column" + label="Show company column" /> <FormControlLabel checked={filterModel.quickFilterExcludeHiddenColumns} - onChange={(event) => - setFilterModel((model) => ({ - ...model, - quickFilterExcludeHiddenColumns: (event.target as any).checked, - })) - } + onChange={toggleExcludeHiddenColumns} control={<Switch color="primary" />} label="Exclude hidden columns" /> <Box sx={{ height: 400 }}> <DataGrid + {...data} columns={columns} - rows={rows} + initialState={{ + filter: { + filterModel, + }, + }} disableColumnFilter + disableColumnSelector disableDensitySelector slots={{ toolbar: GridToolbar }} + slotProps={{ + toolbar: { + showQuickFilter: true, + }, + }} filterModel={filterModel} - onFilterModelChange={(newModel) => setFilterModel(newModel)} - slotProps={{ toolbar: { showQuickFilter: true } }} + onFilterModelChange={handleFilterModelChange} columnVisibilityModel={columnVisibilityModel} - onColumnVisibilityModelChange={(newModel) => - setColumnVisibilityModel(newModel) - } + onColumnVisibilityModelChange={handleColumnVisibilityChange} /> </Box> </Box> diff --git a/docs/data/data-grid/filtering/QuickFilteringGrid.js b/docs/data/data-grid/filtering/QuickFilteringGrid.js index c55663c35e25..219d0c42f4cb 100644 --- a/docs/data/data-grid/filtering/QuickFilteringGrid.js +++ b/docs/data/data-grid/filtering/QuickFilteringGrid.js @@ -1,16 +1,12 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import { DataGrid, GridToolbar } from '@mui/x-data-grid'; -import { useDemoData } from '@mui/x-data-grid-generator'; +import { useMovieData } from '@mui/x-data-grid-generator'; -const VISIBLE_FIELDS = ['name', 'rating', 'country', 'dateCreated', 'isAdmin']; +const VISIBLE_FIELDS = ['title', 'company', 'director', 'year', 'cinematicUniverse']; export default function QuickFilteringGrid() { - const { data } = useDemoData({ - dataSet: 'Employee', - visibleFields: VISIBLE_FIELDS, - rowLength: 100, - }); + const data = useMovieData(); // Otherwise filter will be applied on fields such as the hidden column id const columns = React.useMemo( diff --git a/docs/data/data-grid/filtering/QuickFilteringGrid.tsx b/docs/data/data-grid/filtering/QuickFilteringGrid.tsx index c55663c35e25..219d0c42f4cb 100644 --- a/docs/data/data-grid/filtering/QuickFilteringGrid.tsx +++ b/docs/data/data-grid/filtering/QuickFilteringGrid.tsx @@ -1,16 +1,12 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import { DataGrid, GridToolbar } from '@mui/x-data-grid'; -import { useDemoData } from '@mui/x-data-grid-generator'; +import { useMovieData } from '@mui/x-data-grid-generator'; -const VISIBLE_FIELDS = ['name', 'rating', 'country', 'dateCreated', 'isAdmin']; +const VISIBLE_FIELDS = ['title', 'company', 'director', 'year', 'cinematicUniverse']; export default function QuickFilteringGrid() { - const { data } = useDemoData({ - dataSet: 'Employee', - visibleFields: VISIBLE_FIELDS, - rowLength: 100, - }); + const data = useMovieData(); // Otherwise filter will be applied on fields such as the hidden column id const columns = React.useMemo( diff --git a/docs/data/data-grid/filtering/QuickFilteringInitialize.js b/docs/data/data-grid/filtering/QuickFilteringInitialize.js index d71f54958e77..6038f7153a4d 100644 --- a/docs/data/data-grid/filtering/QuickFilteringInitialize.js +++ b/docs/data/data-grid/filtering/QuickFilteringInitialize.js @@ -1,16 +1,12 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import { DataGrid, GridToolbar } from '@mui/x-data-grid'; -import { useDemoData } from '@mui/x-data-grid-generator'; +import { useMovieData } from '@mui/x-data-grid-generator'; -const VISIBLE_FIELDS = ['name', 'rating', 'country', 'dateCreated', 'isAdmin']; +const VISIBLE_FIELDS = ['title', 'company', 'director', 'year', 'cinematicUniverse']; export default function QuickFilteringInitialize() { - const { data } = useDemoData({ - dataSet: 'Employee', - visibleFields: VISIBLE_FIELDS, - rowLength: 100, - }); + const data = useMovieData(); // Otherwise filter will be applied on fields such as the hidden column id const columns = React.useMemo( @@ -23,11 +19,10 @@ export default function QuickFilteringInitialize() { <DataGrid {...data} initialState={{ - ...data.initialState, filter: { filterModel: { items: [], - quickFilterValues: ['ab'], + quickFilterValues: ['Disney', 'Star'], }, }, }} diff --git a/docs/data/data-grid/filtering/QuickFilteringInitialize.tsx b/docs/data/data-grid/filtering/QuickFilteringInitialize.tsx index d71f54958e77..6038f7153a4d 100644 --- a/docs/data/data-grid/filtering/QuickFilteringInitialize.tsx +++ b/docs/data/data-grid/filtering/QuickFilteringInitialize.tsx @@ -1,16 +1,12 @@ import * as React from 'react'; import Box from '@mui/material/Box'; import { DataGrid, GridToolbar } from '@mui/x-data-grid'; -import { useDemoData } from '@mui/x-data-grid-generator'; +import { useMovieData } from '@mui/x-data-grid-generator'; -const VISIBLE_FIELDS = ['name', 'rating', 'country', 'dateCreated', 'isAdmin']; +const VISIBLE_FIELDS = ['title', 'company', 'director', 'year', 'cinematicUniverse']; export default function QuickFilteringInitialize() { - const { data } = useDemoData({ - dataSet: 'Employee', - visibleFields: VISIBLE_FIELDS, - rowLength: 100, - }); + const data = useMovieData(); // Otherwise filter will be applied on fields such as the hidden column id const columns = React.useMemo( @@ -23,11 +19,10 @@ export default function QuickFilteringInitialize() { <DataGrid {...data} initialState={{ - ...data.initialState, filter: { filterModel: { items: [], - quickFilterValues: ['ab'], + quickFilterValues: ['Disney', 'Star'], }, }, }} diff --git a/docs/data/data-grid/filtering/quick-filter.md b/docs/data/data-grid/filtering/quick-filter.md index fb43ebab0de8..1519734bae1a 100644 --- a/docs/data/data-grid/filtering/quick-filter.md +++ b/docs/data/data-grid/filtering/quick-filter.md @@ -19,7 +19,7 @@ The quick filter values can be initialized by setting the `filter.filterModel.qu filter: { filterModel: { items: [], - quickFilterValues: ['quick', 'filter'], + quickFilterValues: ['Disney', 'Star'], }, }, }} @@ -47,8 +47,8 @@ To include hidden columns in the quick filter, set `filterModel.quickFilterExclu /> ``` -In the demo below, try hiding the `ID` column. You will see no results, because there are no visible columns that contain `1`. -Once you disable the `Exclude hidden columns` switch, the rows with `ID` containing `1` will be shown, even though the column is hidden. +In the demo below, the `company` column is hidden. You'll only see 5 results because rows where the `company` value is `'Warner Bros.'` are excluded. +However, when you disable the `Exclude hidden columns` switch, the rows containing `'Warner'` in the `company` field will be displayed again, even though the column remains hidden. {{"demo": "QuickFilteringExcludeHiddenColumns.js", "bg": "inline", "defaultCodeOpen": false}} diff --git a/docs/data/data-grid/localization/data.json b/docs/data/data-grid/localization/data.json index ccb7eaa89bd1..0e5736de31df 100644 --- a/docs/data/data-grid/localization/data.json +++ b/docs/data/data-grid/localization/data.json @@ -83,7 +83,7 @@ "languageTag": "fi-FI", "importName": "fiFI", "localeName": "Finnish", - "missingKeysCount": 4, + "missingKeysCount": 0, "totalKeysCount": 118, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/x-data-grid/src/locales/fiFI.ts" }, diff --git a/docs/data/data-grid/master-detail/master-detail.md b/docs/data/data-grid/master-detail/master-detail.md index 679a57852f15..0af556b2bd03 100644 --- a/docs/data/data-grid/master-detail/master-detail.md +++ b/docs/data/data-grid/master-detail/master-detail.md @@ -135,6 +135,31 @@ This approach can also be used to change the location of the toggle column, as s As any ordinary cell renderer, the `value` prop is also available, and it corresponds to the state of the row: `true` when expanded and `false` when collapsed. ::: +## Custom header for detail panel column + +To render a custom header for the detail panel column, use the [`renderHeader`](/x/react-data-grid/column-header/#custom-header-renderer) property in the column definition. +This property receives a `GridRenderHeaderParams` object that contains `colDef` (the column definition) and `field`. +The following example demonstrates how to render a custom header for the detail panel column: + +```tsx +const columns = [ + { + ...GRID_DETAIL_PANEL_TOGGLE_COL_DEF, + renderHeader: (params) => ( + <div> + <span>{params.colDef.headerName}</span> + <button onClick={() => console.log('Custom action')}>Custom action</button> + </div> + ), + }, + //... other columns +]; +``` + +:::info +For a more advanced example check out the [Expand or collapse all detail panels](/x/react-data-grid/row-recipes/#expand-or-collapse-all-detail-panels) recipe. +::: + ## Disable detail panel content scroll By default, the detail panel has a width that is the sum of the widths of all columns. @@ -153,6 +178,7 @@ Notice that the toggle column is pinned to make sure that it will always be visi More examples of how to customize the detail panel: - [One expanded detail panel at a time](/x/react-data-grid/row-recipes/#one-expanded-detail-panel-at-a-time) +- [Expand or collapse all detail panels](/x/react-data-grid/row-recipes/#expand-or-collapse-all-detail-panels) ## apiRef diff --git a/docs/data/data-grid/overview/DataGridPremiumDemo.js b/docs/data/data-grid/overview/DataGridPremiumDemo.js index 661938268a6b..98a6959cff62 100644 --- a/docs/data/data-grid/overview/DataGridPremiumDemo.js +++ b/docs/data/data-grid/overview/DataGridPremiumDemo.js @@ -8,24 +8,26 @@ import { } from '@mui/x-data-grid-premium'; import { useDemoData } from '@mui/x-data-grid-generator'; +const visibleFields = [ + 'commodity', + 'quantity', + 'filledQuantity', + 'status', + 'isFilled', + 'unitPrice', + 'unitPriceCurrency', + 'subTotal', + 'feeRate', + 'feeAmount', + 'incoTerm', +]; + export default function DataGridPremiumDemo() { const { data, loading } = useDemoData({ dataSet: 'Commodity', rowLength: 100, editable: true, - visibleFields: [ - 'commodity', - 'quantity', - 'filledQuantity', - 'status', - 'isFilled', - 'unitPrice', - 'unitPriceCurrency', - 'subTotal', - 'feeRate', - 'feeAmount', - 'incoTerm', - ], + visibleFields, }); const apiRef = useGridApiRef(); diff --git a/docs/data/data-grid/overview/DataGridPremiumDemo.tsx b/docs/data/data-grid/overview/DataGridPremiumDemo.tsx index 661938268a6b..98a6959cff62 100644 --- a/docs/data/data-grid/overview/DataGridPremiumDemo.tsx +++ b/docs/data/data-grid/overview/DataGridPremiumDemo.tsx @@ -8,24 +8,26 @@ import { } from '@mui/x-data-grid-premium'; import { useDemoData } from '@mui/x-data-grid-generator'; +const visibleFields = [ + 'commodity', + 'quantity', + 'filledQuantity', + 'status', + 'isFilled', + 'unitPrice', + 'unitPriceCurrency', + 'subTotal', + 'feeRate', + 'feeAmount', + 'incoTerm', +]; + export default function DataGridPremiumDemo() { const { data, loading } = useDemoData({ dataSet: 'Commodity', rowLength: 100, editable: true, - visibleFields: [ - 'commodity', - 'quantity', - 'filledQuantity', - 'status', - 'isFilled', - 'unitPrice', - 'unitPriceCurrency', - 'subTotal', - 'feeRate', - 'feeAmount', - 'incoTerm', - ], + visibleFields, }); const apiRef = useGridApiRef(); diff --git a/docs/data/data-grid/recipes-editing/BulkEditing.js b/docs/data/data-grid/recipes-editing/BulkEditing.js new file mode 100644 index 000000000000..742431ab92b5 --- /dev/null +++ b/docs/data/data-grid/recipes-editing/BulkEditing.js @@ -0,0 +1,201 @@ +/* eslint-disable no-underscore-dangle */ +import * as React from 'react'; +import { + DataGrid, + useGridApiRef, + GridActionsCellItem, + gridClasses, +} from '@mui/x-data-grid'; +import { useDemoData } from '@mui/x-data-grid-generator'; +import Button from '@mui/material/Button'; +import DeleteIcon from '@mui/icons-material/Delete'; +import RestoreIcon from '@mui/icons-material/Restore'; +import LoadingButton from '@mui/lab/LoadingButton'; +import SaveIcon from '@mui/icons-material/Save'; +import { darken } from '@mui/material/styles'; + +const visibleFields = [ + 'id', + 'commodity', + 'traderName', + 'traderEmail', + 'quantity', + 'filledQuantity', +]; + +export default function BulkEditing() { + const { data } = useDemoData({ + dataSet: 'Commodity', + rowLength: 100, + maxColumns: 7, + editable: true, + visibleFields, + }); + + const apiRef = useGridApiRef(); + + const [hasUnsavedRows, setHasUnsavedRows] = React.useState(false); + const [isSaving, setIsSaving] = React.useState(false); + const unsavedChangesRef = React.useRef({ + unsavedRows: {}, + rowsBeforeChange: {}, + }); + + const columns = React.useMemo(() => { + return [ + { + field: 'actions', + type: 'actions', + getActions: ({ id, row }) => { + return [ + <GridActionsCellItem + icon={<RestoreIcon />} + label="Discard changes" + disabled={unsavedChangesRef.current.unsavedRows[id] === undefined} + onClick={() => { + apiRef.current.updateRows([ + unsavedChangesRef.current.rowsBeforeChange[id], + ]); + delete unsavedChangesRef.current.rowsBeforeChange[id]; + delete unsavedChangesRef.current.unsavedRows[id]; + setHasUnsavedRows( + Object.keys(unsavedChangesRef.current.unsavedRows).length > 0, + ); + }} + />, + <GridActionsCellItem + icon={<DeleteIcon />} + label="Delete" + onClick={() => { + unsavedChangesRef.current.unsavedRows[id] = { + ...row, + _action: 'delete', + }; + if (!unsavedChangesRef.current.rowsBeforeChange[id]) { + unsavedChangesRef.current.rowsBeforeChange[id] = row; + } + setHasUnsavedRows(true); + apiRef.current.updateRows([row]); // to trigger row render + }} + />, + ]; + }, + }, + ...data.columns, + ]; + }, [data.columns, unsavedChangesRef, apiRef]); + + const processRowUpdate = React.useCallback((newRow, oldRow) => { + const rowId = newRow.id; + + unsavedChangesRef.current.unsavedRows[rowId] = newRow; + if (!unsavedChangesRef.current.rowsBeforeChange[rowId]) { + unsavedChangesRef.current.rowsBeforeChange[rowId] = oldRow; + } + setHasUnsavedRows(true); + return newRow; + }, []); + + const discardChanges = React.useCallback(() => { + setHasUnsavedRows(false); + Object.values(unsavedChangesRef.current.rowsBeforeChange).forEach((row) => { + apiRef.current.updateRows([row]); + }); + unsavedChangesRef.current = { + unsavedRows: {}, + rowsBeforeChange: {}, + }; + }, [apiRef]); + + const saveChanges = React.useCallback(async () => { + try { + // Persist updates in the database + setIsSaving(true); + await new Promise((resolve) => { + setTimeout(resolve, 1000); + }); + + setIsSaving(false); + const rowsToDelete = Object.values( + unsavedChangesRef.current.unsavedRows, + ).filter((row) => row._action === 'delete'); + if (rowsToDelete.length > 0) { + rowsToDelete.forEach((row) => { + apiRef.current.updateRows([row]); + }); + } + + setHasUnsavedRows(false); + unsavedChangesRef.current = { + unsavedRows: {}, + rowsBeforeChange: {}, + }; + } catch (error) { + setIsSaving(false); + } + }, [apiRef]); + + const getRowClassName = React.useCallback(({ id }) => { + const unsavedRow = unsavedChangesRef.current.unsavedRows[id]; + if (unsavedRow) { + if (unsavedRow._action === 'delete') { + return 'row--removed'; + } + return 'row--edited'; + } + return ''; + }, []); + + return ( + <div style={{ width: '100%' }}> + <div style={{ marginBottom: 8 }}> + <LoadingButton + disabled={!hasUnsavedRows} + loading={isSaving} + onClick={saveChanges} + startIcon={<SaveIcon />} + loadingPosition="start" + > + <span>Save</span> + </LoadingButton> + <Button + disabled={!hasUnsavedRows || isSaving} + onClick={discardChanges} + startIcon={<RestoreIcon />} + > + Discard all changes + </Button> + </div> + <div style={{ height: 400 }}> + <DataGrid + {...data} + columns={columns} + apiRef={apiRef} + disableRowSelectionOnClick + processRowUpdate={processRowUpdate} + ignoreValueFormatterDuringExport + sx={{ + [`& .${gridClasses.row}.row--removed`]: { + backgroundColor: (theme) => { + if (theme.palette.mode === 'light') { + return 'rgba(255, 170, 170, 0.3)'; + } + return darken('rgba(255, 170, 170, 1)', 0.7); + }, + }, + [`& .${gridClasses.row}.row--edited`]: { + backgroundColor: (theme) => { + if (theme.palette.mode === 'light') { + return 'rgba(255, 254, 176, 0.3)'; + } + return darken('rgba(255, 254, 176, 1)', 0.6); + }, + }, + }} + loading={isSaving} + getRowClassName={getRowClassName} + /> + </div> + </div> + ); +} diff --git a/docs/data/data-grid/recipes-editing/BulkEditing.tsx b/docs/data/data-grid/recipes-editing/BulkEditing.tsx new file mode 100644 index 000000000000..eaa13ebbc21e --- /dev/null +++ b/docs/data/data-grid/recipes-editing/BulkEditing.tsx @@ -0,0 +1,212 @@ +/* eslint-disable no-underscore-dangle */ +import * as React from 'react'; +import { + DataGrid, + GridRowId, + GridValidRowModel, + DataGridProps, + useGridApiRef, + GridActionsCellItem, + GridColDef, + gridClasses, +} from '@mui/x-data-grid'; +import { useDemoData } from '@mui/x-data-grid-generator'; +import Button from '@mui/material/Button'; +import DeleteIcon from '@mui/icons-material/Delete'; +import RestoreIcon from '@mui/icons-material/Restore'; +import LoadingButton from '@mui/lab/LoadingButton'; +import SaveIcon from '@mui/icons-material/Save'; +import { darken } from '@mui/material/styles'; + +const visibleFields = [ + 'id', + 'commodity', + 'traderName', + 'traderEmail', + 'quantity', + 'filledQuantity', +]; + +export default function BulkEditing() { + const { data } = useDemoData({ + dataSet: 'Commodity', + rowLength: 100, + maxColumns: 7, + editable: true, + visibleFields, + }); + + const apiRef = useGridApiRef(); + + const [hasUnsavedRows, setHasUnsavedRows] = React.useState(false); + const [isSaving, setIsSaving] = React.useState(false); + const unsavedChangesRef = React.useRef<{ + unsavedRows: Record<GridRowId, GridValidRowModel>; + rowsBeforeChange: Record<GridRowId, GridValidRowModel>; + }>({ + unsavedRows: {}, + rowsBeforeChange: {}, + }); + + const columns = React.useMemo<GridColDef[]>(() => { + return [ + { + field: 'actions', + type: 'actions', + getActions: ({ id, row }) => { + return [ + <GridActionsCellItem + icon={<RestoreIcon />} + label="Discard changes" + disabled={unsavedChangesRef.current.unsavedRows[id] === undefined} + onClick={() => { + apiRef.current.updateRows([ + unsavedChangesRef.current.rowsBeforeChange[id], + ]); + delete unsavedChangesRef.current.rowsBeforeChange[id]; + delete unsavedChangesRef.current.unsavedRows[id]; + setHasUnsavedRows( + Object.keys(unsavedChangesRef.current.unsavedRows).length > 0, + ); + }} + />, + <GridActionsCellItem + icon={<DeleteIcon />} + label="Delete" + onClick={() => { + unsavedChangesRef.current.unsavedRows[id] = { + ...row, + _action: 'delete', + }; + if (!unsavedChangesRef.current.rowsBeforeChange[id]) { + unsavedChangesRef.current.rowsBeforeChange[id] = row; + } + setHasUnsavedRows(true); + apiRef.current.updateRows([row]); // to trigger row render + }} + />, + ]; + }, + }, + ...data.columns, + ]; + }, [data.columns, unsavedChangesRef, apiRef]); + + const processRowUpdate = React.useCallback< + NonNullable<DataGridProps['processRowUpdate']> + >((newRow, oldRow) => { + const rowId = newRow.id; + + unsavedChangesRef.current.unsavedRows[rowId] = newRow; + if (!unsavedChangesRef.current.rowsBeforeChange[rowId]) { + unsavedChangesRef.current.rowsBeforeChange[rowId] = oldRow; + } + setHasUnsavedRows(true); + return newRow; + }, []); + + const discardChanges = React.useCallback(() => { + setHasUnsavedRows(false); + Object.values(unsavedChangesRef.current.rowsBeforeChange).forEach((row) => { + apiRef.current.updateRows([row]); + }); + unsavedChangesRef.current = { + unsavedRows: {}, + rowsBeforeChange: {}, + }; + }, [apiRef]); + + const saveChanges = React.useCallback(async () => { + try { + // Persist updates in the database + setIsSaving(true); + await new Promise((resolve) => { + setTimeout(resolve, 1000); + }); + + setIsSaving(false); + const rowsToDelete = Object.values( + unsavedChangesRef.current.unsavedRows, + ).filter((row) => row._action === 'delete'); + if (rowsToDelete.length > 0) { + rowsToDelete.forEach((row) => { + apiRef.current.updateRows([row]); + }); + } + + setHasUnsavedRows(false); + unsavedChangesRef.current = { + unsavedRows: {}, + rowsBeforeChange: {}, + }; + } catch (error) { + setIsSaving(false); + } + }, [apiRef]); + + const getRowClassName = React.useCallback< + NonNullable<DataGridProps['getRowClassName']> + >(({ id }) => { + const unsavedRow = unsavedChangesRef.current.unsavedRows[id]; + if (unsavedRow) { + if (unsavedRow._action === 'delete') { + return 'row--removed'; + } + return 'row--edited'; + } + return ''; + }, []); + + return ( + <div style={{ width: '100%' }}> + <div style={{ marginBottom: 8 }}> + <LoadingButton + disabled={!hasUnsavedRows} + loading={isSaving} + onClick={saveChanges} + startIcon={<SaveIcon />} + loadingPosition="start" + > + <span>Save</span> + </LoadingButton> + <Button + disabled={!hasUnsavedRows || isSaving} + onClick={discardChanges} + startIcon={<RestoreIcon />} + > + Discard all changes + </Button> + </div> + <div style={{ height: 400 }}> + <DataGrid + {...data} + columns={columns} + apiRef={apiRef} + disableRowSelectionOnClick + processRowUpdate={processRowUpdate} + ignoreValueFormatterDuringExport + sx={{ + [`& .${gridClasses.row}.row--removed`]: { + backgroundColor: (theme) => { + if (theme.palette.mode === 'light') { + return 'rgba(255, 170, 170, 0.3)'; + } + return darken('rgba(255, 170, 170, 1)', 0.7); + }, + }, + [`& .${gridClasses.row}.row--edited`]: { + backgroundColor: (theme) => { + if (theme.palette.mode === 'light') { + return 'rgba(255, 254, 176, 0.3)'; + } + return darken('rgba(255, 254, 176, 1)', 0.6); + }, + }, + }} + loading={isSaving} + getRowClassName={getRowClassName} + /> + </div> + </div> + ); +} diff --git a/docs/data/data-grid/recipes-editing/BulkEditingNoSnap.js b/docs/data/data-grid/recipes-editing/BulkEditingPremiumNoSnap.js similarity index 85% rename from docs/data/data-grid/recipes-editing/BulkEditingNoSnap.js rename to docs/data/data-grid/recipes-editing/BulkEditingPremiumNoSnap.js index 64cbfeecdaa7..45e1e126a335 100644 --- a/docs/data/data-grid/recipes-editing/BulkEditingNoSnap.js +++ b/docs/data/data-grid/recipes-editing/BulkEditingPremiumNoSnap.js @@ -4,6 +4,7 @@ import { DataGridPremium, useGridApiRef, GridActionsCellItem, + gridClasses, } from '@mui/x-data-grid-premium'; import { useDemoData } from '@mui/x-data-grid-generator'; import Button from '@mui/material/Button'; @@ -13,30 +14,32 @@ import LoadingButton from '@mui/lab/LoadingButton'; import SaveIcon from '@mui/icons-material/Save'; import { darken } from '@mui/material/styles'; -export default function BulkEditingNoSnap() { +const visibleFields = [ + 'id', + 'commodity', + 'traderName', + 'traderEmail', + 'quantity', + 'filledQuantity', +]; + +export default function BulkEditingPremiumNoSnap() { const { data } = useDemoData({ dataSet: 'Commodity', rowLength: 100, maxColumns: 7, editable: true, - visibleFields: [ - 'id', - 'commodity', - 'traderName', - 'traderEmail', - 'quantity', - 'filledQuantity', - ], + visibleFields, }); const apiRef = useGridApiRef(); const [hasUnsavedRows, setHasUnsavedRows] = React.useState(false); + const [isSaving, setIsSaving] = React.useState(false); const unsavedChangesRef = React.useRef({ unsavedRows: {}, rowsBeforeChange: {}, }); - const [isSaving, setIsSaving] = React.useState(false); const columns = React.useMemo(() => { return [ @@ -82,7 +85,7 @@ export default function BulkEditingNoSnap() { ]; }, [data.columns, unsavedChangesRef, apiRef]); - const processRowUpdate = (newRow, oldRow) => { + const processRowUpdate = React.useCallback((newRow, oldRow) => { const rowId = newRow.id; unsavedChangesRef.current.unsavedRows[rowId] = newRow; @@ -91,9 +94,9 @@ export default function BulkEditingNoSnap() { } setHasUnsavedRows(true); return newRow; - }; + }, []); - const discardChanges = () => { + const discardChanges = React.useCallback(() => { setHasUnsavedRows(false); apiRef.current.updateRows( Object.values(unsavedChangesRef.current.rowsBeforeChange), @@ -102,9 +105,9 @@ export default function BulkEditingNoSnap() { unsavedRows: {}, rowsBeforeChange: {}, }; - }; + }, [apiRef]); - const saveChanges = async () => { + const saveChanges = React.useCallback(async () => { try { // Persist updates in the database setIsSaving(true); @@ -128,7 +131,18 @@ export default function BulkEditingNoSnap() { } catch (error) { setIsSaving(false); } - }; + }, [apiRef]); + + const getRowClassName = React.useCallback(({ id }) => { + const unsavedRow = unsavedChangesRef.current.unsavedRows[id]; + if (unsavedRow) { + if (unsavedRow._action === 'delete') { + return 'row--removed'; + } + return 'row--edited'; + } + return ''; + }, []); return ( <div style={{ width: '100%' }}> @@ -160,7 +174,7 @@ export default function BulkEditingNoSnap() { processRowUpdate={processRowUpdate} ignoreValueFormatterDuringExport sx={{ - '& .MuiDataGrid-row.row--removed': { + [`& .${gridClasses.row}.row--removed`]: { backgroundColor: (theme) => { if (theme.palette.mode === 'light') { return 'rgba(255, 170, 170, 0.3)'; @@ -168,7 +182,7 @@ export default function BulkEditingNoSnap() { return darken('rgba(255, 170, 170, 1)', 0.7); }, }, - '& .MuiDataGrid-row.row--edited': { + [`& .${gridClasses.row}.row--edited`]: { backgroundColor: (theme) => { if (theme.palette.mode === 'light') { return 'rgba(255, 254, 176, 0.3)'; @@ -178,16 +192,7 @@ export default function BulkEditingNoSnap() { }, }} loading={isSaving} - getRowClassName={({ id }) => { - const unsavedRow = unsavedChangesRef.current.unsavedRows[id]; - if (unsavedRow) { - if (unsavedRow._action === 'delete') { - return 'row--removed'; - } - return 'row--edited'; - } - return ''; - }} + getRowClassName={getRowClassName} /> </div> </div> diff --git a/docs/data/data-grid/recipes-editing/BulkEditingNoSnap.tsx b/docs/data/data-grid/recipes-editing/BulkEditingPremiumNoSnap.tsx similarity index 84% rename from docs/data/data-grid/recipes-editing/BulkEditingNoSnap.tsx rename to docs/data/data-grid/recipes-editing/BulkEditingPremiumNoSnap.tsx index 728b00790114..4e031b90de6e 100644 --- a/docs/data/data-grid/recipes-editing/BulkEditingNoSnap.tsx +++ b/docs/data/data-grid/recipes-editing/BulkEditingPremiumNoSnap.tsx @@ -8,6 +8,7 @@ import { useGridApiRef, GridActionsCellItem, GridColDef, + gridClasses, } from '@mui/x-data-grid-premium'; import { useDemoData } from '@mui/x-data-grid-generator'; import Button from '@mui/material/Button'; @@ -17,25 +18,28 @@ import LoadingButton from '@mui/lab/LoadingButton'; import SaveIcon from '@mui/icons-material/Save'; import { darken } from '@mui/material/styles'; -export default function BulkEditingNoSnap() { +const visibleFields = [ + 'id', + 'commodity', + 'traderName', + 'traderEmail', + 'quantity', + 'filledQuantity', +]; + +export default function BulkEditingPremiumNoSnap() { const { data } = useDemoData({ dataSet: 'Commodity', rowLength: 100, maxColumns: 7, editable: true, - visibleFields: [ - 'id', - 'commodity', - 'traderName', - 'traderEmail', - 'quantity', - 'filledQuantity', - ], + visibleFields, }); const apiRef = useGridApiRef(); const [hasUnsavedRows, setHasUnsavedRows] = React.useState(false); + const [isSaving, setIsSaving] = React.useState(false); const unsavedChangesRef = React.useRef<{ unsavedRows: Record<GridRowId, GridValidRowModel>; rowsBeforeChange: Record<GridRowId, GridValidRowModel>; @@ -43,7 +47,6 @@ export default function BulkEditingNoSnap() { unsavedRows: {}, rowsBeforeChange: {}, }); - const [isSaving, setIsSaving] = React.useState(false); const columns = React.useMemo<GridColDef[]>(() => { return [ @@ -89,10 +92,9 @@ export default function BulkEditingNoSnap() { ]; }, [data.columns, unsavedChangesRef, apiRef]); - const processRowUpdate: NonNullable<DataGridPremiumProps['processRowUpdate']> = ( - newRow, - oldRow, - ) => { + const processRowUpdate = React.useCallback< + NonNullable<DataGridPremiumProps['processRowUpdate']> + >((newRow, oldRow) => { const rowId = newRow.id; unsavedChangesRef.current.unsavedRows[rowId] = newRow; @@ -101,9 +103,9 @@ export default function BulkEditingNoSnap() { } setHasUnsavedRows(true); return newRow; - }; + }, []); - const discardChanges = () => { + const discardChanges = React.useCallback(() => { setHasUnsavedRows(false); apiRef.current.updateRows( Object.values(unsavedChangesRef.current.rowsBeforeChange), @@ -112,9 +114,9 @@ export default function BulkEditingNoSnap() { unsavedRows: {}, rowsBeforeChange: {}, }; - }; + }, [apiRef]); - const saveChanges = async () => { + const saveChanges = React.useCallback(async () => { try { // Persist updates in the database setIsSaving(true); @@ -138,7 +140,20 @@ export default function BulkEditingNoSnap() { } catch (error) { setIsSaving(false); } - }; + }, [apiRef]); + + const getRowClassName = React.useCallback< + NonNullable<DataGridPremiumProps['getRowClassName']> + >(({ id }) => { + const unsavedRow = unsavedChangesRef.current.unsavedRows[id]; + if (unsavedRow) { + if (unsavedRow._action === 'delete') { + return 'row--removed'; + } + return 'row--edited'; + } + return ''; + }, []); return ( <div style={{ width: '100%' }}> @@ -170,7 +185,7 @@ export default function BulkEditingNoSnap() { processRowUpdate={processRowUpdate} ignoreValueFormatterDuringExport sx={{ - '& .MuiDataGrid-row.row--removed': { + [`& .${gridClasses.row}.row--removed`]: { backgroundColor: (theme) => { if (theme.palette.mode === 'light') { return 'rgba(255, 170, 170, 0.3)'; @@ -178,7 +193,7 @@ export default function BulkEditingNoSnap() { return darken('rgba(255, 170, 170, 1)', 0.7); }, }, - '& .MuiDataGrid-row.row--edited': { + [`& .${gridClasses.row}.row--edited`]: { backgroundColor: (theme) => { if (theme.palette.mode === 'light') { return 'rgba(255, 254, 176, 0.3)'; @@ -188,16 +203,7 @@ export default function BulkEditingNoSnap() { }, }} loading={isSaving} - getRowClassName={({ id }) => { - const unsavedRow = unsavedChangesRef.current.unsavedRows[id]; - if (unsavedRow) { - if (unsavedRow._action === 'delete') { - return 'row--removed'; - } - return 'row--edited'; - } - return ''; - }} + getRowClassName={getRowClassName} /> </div> </div> diff --git a/docs/data/data-grid/recipes-editing/recipes-editing.md b/docs/data/data-grid/recipes-editing/recipes-editing.md index 8b053fe23e7c..e0396531b81a 100644 --- a/docs/data/data-grid/recipes-editing/recipes-editing.md +++ b/docs/data/data-grid/recipes-editing/recipes-editing.md @@ -113,6 +113,11 @@ You can utilize this callback to batch edits locally and then choose to either p The demo below stores edited and deleted rows in the `unsavedChangesRef`. These changes are saved or discarded when the user clicks the **Save** or **Discard** buttons respectively. -Row updates from [Clipboard paste](/x/react-data-grid/clipboard/#clipboard-paste) are also batched, as [Clipboard paste uses Editing API for persistence](/x/react-data-grid/clipboard/#persisting-pasted-data). -{{"demo": "BulkEditingNoSnap.js", "bg": "inline", "defaultCodeOpen": false}} +{{"demo": "BulkEditing.js", "bg": "inline", "defaultCodeOpen": false}} + +### With commercial features [<span class="plan-premium"></span>](/x/introduction/licensing/#premium-plan 'Premium plan') + +When using [`DataGridPremium`](/x/react-data-grid/#premium-plan), bulk editing applies to row updates from [Clipboard paste](/x/react-data-grid/clipboard/#clipboard-paste) automatically, since [Clipboard paste uses Editing API for persistence](/x/react-data-grid/clipboard/#persisting-pasted-data): + +{{"demo": "BulkEditingPremiumNoSnap.js", "bg": "inline", "defaultCodeOpen": false}} diff --git a/docs/data/data-grid/row-recipes/DetailPanelCollapseAll.tsx.preview b/docs/data/data-grid/row-recipes/DetailPanelCollapseAll.tsx.preview new file mode 100644 index 000000000000..d89161b50e8d --- /dev/null +++ b/docs/data/data-grid/row-recipes/DetailPanelCollapseAll.tsx.preview @@ -0,0 +1,6 @@ +<DataGridPro + rows={rows} + columns={columns} + getDetailPanelContent={getDetailPanelContent} + getDetailPanelHeight={getDetailPanelHeight} +/> \ No newline at end of file diff --git a/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.js b/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.js new file mode 100644 index 000000000000..cd48306cf1ba --- /dev/null +++ b/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.js @@ -0,0 +1,134 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import UnfoldLessIcon from '@mui/icons-material/UnfoldLess'; +import UnfoldMoreIcon from '@mui/icons-material/UnfoldMore'; +import { + DataGridPro, + useGridApiContext, + useGridSelector, + gridRowsLookupSelector, + gridDetailPanelExpandedRowIdsSelector, + gridDetailPanelExpandedRowsContentCacheSelector, + GRID_DETAIL_PANEL_TOGGLE_COL_DEF, +} from '@mui/x-data-grid-pro'; +import { + randomCreatedDate, + randomCurrency, + randomEmail, + randomPrice, +} from '@mui/x-data-grid-generator'; + +export default function DetailPanelExpandCollapseAll() { + const getDetailPanelContent = React.useCallback( + ({ row }) => <Box sx={{ p: 2 }}>{`Order #${row.id}`}</Box>, + [], + ); + + const getDetailPanelHeight = React.useCallback(() => 50, []); + + return ( + <div style={{ height: 400, width: '100%' }}> + <DataGridPro + rows={rows} + columns={columns} + getDetailPanelContent={getDetailPanelContent} + getDetailPanelHeight={getDetailPanelHeight} + /> + </div> + ); +} + +function CustomDetailPanelHeader() { + const apiRef = useGridApiContext(); + + const expandedRowIds = useGridSelector( + apiRef, + gridDetailPanelExpandedRowIdsSelector, + ); + const rowsWithDetailPanels = useGridSelector( + apiRef, + gridDetailPanelExpandedRowsContentCacheSelector, + ); + + const noDetailPanelsOpen = expandedRowIds.length === 0; + + const expandOrCollapseAll = () => { + const dataRowIdToModelLookup = gridRowsLookupSelector(apiRef); + const allRowIdsWithDetailPanels = Object.keys(rowsWithDetailPanels).map((key) => + apiRef.current.getRowId(dataRowIdToModelLookup[key]), + ); + + apiRef.current.setExpandedDetailPanels( + noDetailPanelsOpen ? allRowIdsWithDetailPanels : [], + ); + }; + + const Icon = noDetailPanelsOpen ? UnfoldMoreIcon : UnfoldLessIcon; + + return ( + <IconButton + size="small" + tabIndex={-1} + onClick={expandOrCollapseAll} + aria-label={noDetailPanelsOpen ? 'Expand All' : 'Collapse All'} + > + <Icon fontSize="inherit" /> + </IconButton> + ); +} + +const columns = [ + { + ...GRID_DETAIL_PANEL_TOGGLE_COL_DEF, + renderHeader: () => <CustomDetailPanelHeader />, + }, + { field: 'id', headerName: 'Order ID' }, + { field: 'customer', headerName: 'Customer', width: 200 }, + { field: 'date', type: 'date', headerName: 'Placed at' }, + { field: 'currency', headerName: 'Currency' }, + { field: 'total', type: 'number', headerName: 'Total' }, +]; + +const rows = [ + { + id: 1, + customer: 'Matheus', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 2, + customer: 'Olivier', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 3, + customer: 'Flavien', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 4, + customer: 'Danail', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 5, + customer: 'Alexandre', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, +]; diff --git a/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.tsx b/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.tsx new file mode 100644 index 000000000000..a85385042f8c --- /dev/null +++ b/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.tsx @@ -0,0 +1,138 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import UnfoldLessIcon from '@mui/icons-material/UnfoldLess'; +import UnfoldMoreIcon from '@mui/icons-material/UnfoldMore'; +import { + DataGridPro, + GridColDef, + GridRowsProp, + GridRowParams, + useGridApiContext, + useGridSelector, + gridRowsLookupSelector, + gridDetailPanelExpandedRowIdsSelector, + gridDetailPanelExpandedRowsContentCacheSelector, + GRID_DETAIL_PANEL_TOGGLE_COL_DEF, + GridRowId, +} from '@mui/x-data-grid-pro'; +import { + randomCreatedDate, + randomCurrency, + randomEmail, + randomPrice, +} from '@mui/x-data-grid-generator'; + +export default function DetailPanelExpandCollapseAll() { + const getDetailPanelContent = React.useCallback( + ({ row }: GridRowParams) => <Box sx={{ p: 2 }}>{`Order #${row.id}`}</Box>, + [], + ); + + const getDetailPanelHeight = React.useCallback(() => 50, []); + + return ( + <div style={{ height: 400, width: '100%' }}> + <DataGridPro + rows={rows} + columns={columns} + getDetailPanelContent={getDetailPanelContent} + getDetailPanelHeight={getDetailPanelHeight} + /> + </div> + ); +} + +function CustomDetailPanelHeader() { + const apiRef = useGridApiContext(); + + const expandedRowIds = useGridSelector( + apiRef, + gridDetailPanelExpandedRowIdsSelector, + ); + const rowsWithDetailPanels = useGridSelector( + apiRef, + gridDetailPanelExpandedRowsContentCacheSelector, + ); + + const noDetailPanelsOpen = expandedRowIds.length === 0; + + const expandOrCollapseAll = () => { + const dataRowIdToModelLookup = gridRowsLookupSelector(apiRef); + const allRowIdsWithDetailPanels: GridRowId[] = Object.keys( + rowsWithDetailPanels, + ).map((key) => apiRef.current.getRowId(dataRowIdToModelLookup[key])); + + apiRef.current.setExpandedDetailPanels( + noDetailPanelsOpen ? allRowIdsWithDetailPanels : [], + ); + }; + + const Icon = noDetailPanelsOpen ? UnfoldMoreIcon : UnfoldLessIcon; + + return ( + <IconButton + size="small" + tabIndex={-1} + onClick={expandOrCollapseAll} + aria-label={noDetailPanelsOpen ? 'Expand All' : 'Collapse All'} + > + <Icon fontSize="inherit" /> + </IconButton> + ); +} + +const columns: GridColDef[] = [ + { + ...GRID_DETAIL_PANEL_TOGGLE_COL_DEF, + renderHeader: () => <CustomDetailPanelHeader />, + }, + { field: 'id', headerName: 'Order ID' }, + { field: 'customer', headerName: 'Customer', width: 200 }, + { field: 'date', type: 'date', headerName: 'Placed at' }, + { field: 'currency', headerName: 'Currency' }, + { field: 'total', type: 'number', headerName: 'Total' }, +]; + +const rows: GridRowsProp = [ + { + id: 1, + customer: 'Matheus', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 2, + customer: 'Olivier', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 3, + customer: 'Flavien', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 4, + customer: 'Danail', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, + { + id: 5, + customer: 'Alexandre', + email: randomEmail(), + date: randomCreatedDate(), + currency: randomCurrency(), + total: randomPrice(1, 1000), + }, +]; diff --git a/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.tsx.preview b/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.tsx.preview new file mode 100644 index 000000000000..d89161b50e8d --- /dev/null +++ b/docs/data/data-grid/row-recipes/DetailPanelExpandCollapseAll.tsx.preview @@ -0,0 +1,6 @@ +<DataGridPro + rows={rows} + columns={columns} + getDetailPanelContent={getDetailPanelContent} + getDetailPanelHeight={getDetailPanelHeight} +/> \ No newline at end of file diff --git a/docs/data/data-grid/row-recipes/row-recipes.md b/docs/data/data-grid/row-recipes/row-recipes.md index b032a14754a4..6404572a316c 100644 --- a/docs/data/data-grid/row-recipes/row-recipes.md +++ b/docs/data/data-grid/row-recipes/row-recipes.md @@ -13,3 +13,15 @@ By default, the [Master detail <span class="plan-pro" />](/x/react-data-grid/mas However, you can [control the expanded detail panels](/x/react-data-grid/master-detail/#controlling-expanded-detail-panels) to have only one detail panel expanded at a time. {{"demo": "DetailPanelOneExpandedRow.js", "bg": "inline", "defaultCodeOpen": false}} + +## Expand or collapse all detail panels + +The following demo shows how to create a custom header element that expands or collapses all detail panels at once. + +Here's how it works: + +The custom header uses `gridRowsLookupSelector` to find all rows with a detail panel. +It checks the status of open panels using the [`useGridSelector` hook](/x/react-data-grid/state/#with-usegridselector) to access the grid's state. +When clicked, it uses [`setExpandedDetailPanels`](/x/api/data-grid/grid-api/#grid-api-prop-setExpandedDetailPanels) from the [Grid API](/x/react-data-grid/api-object/#how-to-use-the-api-object) to expand or collapse all detail panels. + +{{"demo": "DetailPanelExpandCollapseAll.js", "bg": "inline", "defaultCodeOpen": false}} diff --git a/docs/data/date-pickers/accessibility/accessibility.md b/docs/data/date-pickers/accessibility/accessibility.md new file mode 100644 index 000000000000..d71df6970323 --- /dev/null +++ b/docs/data/date-pickers/accessibility/accessibility.md @@ -0,0 +1,81 @@ +--- +productId: x-date-pickers +title: Date and Time Pickers - Accessibility +githubLabel: 'component: pickers' +packageName: '@mui/x-date-pickers' +--- + +# Accessibility + +<p class="description">The Date and Time Pickers have complete accessibility support, including built-in keyboard navigation that follows international standards.</p> + +## Guidelines + +Common conformance guidelines for accessibility include: + +- Globally accepted standard: [WCAG](https://www.w3.org/WAI/standards-guidelines/wcag/) +- US: + - [ADA](https://www.ada.gov/) - US Department of Justice + - [Section 508](https://www.section508.gov/) - US federal agencies +- Europe: [EAA](https://ec.europa.eu/social/main.jsp?catId=1202) (European Accessibility Act) + +WCAG 2.1 has three levels of conformance: A, AA, and AAA. +Level AA exceeds the basic criteria for accessibility and is a common target for most organizations, so this is what we aim to support. + +The WAI-ARIA Authoring Practices includes examples on [Date Picker Dialog](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepicker-dialog/) and [Date Picker Spin Button](https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/examples/datepicker-spinbuttons/) patterns, which provide valuable information on how to optimize the accessibility of these components. + +## Screen reader compatibility + +Date and Time Pickers use ARIA roles and robust focus management across the interactive elements to convey the necessary information to users, being optimized for use with assistive technologies. + +## Keyboard support + +The Date and Time Pickers consist of different associations of Field, Calendar, and Clock components. +Each of these components is designed to respond intuitively to keyboard interactions, providing extensive keyboard navigation support. + +### Fields + +The following table describes the keyboard support for all [field components](/x/react-date-pickers/fields/): + +| Keys | Description | +| --------------------------------------------------------------------: | :------------------------------------------- | +| <kbd class="key">Arrow Left</kbd>, <kbd class="key">Arrow Right</kbd> | Moves focus among date/time sections | +| <kbd class="key">Arrow Up</kbd> | Increases focused section value by 1 | +| <kbd class="key">Arrow Down</kbd> | Decreases focused section value section by 1 | +| <kbd class="key">Page Up</kbd> | Increases focused section value section by 5 | +| <kbd class="key">Page Down</kbd> | Decreases focused section value section by 5 | +| <kbd class="key">Home</kbd> | Sets focused section to the minimal value | +| <kbd class="key">End</kbd> | Sets focused section to the maximal value | + +### Date Calendar + +Among the [available view components](https://mui.com/x/react-date-pickers/date-calendar/#views), `day` is the only one that implements specific keyboard support: + +| Keys | Description | +| -------------------------------: | :-------------------------------------------------------------- | +| <kbd class="key">Page Up</kbd> | Moves calendar to next month, keeping focus on the same day | +| <kbd class="key">Page Down</kbd> | Moves calendar to previous month, keeping focus on the same day | +| <kbd class="key">Home</kbd> | Moves focus to the first day of the week | +| <kbd class="key">End</kbd> | Moves focus to the last day of the week | + +### Date Picker + +The [Date Picker](/x/react-date-pickers/date-picker/) combines the functionalities of the Date Field and Date Calendar components. + +Depending on which component is in focus, the Picker will provide the corresponding keyboard support, either from [Date Field](/x/react-date-pickers/accessibility/#fields) or [Date Calendar](/x/react-date-pickers/accessibility/#date-calendar). + +### Date Range Calendar + +The [Date Range Calendar](/x/react-date-pickers/date-range-calendar/) implements a similar keyboard support as the day view of the [Date Calendar](/x/react-date-pickers/accessibility/#date-calendar) component, with a difference on the navigation among the previous and next months that must be achieved using the arrows in the calendar header. + +| Keys | Description | +| --------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------ | +| <kbd class="key">Arrow Up</kbd>, <kbd class="key">Arrow Down</kbd>,<br> <kbd class="key">Arrow Left</kbd>, <kbd class="key">Arrow Right</kbd> | Moves focus among the available values | +| <kbd class="key">Page Up</kbd> | Moves focus to the last day of the month | +| <kbd class="key">Page Down</kbd> | Moves focus to the first day of the month | +| <kbd class="key">Home</kbd> | Moves focus to first day of the week within the current month | +| <kbd class="key">End</kbd> | Moves focus to last day of the week within the current month | + +### Date Range Picker + +When interacting with the keyboard, the [Date Range Picker](/x/react-date-pickers/date-range-picker/) keeps the focus on the Field component, thereby offering the same keyboard navigation support as the [Date Range Field](/x/react-date-pickers/accessibility/#fields), having the changes consistently updated on the calendar component. diff --git a/docs/data/date-pickers/custom-components/CalendarHeaderComponent.js b/docs/data/date-pickers/custom-components/CalendarHeaderComponent.js index b789f8a216ed..053d4fc857fc 100644 --- a/docs/data/date-pickers/custom-components/CalendarHeaderComponent.js +++ b/docs/data/date-pickers/custom-components/CalendarHeaderComponent.js @@ -56,7 +56,7 @@ function CustomCalendarHeader(props) { export default function CalendarHeaderComponent() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateCalendar']}> <DateCalendar slots={{ calendarHeader: CustomCalendarHeader }} /> </DemoContainer> </LocalizationProvider> diff --git a/docs/data/date-pickers/custom-components/CalendarHeaderComponent.tsx b/docs/data/date-pickers/custom-components/CalendarHeaderComponent.tsx index 9810d5f955c0..3cec6edb80b3 100644 --- a/docs/data/date-pickers/custom-components/CalendarHeaderComponent.tsx +++ b/docs/data/date-pickers/custom-components/CalendarHeaderComponent.tsx @@ -57,7 +57,7 @@ function CustomCalendarHeader(props: PickersCalendarHeaderProps<Dayjs>) { export default function CalendarHeaderComponent() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateCalendar']}> <DateCalendar slots={{ calendarHeader: CustomCalendarHeader }} /> </DemoContainer> </LocalizationProvider> diff --git a/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.js b/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.js index cfc533c919ec..40d660f131bc 100644 --- a/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.js +++ b/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.js @@ -7,7 +7,7 @@ import { DateCalendar } from '@mui/x-date-pickers/DateCalendar'; export default function CalendarHeaderComponentProps() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateCalendar']}> <DateCalendar slotProps={{ calendarHeader: { sx: { border: '1px red solid' } } }} /> diff --git a/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.tsx b/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.tsx index cfc533c919ec..40d660f131bc 100644 --- a/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.tsx +++ b/docs/data/date-pickers/custom-components/CalendarHeaderComponentProps.tsx @@ -7,7 +7,7 @@ import { DateCalendar } from '@mui/x-date-pickers/DateCalendar'; export default function CalendarHeaderComponentProps() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateCalendar']}> <DateCalendar slotProps={{ calendarHeader: { sx: { border: '1px red solid' } } }} /> diff --git a/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.js b/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.js index 9625c51e9622..905c7f807657 100644 --- a/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.js +++ b/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.js @@ -49,7 +49,7 @@ function CustomCalendarHeader(props) { export default function CalendarHeaderComponentRange() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateRangeCalendar']}> <DateRangeCalendar slots={{ calendarHeader: CustomCalendarHeader }} /> </DemoContainer> </LocalizationProvider> diff --git a/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.tsx b/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.tsx index 5ff5398aef2b..a7cda0e96c95 100644 --- a/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.tsx +++ b/docs/data/date-pickers/custom-components/CalendarHeaderComponentRange.tsx @@ -50,7 +50,7 @@ function CustomCalendarHeader(props: PickersRangeCalendarHeaderProps<Dayjs>) { export default function CalendarHeaderComponentRange() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateRangeCalendar']}> <DateRangeCalendar slots={{ calendarHeader: CustomCalendarHeader }} /> </DemoContainer> </LocalizationProvider> diff --git a/docs/data/date-pickers/custom-field/MaterialV7Field.js b/docs/data/date-pickers/custom-field/MaterialV7Field.js index f7c4f157b96a..07ba449750d6 100644 --- a/docs/data/date-pickers/custom-field/MaterialV7Field.js +++ b/docs/data/date-pickers/custom-field/MaterialV7Field.js @@ -8,7 +8,7 @@ import { DateField } from '@mui/x-date-pickers/DateField'; export default function MaterialV7Field() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DateField', 'DatePicker']}> + <DemoContainer components={['DatePicker', 'DateField']}> <DateField enableAccessibleFieldDOMStructure /> <DatePicker enableAccessibleFieldDOMStructure /> </DemoContainer> diff --git a/docs/data/date-pickers/custom-field/MaterialV7Field.tsx b/docs/data/date-pickers/custom-field/MaterialV7Field.tsx index f7c4f157b96a..07ba449750d6 100644 --- a/docs/data/date-pickers/custom-field/MaterialV7Field.tsx +++ b/docs/data/date-pickers/custom-field/MaterialV7Field.tsx @@ -8,7 +8,7 @@ import { DateField } from '@mui/x-date-pickers/DateField'; export default function MaterialV7Field() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DateField', 'DatePicker']}> + <DemoContainer components={['DatePicker', 'DateField']}> <DateField enableAccessibleFieldDOMStructure /> <DatePicker enableAccessibleFieldDOMStructure /> </DemoContainer> diff --git a/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.js b/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.js index bf53aa2044b7..e6b3ea511373 100644 --- a/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.js +++ b/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.js @@ -22,7 +22,7 @@ export default function AddWarningIconWhenInvalidRange() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateRangePicker']}> <DateRangePicker label="Picker with error icon" maxDate={dayjs('2022-04-19')} diff --git a/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.tsx b/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.tsx index d9fa4ffdfd78..5e49622b3c02 100644 --- a/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.tsx +++ b/docs/data/date-pickers/custom-opening-button/AddWarningIconWhenInvalidRange.tsx @@ -23,7 +23,7 @@ export default function AddWarningIconWhenInvalidRange() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['DatePicker']}> + <DemoContainer components={['DateRangePicker']}> <DateRangePicker label="Picker with error icon" maxDate={dayjs('2022-04-19')} diff --git a/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.js b/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.js index 558c3e2a0f67..26c4fad8c884 100644 --- a/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.js +++ b/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.js @@ -8,7 +8,7 @@ import { MobileTimePicker } from '@mui/x-date-pickers/MobileTimePicker'; export default function DateTimePickerOpenTo() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['MobileDateTimePicker', 'MobileDateTimePicker']}> + <DemoContainer components={['DateTimePicker', 'MobileTimePicker']}> <DateTimePicker label={'"year"'} openTo="year" /> <MobileTimePicker label={'"hours"'} openTo="hours" /> </DemoContainer> diff --git a/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.tsx b/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.tsx index 558c3e2a0f67..26c4fad8c884 100644 --- a/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.tsx +++ b/docs/data/date-pickers/date-time-picker/DateTimePickerOpenTo.tsx @@ -8,7 +8,7 @@ import { MobileTimePicker } from '@mui/x-date-pickers/MobileTimePicker'; export default function DateTimePickerOpenTo() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer components={['MobileDateTimePicker', 'MobileDateTimePicker']}> + <DemoContainer components={['DateTimePicker', 'MobileTimePicker']}> <DateTimePicker label={'"year"'} openTo="year" /> <MobileTimePicker label={'"hours"'} openTo="hours" /> </DemoContainer> diff --git a/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.js b/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.js index 47a04c7ad408..5c5f59d051f3 100644 --- a/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.js +++ b/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.js @@ -13,16 +13,16 @@ export default function ResponsiveDateTimeRangePickers() { <DemoContainer components={[ 'DateTimeRangePicker', - 'DateTimeRangePicker', - 'DateTimeRangePicker', + 'MobileDateTimeRangePicker', + 'DesktopDateTimeRangePicker', ]} > - <DemoItem label="Desktop variant" component="DateTimeRangePicker"> + <DemoItem label="Desktop variant" component="DesktopDateTimeRangePicker"> <DesktopDateTimeRangePicker defaultValue={[dayjs('2022-04-17T15:30'), dayjs('2022-04-21T18:30')]} /> </DemoItem> - <DemoItem label="Mobile variant" component="DateTimeRangePicker"> + <DemoItem label="Mobile variant" component="MobileDateTimeRangePicker"> <MobileDateTimeRangePicker defaultValue={[dayjs('2022-04-17T15:30'), dayjs('2022-04-21T18:30')]} /> diff --git a/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx b/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx index 47a04c7ad408..5c5f59d051f3 100644 --- a/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx +++ b/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx @@ -13,16 +13,16 @@ export default function ResponsiveDateTimeRangePickers() { <DemoContainer components={[ 'DateTimeRangePicker', - 'DateTimeRangePicker', - 'DateTimeRangePicker', + 'MobileDateTimeRangePicker', + 'DesktopDateTimeRangePicker', ]} > - <DemoItem label="Desktop variant" component="DateTimeRangePicker"> + <DemoItem label="Desktop variant" component="DesktopDateTimeRangePicker"> <DesktopDateTimeRangePicker defaultValue={[dayjs('2022-04-17T15:30'), dayjs('2022-04-21T18:30')]} /> </DemoItem> - <DemoItem label="Mobile variant" component="DateTimeRangePicker"> + <DemoItem label="Mobile variant" component="MobileDateTimeRangePicker"> <MobileDateTimeRangePicker defaultValue={[dayjs('2022-04-17T15:30'), dayjs('2022-04-21T18:30')]} /> diff --git a/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx.preview b/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx.preview index cdd8dc94f579..69b250b93926 100644 --- a/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx.preview +++ b/docs/data/date-pickers/date-time-range-picker/ResponsiveDateTimeRangePickers.tsx.preview @@ -1,9 +1,9 @@ -<DemoItem label="Desktop variant" component="DateTimeRangePicker"> +<DemoItem label="Desktop variant" component="DesktopDateTimeRangePicker"> <DesktopDateTimeRangePicker defaultValue={[dayjs('2022-04-17T15:30'), dayjs('2022-04-21T18:30')]} /> </DemoItem> -<DemoItem label="Mobile variant" component="DateTimeRangePicker"> +<DemoItem label="Mobile variant" component="MobileDateTimeRangePicker"> <MobileDateTimeRangePicker defaultValue={[dayjs('2022-04-17T15:30'), dayjs('2022-04-21T18:30')]} /> diff --git a/docs/data/date-pickers/digital-clock/DigitalClockAmPm.js b/docs/data/date-pickers/digital-clock/DigitalClockAmPm.js index e3194a1d2904..ff7a3781da8b 100644 --- a/docs/data/date-pickers/digital-clock/DigitalClockAmPm.js +++ b/docs/data/date-pickers/digital-clock/DigitalClockAmPm.js @@ -13,11 +13,11 @@ export default function DigitalClockAmPm() { <DemoContainer components={[ 'DigitalClock', - 'MultiSectionDigitalClock', 'DigitalClock', - 'MultiSectionDigitalClock', 'DigitalClock', 'MultiSectionDigitalClock', + 'MultiSectionDigitalClock', + 'MultiSectionDigitalClock', ]} > <DemoItem> diff --git a/docs/data/date-pickers/digital-clock/DigitalClockAmPm.tsx b/docs/data/date-pickers/digital-clock/DigitalClockAmPm.tsx index e3194a1d2904..ff7a3781da8b 100644 --- a/docs/data/date-pickers/digital-clock/DigitalClockAmPm.tsx +++ b/docs/data/date-pickers/digital-clock/DigitalClockAmPm.tsx @@ -13,11 +13,11 @@ export default function DigitalClockAmPm() { <DemoContainer components={[ 'DigitalClock', - 'MultiSectionDigitalClock', 'DigitalClock', - 'MultiSectionDigitalClock', 'DigitalClock', 'MultiSectionDigitalClock', + 'MultiSectionDigitalClock', + 'MultiSectionDigitalClock', ]} > <DemoItem> diff --git a/docs/data/date-pickers/faq/faq.md b/docs/data/date-pickers/faq/faq.md index 761a8e798b82..b3be2015f249 100644 --- a/docs/data/date-pickers/faq/faq.md +++ b/docs/data/date-pickers/faq/faq.md @@ -17,7 +17,7 @@ The `<DemoContainer />` is an internal component used together with the `<DemoIt This helps avoid the repeated use of layout components, such as `<Box />` or `<Stack />`, while keeping the code minimal and clear, and allowing readers to focus on what is important - the demo itself. -:::warn +:::warning You should never use these components in your application. ::: diff --git a/docs/data/date-pickers/localization/data.json b/docs/data/date-pickers/localization/data.json index 92307676e08c..c18fc5c7e895 100644 --- a/docs/data/date-pickers/localization/data.json +++ b/docs/data/date-pickers/localization/data.json @@ -67,7 +67,7 @@ "languageTag": "fi-FI", "importName": "fiFI", "localeName": "Finnish", - "missingKeysCount": 14, + "missingKeysCount": 0, "totalKeysCount": 50, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/x-date-pickers/src/locales/fiFI.ts" }, diff --git a/docs/data/date-pickers/time-picker/TimePickerViews.js b/docs/data/date-pickers/time-picker/TimePickerViews.js index 79a87958efa9..a741c116d95b 100644 --- a/docs/data/date-pickers/time-picker/TimePickerViews.js +++ b/docs/data/date-pickers/time-picker/TimePickerViews.js @@ -7,9 +7,7 @@ import { TimePicker } from '@mui/x-date-pickers/TimePicker'; export default function TimePickerViews() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer - components={['MobileTimePicker', 'MobileTimePicker', 'MobileTimePicker']} - > + <DemoContainer components={['TimePicker', 'TimePicker', 'TimePicker']}> <DemoItem label={'"hours", "minutes" and "seconds"'}> <TimePicker views={['hours', 'minutes', 'seconds']} /> </DemoItem> diff --git a/docs/data/date-pickers/time-picker/TimePickerViews.tsx b/docs/data/date-pickers/time-picker/TimePickerViews.tsx index 79a87958efa9..a741c116d95b 100644 --- a/docs/data/date-pickers/time-picker/TimePickerViews.tsx +++ b/docs/data/date-pickers/time-picker/TimePickerViews.tsx @@ -7,9 +7,7 @@ import { TimePicker } from '@mui/x-date-pickers/TimePicker'; export default function TimePickerViews() { return ( <LocalizationProvider dateAdapter={AdapterDayjs}> - <DemoContainer - components={['MobileTimePicker', 'MobileTimePicker', 'MobileTimePicker']} - > + <DemoContainer components={['TimePicker', 'TimePicker', 'TimePicker']}> <DemoItem label={'"hours", "minutes" and "seconds"'}> <TimePicker views={['hours', 'minutes', 'seconds']} /> </DemoItem> diff --git a/docs/data/date-pickers/timezone/timezone.md b/docs/data/date-pickers/timezone/timezone.md index fc1b7ecbd815..a095bfc9a124 100644 --- a/docs/data/date-pickers/timezone/timezone.md +++ b/docs/data/date-pickers/timezone/timezone.md @@ -190,7 +190,7 @@ Please check out the documentation of the [UTC and timezone on Luxon](https://mo You can then pass your UTC date to your picker: ```tsx -import { DateTime, Settings } from 'luxon'; +import { DateTime } from 'luxon'; import { AdapterLuxon } from '@mui/x-date-pickers/AdapterLuxon'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; @@ -240,7 +240,7 @@ Please check out the documentation of the [UTC and timezone on Luxon](https://mo You can then pass your date in the wanted timezone to your picker: ```tsx -import { DateTime, Settings } from 'luxon'; +import { DateTime } from 'luxon'; import { AdapterLuxon } from '@mui/x-date-pickers/AdapterLuxon'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; diff --git a/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.js b/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.js index 47f33fc7ebf4..c5b1ef190cd8 100644 --- a/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.js +++ b/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.js @@ -16,7 +16,7 @@ export default function DateTimeValidationMaxDateTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={todayAtNoon} maxDateTime={todayAt9AM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[todayAt9AM, todayAtNoon]} maxDateTime={todayAt9AM} diff --git a/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx b/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx index 47f33fc7ebf4..c5b1ef190cd8 100644 --- a/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx +++ b/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx @@ -16,7 +16,7 @@ export default function DateTimeValidationMaxDateTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={todayAtNoon} maxDateTime={todayAt9AM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[todayAt9AM, todayAtNoon]} maxDateTime={todayAt9AM} diff --git a/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx.preview b/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx.preview index d905b25a6830..91f1415ac0e4 100644 --- a/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx.preview +++ b/docs/data/date-pickers/validation/DateTimeValidationMaxDateTime.tsx.preview @@ -1,7 +1,7 @@ <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={todayAtNoon} maxDateTime={todayAt9AM} /> </DemoItem> -<DemoItem label="DateTimeRangePicker"> +<DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[todayAt9AM, todayAtNoon]} maxDateTime={todayAt9AM} diff --git a/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.js b/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.js index ab22f887fd6e..e779892dc100 100644 --- a/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.js +++ b/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.js @@ -16,7 +16,7 @@ export default function DateTimeValidationMinDateTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={todayAtNoon} minDateTime={todayAt3PM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[todayAtNoon, todayAt3PM]} minDateTime={todayAt3PM} diff --git a/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx b/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx index ab22f887fd6e..e779892dc100 100644 --- a/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx +++ b/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx @@ -16,7 +16,7 @@ export default function DateTimeValidationMinDateTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={todayAtNoon} minDateTime={todayAt3PM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[todayAtNoon, todayAt3PM]} minDateTime={todayAt3PM} diff --git a/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx.preview b/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx.preview index 2e9367f6d982..068a7a282dbb 100644 --- a/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx.preview +++ b/docs/data/date-pickers/validation/DateTimeValidationMinDateTime.tsx.preview @@ -1,7 +1,7 @@ <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={todayAtNoon} minDateTime={todayAt3PM} /> </DemoItem> -<DemoItem label="DateTimeRangePicker"> +<DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[todayAtNoon, todayAt3PM]} minDateTime={todayAt3PM} diff --git a/docs/data/date-pickers/validation/TimeValidationMaxTime.js b/docs/data/date-pickers/validation/TimeValidationMaxTime.js index 3f752b5990f2..22c41902a98d 100644 --- a/docs/data/date-pickers/validation/TimeValidationMaxTime.js +++ b/docs/data/date-pickers/validation/TimeValidationMaxTime.js @@ -22,7 +22,7 @@ export default function TimeValidationMaxTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={nineAM} maxTime={fiveAM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[fiveAM, nineAM]} maxTime={fiveAM} /> </DemoItem> </DemoContainer> diff --git a/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx b/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx index 3f752b5990f2..22c41902a98d 100644 --- a/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx +++ b/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx @@ -22,7 +22,7 @@ export default function TimeValidationMaxTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={nineAM} maxTime={fiveAM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[fiveAM, nineAM]} maxTime={fiveAM} /> </DemoItem> </DemoContainer> diff --git a/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx.preview b/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx.preview index 8d3a283e7005..0d935870d781 100644 --- a/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx.preview +++ b/docs/data/date-pickers/validation/TimeValidationMaxTime.tsx.preview @@ -4,6 +4,6 @@ <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={nineAM} maxTime={fiveAM} /> </DemoItem> -<DemoItem label="DateTimeRangePicker"> +<DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[fiveAM, nineAM]} maxTime={fiveAM} /> </DemoItem> \ No newline at end of file diff --git a/docs/data/date-pickers/validation/TimeValidationMinTime.js b/docs/data/date-pickers/validation/TimeValidationMinTime.js index 0aee08e2b5e4..0cf1f145417f 100644 --- a/docs/data/date-pickers/validation/TimeValidationMinTime.js +++ b/docs/data/date-pickers/validation/TimeValidationMinTime.js @@ -22,7 +22,7 @@ export default function TimeValidationMinTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={fiveAM} minTime={nineAM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[fiveAM, nineAM]} minTime={nineAM} /> </DemoItem> </DemoContainer> diff --git a/docs/data/date-pickers/validation/TimeValidationMinTime.tsx b/docs/data/date-pickers/validation/TimeValidationMinTime.tsx index 0aee08e2b5e4..0cf1f145417f 100644 --- a/docs/data/date-pickers/validation/TimeValidationMinTime.tsx +++ b/docs/data/date-pickers/validation/TimeValidationMinTime.tsx @@ -22,7 +22,7 @@ export default function TimeValidationMinTime() { <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={fiveAM} minTime={nineAM} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[fiveAM, nineAM]} minTime={nineAM} /> </DemoItem> </DemoContainer> diff --git a/docs/data/date-pickers/validation/TimeValidationMinTime.tsx.preview b/docs/data/date-pickers/validation/TimeValidationMinTime.tsx.preview index 7fe5ae4117de..b793829f7773 100644 --- a/docs/data/date-pickers/validation/TimeValidationMinTime.tsx.preview +++ b/docs/data/date-pickers/validation/TimeValidationMinTime.tsx.preview @@ -4,6 +4,6 @@ <DemoItem label="DateTimePicker"> <DateTimePicker defaultValue={fiveAM} minTime={nineAM} /> </DemoItem> -<DemoItem label="DateTimeRangePicker"> +<DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[fiveAM, nineAM]} minTime={nineAM} /> </DemoItem> \ No newline at end of file diff --git a/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.js b/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.js index cb03250b7f38..637802940b13 100644 --- a/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.js +++ b/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.js @@ -30,7 +30,7 @@ export default function TimeValidationShouldDisableTime() { shouldDisableTime={shouldDisableTime} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[defaultValue, defaultValue.add(30, 'minutes')]} shouldDisableTime={shouldDisableTime} diff --git a/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.tsx b/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.tsx index 1f737a728203..2af87819746b 100644 --- a/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.tsx +++ b/docs/data/date-pickers/validation/TimeValidationShouldDisableTime.tsx @@ -32,7 +32,7 @@ export default function TimeValidationShouldDisableTime() { shouldDisableTime={shouldDisableTime} /> </DemoItem> - <DemoItem label="DateTimeRangePicker"> + <DemoItem label="DateTimeRangePicker" component="DateTimeRangePicker"> <DateTimeRangePicker defaultValue={[defaultValue, defaultValue.add(30, 'minutes')]} shouldDisableTime={shouldDisableTime} diff --git a/docs/data/introduction/installation/installation.md b/docs/data/introduction/installation/installation.md index 2b47b9ea9802..96c4400e2d50 100644 --- a/docs/data/introduction/installation/installation.md +++ b/docs/data/introduction/installation/installation.md @@ -11,6 +11,6 @@ MUI X components have a peer dependency on `@mui/material`: the installation [i ## Components -Note that you only need to install the packages corresponding to the components you're using—for example Data Grid users don't need to install the Date and Time Pickers. +Note that you only need to install the packages corresponding to the components you're using—for example Data Grid users don't need to install the Date and Time Pickers. {{"component": "modules/components/InstallationGrid.js"}} diff --git a/docs/data/introduction/support/support.md b/docs/data/introduction/support/support.md index 1a9028d4a321..387e733d621f 100644 --- a/docs/data/introduction/support/support.md +++ b/docs/data/introduction/support/support.md @@ -106,7 +106,7 @@ This includes issues introduced by external sources, like browser upgrades or ch ### Social media -The MUI X community is active on both [X/Twitter](https://twitter.com/MUI_hq) and [LinkedIn](https://www.linkedin.com/company/mui/). +The MUI X community is active on both [X/Twitter](https://x.com/MUI_hq) and [LinkedIn](https://www.linkedin.com/company/mui/). These are great platforms to share what you're working on and connect with other developers. ### Discord diff --git a/docs/data/pages.ts b/docs/data/pages.ts index 0845d9528869..b9b9e91b240e 100644 --- a/docs/data/pages.ts +++ b/docs/data/pages.ts @@ -51,7 +51,7 @@ const pages: MuiPage[] = [ { pathname: '/x/react-data-grid/row-definition' }, { pathname: '/x/react-data-grid/row-updates' }, { pathname: '/x/react-data-grid/row-height' }, - { pathname: '/x/react-data-grid/row-spanning', title: 'Row spanning', planned: true }, + { pathname: '/x/react-data-grid/row-spanning', planned: true }, { pathname: '/x/react-data-grid/master-detail', plan: 'pro' }, { pathname: '/x/react-data-grid/row-ordering', plan: 'pro' }, { pathname: '/x/react-data-grid/row-pinning', plan: 'pro' }, @@ -108,13 +108,8 @@ const pages: MuiPage[] = [ children: [ { pathname: '/x/react-data-grid/tree-data', plan: 'pro' }, { pathname: '/x/react-data-grid/row-grouping', plan: 'premium' }, - { pathname: '/x/react-data-grid/aggregation', title: 'Aggregation', plan: 'premium' }, - { - pathname: '/x/react-data-grid/pivoting', - title: 'Pivoting', - plan: 'premium', - planned: true, - }, + { pathname: '/x/react-data-grid/aggregation', plan: 'premium' }, + { pathname: '/x/react-data-grid/pivoting', plan: 'premium', planned: true }, ], }, { @@ -125,38 +120,28 @@ const pages: MuiPage[] = [ { pathname: '/x/react-data-grid/server-side-data', title: 'Overview', planned: true }, { pathname: '/x/react-data-grid/server-side-data/lazy-loading', - title: 'Lazy loading', plan: 'pro', planned: true, }, { pathname: '/x/react-data-grid/server-side-data/infinite-loading', - title: 'Infinite loading', - plan: 'pro', - planned: true, - }, - { - pathname: '/x/react-data-grid/server-side-data/tree-data', - title: 'Tree data', plan: 'pro', planned: true, }, + { pathname: '/x/react-data-grid/server-side-data/tree-data', plan: 'pro', planned: true }, { pathname: '/x/react-data-grid/server-side-data/row-grouping', - title: 'Row grouping', plan: 'pro', planned: true, }, { pathname: '/x/react-data-grid/server-side-data/aggregation', - title: 'Aggregation', plan: 'premium', planned: true, }, ], }, { - title: 'Advanced', pathname: '/x/react-data-grid/advanced', children: [ { pathname: '/x/react-data-grid/api-object', title: 'API object' }, @@ -165,7 +150,6 @@ const pages: MuiPage[] = [ ], }, { - title: 'Recipes', pathname: '/x/react-data-grid/recipes', children: [ { pathname: '/x/react-data-grid/recipes-editing', title: 'Editing' }, @@ -245,6 +229,7 @@ const pages: MuiPage[] = [ { pathname: '/x/react-date-pickers', title: 'Overview' }, { pathname: '/x/react-date-pickers/getting-started' }, { pathname: '/x/react-date-pickers/base-concepts' }, + { pathname: '/x/react-date-pickers/accessibility' }, { pathname: '/x/react-date-pickers/faq', title: 'FAQ' }, { pathname: '/x/react-date-pickers-components', @@ -312,7 +297,8 @@ const pages: MuiPage[] = [ children: [ { pathname: '/x/react-date-pickers/time-range-picker', - title: 'Time Range Picker 🚧', + title: 'Time Range Picker', + planned: true, }, { pathname: '/x/react-date-pickers/time-range-field', @@ -436,18 +422,18 @@ const pages: MuiPage[] = [ pathname: '/x/react-charts/sparkline', title: 'Sparkline', }, - { pathname: '/x/react-charts/gauge', title: 'Gauge' }, + { pathname: '/x/react-charts/gauge' }, { pathname: '/x/react-charts/common-features', subheader: 'Common features', children: [ - { pathname: '/x/react-charts/axis', title: 'Axis' }, + { pathname: '/x/react-charts/axis' }, { pathname: '/x/react-charts/components', title: 'Custom components' }, - { pathname: '/x/react-charts/composition', title: 'Composition' }, - { pathname: '/x/react-charts/label', title: 'Label' }, - { pathname: '/x/react-charts/legend', title: 'Legend' }, - { pathname: '/x/react-charts/stacking', title: 'Stacking' }, - { pathname: '/x/react-charts/styling', title: 'Styling' }, + { pathname: '/x/react-charts/composition' }, + { pathname: '/x/react-charts/label' }, + { pathname: '/x/react-charts/legend' }, + { pathname: '/x/react-charts/stacking' }, + { pathname: '/x/react-charts/styling' }, { pathname: '/x/react-charts/tooltip', title: 'Tooltip & Highlights' }, ], }, @@ -473,7 +459,7 @@ const pages: MuiPage[] = [ pathname: '/x/react-charts-future', subheader: 'Future components', children: [ - { pathname: '/x/react-charts/radar', title: 'Radar', planned: true }, + { pathname: '/x/react-charts/radar', planned: true }, { pathname: '/x/react-charts/tree-map', title: 'Treemap', planned: true }, { pathname: '/x/react-charts/heat-map', @@ -481,9 +467,9 @@ const pages: MuiPage[] = [ plan: 'pro', planned: true, }, - { pathname: '/x/react-charts/funnel', title: 'Funnel', plan: 'pro', planned: true }, - { pathname: '/x/react-charts/sankey', title: 'Sankey', plan: 'pro', planned: true }, - { pathname: '/x/react-charts/gantt', title: 'Gantt', plan: 'pro', planned: true }, + { pathname: '/x/react-charts/funnel', plan: 'pro', planned: true }, + { pathname: '/x/react-charts/sankey', plan: 'pro', planned: true }, + { pathname: '/x/react-charts/gantt', plan: 'pro', planned: true }, ], }, ], @@ -497,7 +483,6 @@ const pages: MuiPage[] = [ children: [ { pathname: '/x/react-tree-view', title: 'Overview' }, { pathname: '/x/react-tree-view/getting-started' }, - { pathname: '/x/react-tree-view/accessibility' }, { pathname: '/x/react-tree-view/simple-tree-view', subheader: 'Simple Tree View', @@ -520,6 +505,14 @@ const pages: MuiPage[] = [ { pathname: '/x/react-tree-view/rich-tree-view/focus' }, ], }, + { + pathname: '/x/react-tree-view/common-features', + subheader: 'Common features', + children: [ + { pathname: '/x/react-tree-view/accessibility' }, + { pathname: '/x/react-tree-view/tree-item-customization', title: 'Item customization' }, + ], + }, { pathname: '/x/api/tree-view-group', title: 'API Reference', diff --git a/docs/data/tree-view/accessibility/accessibility.md b/docs/data/tree-view/accessibility/accessibility.md index 7f53c06af65c..9c0b466412f0 100644 --- a/docs/data/tree-view/accessibility/accessibility.md +++ b/docs/data/tree-view/accessibility/accessibility.md @@ -12,7 +12,7 @@ packageName: '@mui/x-tree-view' ## Guidelines -The most commonly encountered conformance guidelines for accessibility are: +Common conformance guidelines for accessibility include: - Globally accepted standard: [WCAG](https://www.w3.org/WAI/standards-guidelines/wcag/) - US: @@ -21,18 +21,22 @@ The most commonly encountered conformance guidelines for accessibility are: - Europe: [EAA](https://ec.europa.eu/social/main.jsp?catId=1202) (European Accessibility Act) WCAG 2.1 has three levels of conformance: A, AA, and AAA. -Level AA meets the most commonly encountered conformance guidelines. -This is the most common target for organizations, so we aim to support it very well. +Level AA exceeds the basic criteria for accessibility and is a common target for most organizations, so this is what we aim to support. The [WAI-ARIA Authoring Practices](https://www.w3.org/WAI/ARIA/apg/patterns/treeview/) provide valuable information on how to optimize the accessibility of a Tree View. ## Keyboard interactions :::info -The following key assignments apply to Windows and Linux users. +The key assignments in the table below apply to Windows and Linux users. On macOS replace <kbd class="key">Ctrl</kbd> with <kbd class="key">⌘ Command</kbd>. +Some devices may lack certain keys, requiring the use of key combinations. In this case, replace: + +- <kbd class="key">Home</kbd> with <kbd class="key">Fn</kbd>+<kbd class="key">Arrow Left</kbd> +- <kbd class="key">End</kbd> with <kbd class="key">Fn</kbd>+<kbd class="key">Arrow Right</kbd> + ::: | Keys | Description | @@ -61,6 +65,11 @@ When a single-select tree receives focus: - If none of the items are selected when the tree receives focus, focus is set on the first item. - If an item is selected before the tree receives focus, focus is set on the selected item. +| Keys | Description | +| ---------------------------: | :----------------------------------------------------------- | +| <kbd class="key">Space</kbd> | Selects the focused item. | +| <kbd class="key">Enter</kbd> | Selects the focused item if the item does not have children. | + ### On multi-select trees When a multi-select tree receives focus: diff --git a/docs/data/tree-view/getting-started/FirstComponent.js b/docs/data/tree-view/getting-started/FirstComponent.js index f5b1eb6a7691..1daadc188de2 100644 --- a/docs/data/tree-view/getting-started/FirstComponent.js +++ b/docs/data/tree-view/getting-started/FirstComponent.js @@ -1,22 +1,28 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function FirstComponent() { return ( - <SimpleTreeView - aria-label="file system navigator" - sx={{ height: 200, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} - > - <TreeItem itemId="1" label="Applications"> - <TreeItem itemId="2" label="Calendar" /> - </TreeItem> - <TreeItem itemId="5" label="Documents"> - <TreeItem itemId="10" label="OSS" /> - <TreeItem itemId="6" label="MUI"> - <TreeItem itemId="8" label="index.js" /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView> + <TreeItem itemId="grid" label="Data Grid"> + <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <TreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <TreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> </TreeItem> - </TreeItem> - </SimpleTreeView> + <TreeItem itemId="pickers" label="Date and Time Pickers"> + <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/getting-started/FirstComponent.tsx b/docs/data/tree-view/getting-started/FirstComponent.tsx index f5b1eb6a7691..1daadc188de2 100644 --- a/docs/data/tree-view/getting-started/FirstComponent.tsx +++ b/docs/data/tree-view/getting-started/FirstComponent.tsx @@ -1,22 +1,28 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function FirstComponent() { return ( - <SimpleTreeView - aria-label="file system navigator" - sx={{ height: 200, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} - > - <TreeItem itemId="1" label="Applications"> - <TreeItem itemId="2" label="Calendar" /> - </TreeItem> - <TreeItem itemId="5" label="Documents"> - <TreeItem itemId="10" label="OSS" /> - <TreeItem itemId="6" label="MUI"> - <TreeItem itemId="8" label="index.js" /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView> + <TreeItem itemId="grid" label="Data Grid"> + <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <TreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <TreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> </TreeItem> - </TreeItem> - </SimpleTreeView> + <TreeItem itemId="pickers" label="Date and Time Pickers"> + <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/getting-started/FirstComponent.tsx.preview b/docs/data/tree-view/getting-started/FirstComponent.tsx.preview deleted file mode 100644 index 8228e866c065..000000000000 --- a/docs/data/tree-view/getting-started/FirstComponent.tsx.preview +++ /dev/null @@ -1,14 +0,0 @@ -<SimpleTreeView - aria-label="file system navigator" - sx={{ height: 200, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} -> - <TreeItem itemId="1" label="Applications"> - <TreeItem itemId="2" label="Calendar" /> - </TreeItem> - <TreeItem itemId="5" label="Documents"> - <TreeItem itemId="10" label="OSS" /> - <TreeItem itemId="6" label="MUI"> - <TreeItem itemId="8" label="index.js" /> - </TreeItem> - </TreeItem> -</SimpleTreeView> \ No newline at end of file diff --git a/docs/data/tree-view/overview/BasicRichTreeView.js b/docs/data/tree-view/overview/BasicRichTreeView.js index 6891094201b0..7bb6d22d66dd 100644 --- a/docs/data/tree-view/overview/BasicRichTreeView.js +++ b/docs/data/tree-view/overview/BasicRichTreeView.js @@ -21,11 +21,21 @@ const MUI_X_PRODUCTS = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; export default function BasicRichTreeView() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/overview/BasicRichTreeView.tsx b/docs/data/tree-view/overview/BasicRichTreeView.tsx index 5f89f65503c3..e18e3bfcc070 100644 --- a/docs/data/tree-view/overview/BasicRichTreeView.tsx +++ b/docs/data/tree-view/overview/BasicRichTreeView.tsx @@ -21,11 +21,21 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; export default function BasicRichTreeView() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/overview/BasicSimpleTreeView.js b/docs/data/tree-view/overview/BasicSimpleTreeView.js index 5757cfb2964e..a1d3763587f3 100644 --- a/docs/data/tree-view/overview/BasicSimpleTreeView.js +++ b/docs/data/tree-view/overview/BasicSimpleTreeView.js @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function BasicSimpleTreeView() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -16,6 +16,12 @@ export default function BasicSimpleTreeView() { <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> </SimpleTreeView> </Box> ); diff --git a/docs/data/tree-view/overview/BasicSimpleTreeView.tsx b/docs/data/tree-view/overview/BasicSimpleTreeView.tsx index 5757cfb2964e..a1d3763587f3 100644 --- a/docs/data/tree-view/overview/BasicSimpleTreeView.tsx +++ b/docs/data/tree-view/overview/BasicSimpleTreeView.tsx @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function BasicSimpleTreeView() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -16,6 +16,12 @@ export default function BasicSimpleTreeView() { <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> </SimpleTreeView> </Box> ); diff --git a/docs/data/tree-view/overview/BasicSimpleTreeView.tsx.preview b/docs/data/tree-view/overview/BasicSimpleTreeView.tsx.preview deleted file mode 100644 index 3641f9443f57..000000000000 --- a/docs/data/tree-view/overview/BasicSimpleTreeView.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ -<SimpleTreeView> - <TreeItem itemId="grid" label="Data Grid"> - <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> - <TreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> - <TreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> - </TreeItem> - <TreeItem itemId="pickers" label="Date and Time Pickers"> - <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> - <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> - </TreeItem> -</SimpleTreeView> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.js b/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.js index 53d9edc89c93..7941d92b58e5 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.js +++ b/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.js @@ -1,37 +1,39 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import Collapse from '@mui/material/Collapse'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { useSpring, animated } from '@react-spring/web'; -const ITEMS = [ +const MUI_X_PRODUCTS = [ { - id: '1', - label: 'Main', + id: 'grid', + label: 'Data Grid', children: [ - { id: '2', label: 'Hello' }, - { - id: '3', - label: 'Subtree with children', - children: [ - { id: '6', label: 'Hello' }, - { - id: '7', - label: 'Sub-subtree with children', - children: [ - { id: '9', label: 'Child 1' }, - { id: '10', label: 'Child 2' }, - { id: '11', label: 'Child 3' }, - ], - }, - { id: '8', label: 'Hello' }, - ], - }, - { id: '4', label: 'World' }, - { id: '5', label: 'Something something' }, + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, ], }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; function TransitionComponent(props) { @@ -51,12 +53,12 @@ function TransitionComponent(props) { export default function CustomAnimation() { return ( - <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - slotProps={{ item: { slots: { groupTransition: TransitionComponent } } }} - items={ITEMS} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + defaultExpandedItems={['grid']} + slotProps={{ item: { slots: { groupTransition: TransitionComponent } } }} + items={MUI_X_PRODUCTS} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx b/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx index c0f7dc541b51..234b4b656bd9 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx @@ -1,37 +1,39 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import Collapse from '@mui/material/Collapse'; import { TransitionProps } from '@mui/material/transitions'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeViewBaseItem } from '@mui/x-tree-view/models'; import { useSpring, animated } from '@react-spring/web'; -const ITEMS: TreeViewBaseItem[] = [ +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { - id: '1', - label: 'Main', + id: 'grid', + label: 'Data Grid', children: [ - { id: '2', label: 'Hello' }, - { - id: '3', - label: 'Subtree with children', - children: [ - { id: '6', label: 'Hello' }, - { - id: '7', - label: 'Sub-subtree with children', - children: [ - { id: '9', label: 'Child 1' }, - { id: '10', label: 'Child 2' }, - { id: '11', label: 'Child 3' }, - ], - }, - { id: '8', label: 'Hello' }, - ], - }, - { id: '4', label: 'World' }, - { id: '5', label: 'Something something' }, + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, ], }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; function TransitionComponent(props: TransitionProps) { @@ -51,12 +53,12 @@ function TransitionComponent(props: TransitionProps) { export default function CustomAnimation() { return ( - <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - slotProps={{ item: { slots: { groupTransition: TransitionComponent } } }} - items={ITEMS} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + defaultExpandedItems={['grid']} + slotProps={{ item: { slots: { groupTransition: TransitionComponent } } }} + items={MUI_X_PRODUCTS} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx.preview index 56ad322fe2d0..0e834c371ea1 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/CustomAnimation.tsx.preview @@ -1,7 +1,5 @@ <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} + defaultExpandedItems={['grid']} slotProps={{ item: { slots: { groupTransition: TransitionComponent } } }} - items={ITEMS} + items={MUI_X_PRODUCTS} /> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomIcons.js b/docs/data/tree-view/rich-tree-view/customization/CustomIcons.js index 9b6787b5c825..ddafd6e850a0 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomIcons.js +++ b/docs/data/tree-view/rich-tree-view/customization/CustomIcons.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import AddBoxIcon from '@mui/icons-material/AddBox'; import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox'; import SvgIcon from '@mui/material/SvgIcon'; @@ -6,33 +7,34 @@ import { styled } from '@mui/material/styles'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem'; -const ITEMS = [ +const MUI_X_PRODUCTS = [ { - id: '1', - label: 'Main', + id: 'grid', + label: 'Data Grid', children: [ - { id: '2', label: 'Hello' }, - { - id: '3', - label: 'Subtree with children', - children: [ - { id: '6', label: 'Hello' }, - { - id: '7', - label: 'Sub-subtree with children', - children: [ - { id: '9', label: 'Child 1' }, - { id: '10', label: 'Child 2' }, - { id: '11', label: 'Child 3' }, - ], - }, - { id: '8', label: 'Hello' }, - ], - }, - { id: '4', label: 'World' }, - { id: '5', label: 'Something something' }, + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, ], }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const CustomTreeItem = styled(TreeItem)({ @@ -59,17 +61,17 @@ function CloseSquare(props) { export default function CustomIcons() { return ( - <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - slots={{ - expandIcon: AddBoxIcon, - collapseIcon: IndeterminateCheckBoxIcon, - endIcon: CloseSquare, - item: CustomTreeItem, - }} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - items={ITEMS} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + defaultExpandedItems={['grid']} + slots={{ + expandIcon: AddBoxIcon, + collapseIcon: IndeterminateCheckBoxIcon, + endIcon: CloseSquare, + item: CustomTreeItem, + }} + items={MUI_X_PRODUCTS} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx b/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx index 8fe4f628f2ce..b22872ffde54 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import AddBoxIcon from '@mui/icons-material/AddBox'; import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox'; import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon'; @@ -7,33 +8,34 @@ import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem'; import { TreeViewBaseItem } from '@mui/x-tree-view/models'; -const ITEMS: TreeViewBaseItem[] = [ +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { - id: '1', - label: 'Main', + id: 'grid', + label: 'Data Grid', children: [ - { id: '2', label: 'Hello' }, - { - id: '3', - label: 'Subtree with children', - children: [ - { id: '6', label: 'Hello' }, - { - id: '7', - label: 'Sub-subtree with children', - children: [ - { id: '9', label: 'Child 1' }, - { id: '10', label: 'Child 2' }, - { id: '11', label: 'Child 3' }, - ], - }, - { id: '8', label: 'Hello' }, - ], - }, - { id: '4', label: 'World' }, - { id: '5', label: 'Something something' }, + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, ], }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const CustomTreeItem = styled(TreeItem)({ @@ -60,17 +62,17 @@ function CloseSquare(props: SvgIconProps) { export default function CustomIcons() { return ( - <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - slots={{ - expandIcon: AddBoxIcon, - collapseIcon: IndeterminateCheckBoxIcon, - endIcon: CloseSquare, - item: CustomTreeItem, - }} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - items={ITEMS} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + defaultExpandedItems={['grid']} + slots={{ + expandIcon: AddBoxIcon, + collapseIcon: IndeterminateCheckBoxIcon, + endIcon: CloseSquare, + item: CustomTreeItem, + }} + items={MUI_X_PRODUCTS} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx.preview index 209560af6131..688a706a7f54 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/CustomIcons.tsx.preview @@ -1,12 +1,10 @@ <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} + defaultExpandedItems={['grid']} slots={{ expandIcon: AddBoxIcon, collapseIcon: IndeterminateCheckBoxIcon, endIcon: CloseSquare, item: CustomTreeItem, }} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - items={ITEMS} + items={MUI_X_PRODUCTS} /> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomStyling.js b/docs/data/tree-view/rich-tree-view/customization/CustomStyling.js index 255f2ec67c29..9f943fa5f554 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomStyling.js +++ b/docs/data/tree-view/rich-tree-view/customization/CustomStyling.js @@ -1,38 +1,40 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { styled, alpha } from '@mui/material/styles'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem'; -const ITEMS = [ +const MUI_X_PRODUCTS = [ { - id: '1', - label: 'Main', + id: 'grid', + label: 'Data Grid', children: [ - { id: '2', label: 'Hello' }, - { - id: '3', - label: 'Subtree with children', - children: [ - { id: '6', label: 'Hello' }, - { - id: '7', - label: 'Sub-subtree with children', - children: [ - { id: '9', label: 'Child 1' }, - { id: '10', label: 'Child 2' }, - { id: '11', label: 'Child 3' }, - ], - }, - { id: '8', label: 'Hello' }, - ], - }, - { id: '4', label: 'World' }, - { id: '5', label: 'Something something' }, + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, ], }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; -const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ +const CustomTreeItem = styled(TreeItem)(({ theme }) => ({ color: theme.palette.mode === 'light' ? theme.palette.grey[800] @@ -64,12 +66,12 @@ const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ export default function CustomStyling() { return ( - <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - slots={{ item: StyledTreeItem }} - items={ITEMS} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + defaultExpandedItems={['grid']} + slots={{ item: CustomTreeItem }} + items={MUI_X_PRODUCTS} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx b/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx index ab3760093459..dd1a123cb753 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx @@ -1,39 +1,41 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { styled, alpha } from '@mui/material/styles'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem'; import { TreeViewBaseItem } from '@mui/x-tree-view/models'; -const ITEMS: TreeViewBaseItem[] = [ +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { - id: '1', - label: 'Main', + id: 'grid', + label: 'Data Grid', children: [ - { id: '2', label: 'Hello' }, - { - id: '3', - label: 'Subtree with children', - children: [ - { id: '6', label: 'Hello' }, - { - id: '7', - label: 'Sub-subtree with children', - children: [ - { id: '9', label: 'Child 1' }, - { id: '10', label: 'Child 2' }, - { id: '11', label: 'Child 3' }, - ], - }, - { id: '8', label: 'Hello' }, - ], - }, - { id: '4', label: 'World' }, - { id: '5', label: 'Something something' }, + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, ], }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; -const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ +const CustomTreeItem = styled(TreeItem)(({ theme }) => ({ color: theme.palette.mode === 'light' ? theme.palette.grey[800] @@ -66,12 +68,12 @@ const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ export default function CustomStyling() { return ( - <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - slots={{ item: StyledTreeItem }} - items={ITEMS} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + defaultExpandedItems={['grid']} + slots={{ item: CustomTreeItem }} + items={MUI_X_PRODUCTS} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx.preview index 3aef020f6665..d2d3246c76fb 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/CustomStyling.tsx.preview @@ -1,7 +1,5 @@ <RichTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - slots={{ item: StyledTreeItem }} - items={ITEMS} + defaultExpandedItems={['grid']} + slots={{ item: CustomTreeItem }} + items={MUI_X_PRODUCTS} /> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/customization/FileExplorer.js b/docs/data/tree-view/rich-tree-view/customization/FileExplorer.js index 78192d2b26c2..ee988f862845 100644 --- a/docs/data/tree-view/rich-tree-view/customization/FileExplorer.js +++ b/docs/data/tree-view/rich-tree-view/customization/FileExplorer.js @@ -97,9 +97,6 @@ const CustomTreeItemContent = styled(TreeItem2Content)(({ theme }) => ({ padding: theme.spacing(0.5), paddingRight: theme.spacing(1), fontWeight: 500, - [`& .${treeItemClasses.iconContainer}`]: { - marginRight: theme.spacing(2), - }, [`&.Mui-expanded `]: { '&:not(.Mui-focused, .Mui-selected, .Mui-selected.Mui-focused) .labelIcon': { color: @@ -259,7 +256,6 @@ export default function FileExplorer() { return ( <RichTreeView items={ITEMS} - aria-label="file explorer" defaultExpandedItems={['1', '1.1']} defaultSelectedItems="1.1" sx={{ height: 'fit-content', flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} diff --git a/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx b/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx index ef5e8e5384ab..3bee383e9d96 100644 --- a/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx @@ -115,9 +115,6 @@ const CustomTreeItemContent = styled(TreeItem2Content)(({ theme }) => ({ padding: theme.spacing(0.5), paddingRight: theme.spacing(1), fontWeight: 500, - [`& .${treeItemClasses.iconContainer}`]: { - marginRight: theme.spacing(2), - }, [`&.Mui-expanded `]: { '&:not(.Mui-focused, .Mui-selected, .Mui-selected.Mui-focused) .labelIcon': { color: @@ -295,7 +292,6 @@ export default function FileExplorer() { return ( <RichTreeView items={ITEMS} - aria-label="file explorer" defaultExpandedItems={['1', '1.1']} defaultSelectedItems="1.1" sx={{ height: 'fit-content', flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} diff --git a/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx.preview index 5f87458bdbbe..9efaa97d6eb4 100644 --- a/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/FileExplorer.tsx.preview @@ -1,6 +1,5 @@ <RichTreeView items={ITEMS} - aria-label="file explorer" defaultExpandedItems={['1', '1.1']} defaultSelectedItems="1.1" sx={{ height: 'fit-content', flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.js b/docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.js similarity index 93% rename from docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.js rename to docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.js index 24ddeb962f48..e3915dd7caba 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.js +++ b/docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.js @@ -81,12 +81,10 @@ const CustomTreeItem = React.forwardRef(function CustomTreeItem(props, ref) { ); }); -export default function CustomContentTreeView() { +export default function HeadlessAPI() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> + <Box sx={{ minHeight: 200, minWidth: 250 }}> <RichTreeView - aria-label="icon expansion" - sx={{ position: 'relative' }} defaultExpandedItems={['3']} items={ITEMS} slots={{ item: CustomTreeItem }} diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.tsx b/docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx similarity index 93% rename from docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.tsx rename to docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx index 0caea393d697..8d0929895b2c 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx @@ -91,12 +91,10 @@ const CustomTreeItem = React.forwardRef(function CustomTreeItem( ); }); -export default function CustomContentTreeView() { +export default function HeadlessAPI() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> + <Box sx={{ minHeight: 200, minWidth: 250 }}> <RichTreeView - aria-label="icon expansion" - sx={{ position: 'relative' }} defaultExpandedItems={['3']} items={ITEMS} slots={{ item: CustomTreeItem }} diff --git a/docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx.preview similarity index 61% rename from docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.tsx.preview rename to docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx.preview index e37df6849fe2..58e2294ec29d 100644 --- a/docs/data/tree-view/rich-tree-view/customization/CustomContentTreeView.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/HeadlessAPI.tsx.preview @@ -1,6 +1,4 @@ <RichTreeView - aria-label="icon expansion" - sx={{ position: 'relative' }} defaultExpandedItems={['3']} items={ITEMS} slots={{ item: CustomTreeItem }} diff --git a/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.js b/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.js index 0a57a4123f6a..fa2935769a63 100644 --- a/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.js +++ b/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.js @@ -5,24 +5,34 @@ import { useTreeItem2Utils } from '@mui/x-tree-view/hooks'; import { TreeItem2 } from '@mui/x-tree-view/TreeItem2'; -const ITEMS = [ +const MUI_X_PRODUCTS = [ { - id: '1', - label: 'Applications', - children: [{ id: '2', label: 'Calendar' }], + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], }, { - id: '3', - label: 'Documents', + id: 'pickers', + label: 'Date and Time Pickers', children: [ - { id: '6', label: 'OSS' }, - { - id: '4', - label: 'MUI', - children: [{ id: '5', label: 'index.js' }], - }, + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const CustomTreeItem = React.forwardRef(function MyTreeItem(props, ref) { @@ -54,12 +64,8 @@ const CustomTreeItem = React.forwardRef(function MyTreeItem(props, ref) { export default function IconExpansionTreeView() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> - <RichTreeView - aria-label="icon expansion" - items={ITEMS} - slots={{ item: CustomTreeItem }} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView items={MUI_X_PRODUCTS} slots={{ item: CustomTreeItem }} /> </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx b/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx index 37f6f43aa73a..0d7345a1047d 100644 --- a/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx @@ -6,24 +6,34 @@ import { UseTreeItem2ContentSlotOwnProps } from '@mui/x-tree-view/useTreeItem2'; import { TreeItem2, TreeItem2Props } from '@mui/x-tree-view/TreeItem2'; import { TreeViewBaseItem } from '@mui/x-tree-view/models'; -const ITEMS: TreeViewBaseItem[] = [ +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { - id: '1', - label: 'Applications', - children: [{ id: '2', label: 'Calendar' }], + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], }, { - id: '3', - label: 'Documents', + id: 'pickers', + label: 'Date and Time Pickers', children: [ - { id: '6', label: 'OSS' }, - { - id: '4', - label: 'MUI', - children: [{ id: '5', label: 'index.js' }], - }, + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const CustomTreeItem = React.forwardRef(function MyTreeItem( @@ -58,12 +68,8 @@ const CustomTreeItem = React.forwardRef(function MyTreeItem( export default function IconExpansionTreeView() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> - <RichTreeView - aria-label="icon expansion" - items={ITEMS} - slots={{ item: CustomTreeItem }} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView items={MUI_X_PRODUCTS} slots={{ item: CustomTreeItem }} /> </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx.preview index ea2163196d7a..660542f7bf2c 100644 --- a/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/IconExpansionTreeView.tsx.preview @@ -1,5 +1 @@ -<RichTreeView - aria-label="icon expansion" - items={ITEMS} - slots={{ item: CustomTreeItem }} -/> \ No newline at end of file +<RichTreeView items={MUI_X_PRODUCTS} slots={{ item: CustomTreeItem }} /> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.js b/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.js index 0261e5154c82..d6c415bbbe42 100644 --- a/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.js +++ b/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeItem2 } from '@mui/x-tree-view/TreeItem2'; @@ -20,6 +21,16 @@ const MUI_X_PRODUCTS = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const CustomTreeItem = React.forwardRef((props, ref) => ( @@ -36,12 +47,12 @@ const CustomTreeItem = React.forwardRef((props, ref) => ( export default function LabelSlotProps() { return ( - <RichTreeView - items={MUI_X_PRODUCTS} - aria-label="customized" - defaultExpandedItems={['pickers']} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} - slots={{ item: CustomTreeItem }} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + defaultExpandedItems={['grid']} + slots={{ item: CustomTreeItem }} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx b/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx index 99f29c8d5d29..a94af1fab5af 100644 --- a/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeItem2, TreeItem2Props } from '@mui/x-tree-view/TreeItem2'; import { TreeViewBaseItem } from '@mui/x-tree-view/models'; @@ -21,6 +22,16 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const CustomTreeItem = React.forwardRef( @@ -39,12 +50,12 @@ const CustomTreeItem = React.forwardRef( export default function LabelSlotProps() { return ( - <RichTreeView - items={MUI_X_PRODUCTS} - aria-label="customized" - defaultExpandedItems={['pickers']} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} - slots={{ item: CustomTreeItem }} - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + defaultExpandedItems={['grid']} + slots={{ item: CustomTreeItem }} + /> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx.preview index 511debc05ff2..fafc88534a22 100644 --- a/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/LabelSlotProps.tsx.preview @@ -1,7 +1,5 @@ <RichTreeView items={MUI_X_PRODUCTS} - aria-label="customized" - defaultExpandedItems={['pickers']} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} + defaultExpandedItems={['grid']} slots={{ item: CustomTreeItem }} /> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/customization/LabelSlots.js b/docs/data/tree-view/rich-tree-view/customization/LabelSlots.js index 52402c34a18b..acddadac792c 100644 --- a/docs/data/tree-view/rich-tree-view/customization/LabelSlots.js +++ b/docs/data/tree-view/rich-tree-view/customization/LabelSlots.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { TreeItem2, TreeItem2Label } from '@mui/x-tree-view/TreeItem2'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; @@ -114,6 +115,16 @@ const DEFAULT_MUI_X_PRODUCTS = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const DEFAULT_EXPANDED_ITEMS = ['pickers']; @@ -143,14 +154,15 @@ export default function LabelSlots() { ); return ( - <TreeItemContext.Provider value={context}> - <RichTreeView - items={products} - aria-label="customized" - defaultExpandedItems={DEFAULT_EXPANDED_ITEMS} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} - slots={{ item: CustomTreeItem }} - /> - </TreeItemContext.Provider> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <TreeItemContext.Provider value={context}> + <RichTreeView + items={products} + aria-label="customized" + defaultExpandedItems={DEFAULT_EXPANDED_ITEMS} + slots={{ item: CustomTreeItem }} + /> + </TreeItemContext.Provider> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx b/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx index e4975c392a44..a833704682aa 100644 --- a/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx +++ b/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { TreeItem2, TreeItem2Label, @@ -131,6 +132,16 @@ const DEFAULT_MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const DEFAULT_EXPANDED_ITEMS = ['pickers']; @@ -160,14 +171,15 @@ export default function LabelSlots() { ); return ( - <TreeItemContext.Provider value={context}> - <RichTreeView - items={products} - aria-label="customized" - defaultExpandedItems={DEFAULT_EXPANDED_ITEMS} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} - slots={{ item: CustomTreeItem }} - /> - </TreeItemContext.Provider> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <TreeItemContext.Provider value={context}> + <RichTreeView + items={products} + aria-label="customized" + defaultExpandedItems={DEFAULT_EXPANDED_ITEMS} + slots={{ item: CustomTreeItem }} + /> + </TreeItemContext.Provider> + </Box> ); } diff --git a/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx.preview b/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx.preview index 36cf606d1cb1..7ba0ef733a39 100644 --- a/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/customization/LabelSlots.tsx.preview @@ -3,7 +3,6 @@ items={products} aria-label="customized" defaultExpandedItems={DEFAULT_EXPANDED_ITEMS} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} slots={{ item: CustomTreeItem }} /> </TreeItemContext.Provider> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/customization/customization.md b/docs/data/tree-view/rich-tree-view/customization/customization.md index da4b3e57a2cc..8f1552b6f0df 100644 --- a/docs/data/tree-view/rich-tree-view/customization/customization.md +++ b/docs/data/tree-view/rich-tree-view/customization/customization.md @@ -51,7 +51,7 @@ The demo below shows how to pass an `id` attribute to the Tree Item label: {{"demo": "LabelSlotProps.js", "defaultCodeOpen": false }} The `slots` prop allows you to replace the default label with your own component: -The demo below shows how to add a tooltip on the Tree Item label: +The demo below shows how to add a basic edition feature on the Tree Item label: {{"demo": "LabelSlots.js", "defaultCodeOpen": false}} @@ -60,7 +60,7 @@ The demo below shows how to add a tooltip on the Tree Item label: Use the `useTreeItem2` hook to create your own component. The demo below shows how to add an avatar and custom typography elements. -{{"demo": "CustomContentTreeView.js", "defaultCodeOpen": false}} +{{"demo": "HeadlessAPI.js", "defaultCodeOpen": false}} ## Common examples diff --git a/docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.js b/docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.js similarity index 74% rename from docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.js rename to docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.js index 044944e3dadc..403f4f30d65a 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.js +++ b/docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.js @@ -24,9 +24,19 @@ const MUI_X_PRODUCTS = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; -export default function ChangeItemExpansion() { +export default function ApiMethodSetItemExpansion() { const apiRef = useTreeViewApiRef(); const handleExpandClick = (event) => { @@ -38,14 +48,14 @@ export default function ChangeItemExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Stack sx={{ mb: 1 }} spacing={2} direction="row"> + <Stack spacing={2}> + <Stack spacing={2} direction="row"> <Button onClick={handleExpandClick}>Expand Data Grid</Button> <Button onClick={handleCollapseClick}>Collapse Data Grid</Button> </Stack> - <Box sx={{ minHeight: 220, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} apiRef={apiRef} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.tsx b/docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx similarity index 76% rename from docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.tsx rename to docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx index 91587ed8df71..f0788877de8d 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.tsx +++ b/docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx @@ -24,9 +24,19 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; -export default function ChangeItemExpansion() { +export default function ApiMethodSetItemExpansion() { const apiRef = useTreeViewApiRef(); const handleExpandClick = (event: React.MouseEvent) => { @@ -38,14 +48,14 @@ export default function ChangeItemExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Stack sx={{ mb: 1 }} spacing={2} direction="row"> + <Stack spacing={2}> + <Stack spacing={2} direction="row"> <Button onClick={handleExpandClick}>Expand Data Grid</Button> <Button onClick={handleCollapseClick}>Collapse Data Grid</Button> </Stack> - <Box sx={{ minHeight: 220, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} apiRef={apiRef} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.tsx.preview b/docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx.preview similarity index 68% rename from docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.tsx.preview rename to docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx.preview index ca89ea196b8b..d07881acb938 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/ChangeItemExpansion.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/expansion/ApiMethodSetItemExpansion.tsx.preview @@ -1,7 +1,7 @@ -<Stack sx={{ mb: 1 }} spacing={2} direction="row"> +<Stack spacing={2} direction="row"> <Button onClick={handleExpandClick}>Expand Data Grid</Button> <Button onClick={handleCollapseClick}>Collapse Data Grid</Button> </Stack> -<Box sx={{ minHeight: 220, flexGrow: 1 }}> +<Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} apiRef={apiRef} /> </Box> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.js b/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.js index bcc49a4c33c4..4a18499fcc8e 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.js +++ b/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.js @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; @@ -61,19 +62,19 @@ export default function ControlledExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleExpandClick}> {expandedItems.length === 0 ? 'Expand all' : 'Collapse all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} expandedItems={expandedItems} onExpandedItemsChange={handleExpandedItemsChange} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx b/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx index 83d826091478..44009d3868d1 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx +++ b/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeViewBaseItem, TreeViewItemId } from '@mui/x-tree-view/models'; @@ -65,19 +66,19 @@ export default function ControlledExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleExpandClick}> {expandedItems.length === 0 ? 'Expand all' : 'Collapse all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} expandedItems={expandedItems} onExpandedItemsChange={handleExpandedItemsChange} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx.preview b/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx.preview index 8a83ec46e541..de405a604311 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/expansion/ControlledExpansion.tsx.preview @@ -1,9 +1,9 @@ -<Box sx={{ mb: 1 }}> +<div> <Button onClick={handleExpandClick}> {expandedItems.length === 0 ? 'Expand all' : 'Collapse all'} </Button> -</Box> -<Box sx={{ minHeight: 200, flexGrow: 1 }}> +</div> +<Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} expandedItems={expandedItems} diff --git a/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.js b/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.js index 22ab08e87b2a..ad135b68d7fa 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.js +++ b/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.js @@ -52,7 +52,7 @@ export default function TrackItemExpansionToggle() { </Typography> )} - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} onItemExpansionToggle={handleItemExpansionToggle} diff --git a/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx b/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx index 987bb9b2f674..51f806149b21 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx +++ b/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx @@ -58,7 +58,7 @@ export default function TrackItemExpansionToggle() { Last action: {action.isExpanded ? 'expand' : 'collapse'} {action.itemId} </Typography> )} - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} onItemExpansionToggle={handleItemExpansionToggle} diff --git a/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx.preview b/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx.preview index 81762cedbdb4..e58c7c00526b 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/expansion/TrackItemExpansionToggle.tsx.preview @@ -5,7 +5,7 @@ Last action: {action.isExpanded ? 'expand' : 'collapse'} {action.itemId} </Typography> )} -<Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> +<Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} onItemExpansionToggle={handleItemExpansionToggle} diff --git a/docs/data/tree-view/rich-tree-view/expansion/expansion.md b/docs/data/tree-view/rich-tree-view/expansion/expansion.md index a44e1e07bdfb..e36fe65d20c1 100644 --- a/docs/data/tree-view/rich-tree-view/expansion/expansion.md +++ b/docs/data/tree-view/rich-tree-view/expansion/expansion.md @@ -33,8 +33,34 @@ Use the `onItemExpansionToggle` prop if you want to react to an item expansion c {{"demo": "TrackItemExpansionToggle.js"}} -## Change item expansion +## Imperative API -You can use the `setItemExpansion` API method to imperatively change the expansion of an item: +:::success +To use the `apiRef` object, you need to initialize it using the `useTreeViewApiRef` hook as follows: -{{"demo": "ChangeItemExpansion.js"}} +```tsx +const apiRef = useTreeViewApiRef(); + +return <RichTreeView apiRef={apiRef} items={ITEMS}>; +``` + +When your component first renders, `apiRef` will be `undefined`. +After this initial render, `apiRef` holds methods to interact imperatively with the Tree View. +::: + +### Change an item expansion + +Use the `setItemExpansion` API method to change the expansion of an item. + +```ts +apiRef.current.setItemExpansion( + // The DOM event that triggered the change + event, + // The ID of the item to expand or collapse + itemId, + // `true` if the item should be expanded, `false` if it should be collapsed + isExpanded, +); +``` + +{{"demo": "ApiMethodSetItemExpansion.js"}} diff --git a/docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.js b/docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.js similarity index 86% rename from docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.js rename to docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.js index c2a96bffdf47..21edd6b04eac 100644 --- a/docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.js +++ b/docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.js @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; @@ -35,20 +36,20 @@ const MUI_X_PRODUCTS = [ }, ]; -export default function FocusedRichTreeView() { +export default function ApiMethodFocusItem() { const apiRef = useTreeViewApiRef(); const handleButtonClick = (event) => { apiRef.current?.focusItem(event, 'pickers'); }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleButtonClick}>Focus pickers item</Button> - </Box> - <Box sx={{ height: 264, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} apiRef={apiRef} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.tsx b/docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx similarity index 87% rename from docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.tsx rename to docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx index 04b1aad4d11c..22732137d9ff 100644 --- a/docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.tsx +++ b/docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeViewBaseItem } from '@mui/x-tree-view/models'; @@ -35,20 +36,20 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ }, ]; -export default function FocusedRichTreeView() { +export default function ApiMethodFocusItem() { const apiRef = useTreeViewApiRef(); const handleButtonClick = (event: React.SyntheticEvent) => { apiRef.current?.focusItem(event, 'pickers'); }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleButtonClick}>Focus pickers item</Button> - </Box> - <Box sx={{ height: 264, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} apiRef={apiRef} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.tsx.preview b/docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx.preview similarity index 65% rename from docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.tsx.preview rename to docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx.preview index 144d8e4e8dd5..d1343eb1f83d 100644 --- a/docs/data/tree-view/rich-tree-view/focus/FocusedRichTreeView.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/focus/ApiMethodFocusItem.tsx.preview @@ -1,6 +1,6 @@ -<Box sx={{ mb: 1 }}> +<div> <Button onClick={handleButtonClick}>Focus pickers item</Button> -</Box> -<Box sx={{ height: 264, flexGrow: 1 }}> +</div> +<Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} apiRef={apiRef} /> </Box> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/focus/focus.md b/docs/data/tree-view/rich-tree-view/focus/focus.md index 4fa127cea557..7451953dac48 100644 --- a/docs/data/tree-view/rich-tree-view/focus/focus.md +++ b/docs/data/tree-view/rich-tree-view/focus/focus.md @@ -11,10 +11,7 @@ waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/ <p class="description">Learn how to focus Tree View items.</p> -## Focus a specific item - -You can use the the `apiRef.focusItem` method to focus a specific item. -This methods receives two parameters: `event` and `itemId`. +## Imperative API :::success To use the `apiRef` object, you need to initialize it using the `useTreeViewApiRef` hook as follows: @@ -25,12 +22,26 @@ const apiRef = useTreeViewApiRef(); return <RichTreeView apiRef={apiRef} items={ITEMS}>; ``` -`apiRef` will be undefined during the first render and will then contain methods allowing you to imperatively interact with the Tree View. +When your component first renders, `apiRef` will be `undefined`. +After this initial render, `apiRef` holds methods to interact imperatively with the Tree View. ::: +### Focus a specific item + +Use the `focusItem` API method to focus a specific item. + +```ts +apiRef.current.focusItem( + // The DOM event that triggered the change + event, + // The ID of the item to focus + itemId, +); +``` + :::info This method only works with items that are currently visible. Calling `apiRef.focusItem` on an item whose parent is collapsed will do nothing. ::: -{{"demo": "FocusedRichTreeView.js"}} +{{"demo": "ApiMethodFocusItem.js"}} diff --git a/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.js b/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.js index 33cca94e5ef0..59a5bffe36ab 100644 --- a/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.js +++ b/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.js @@ -1,6 +1,7 @@ import * as React from 'react'; import { useThemeProps } from '@mui/material/styles'; import { useSlotProps } from '@mui/base/utils'; +import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; @@ -76,20 +77,34 @@ function TreeView(inProps) { ); } -const ITEMS = [ +const MUI_X_PRODUCTS = [ { - id: '1', - label: 'Applications', - children: [{ id: '2', label: 'Calendar' }], + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], }, { - id: '5', - label: 'Documents', + id: 'pickers', + label: 'Date and Time Pickers', children: [ - { id: '10', label: 'OSS' }, - { id: '6', label: 'MUI', children: [{ id: '8', label: 'index.js' }] }, + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; export default function LogExpandedItems() { @@ -97,17 +112,17 @@ export default function LogExpandedItems() { return ( <Stack spacing={2}> - <TreeView - aria-label="file system navigator" - sx={{ height: 240, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} - items={ITEMS} - areLogsEnabled - logMessage={(message) => - setLogs((prev) => - prev[prev.length - 1] === message ? prev : [...prev, message], - ) - } - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <TreeView + items={MUI_X_PRODUCTS} + areLogsEnabled + logMessage={(message) => + setLogs((prev) => + prev[prev.length - 1] === message ? prev : [...prev, message], + ) + } + /> + </Box> <Stack spacing={1}> {logs.map((log, index) => ( <Typography key={index}>{log}</Typography> diff --git a/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx b/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx index 25a1912754d3..c1a70f335c0e 100644 --- a/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx +++ b/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { useThemeProps } from '@mui/material/styles'; import { useSlotProps } from '@mui/base/utils'; +import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import { TreeViewBaseItem } from '@mui/x-tree-view/models'; @@ -20,6 +21,7 @@ import { extractPluginParamsFromProps, useTreeView, TreeViewProvider, + ConvertPluginsIntoSignatures, } from '@mui/x-tree-view/internals'; interface TreeViewLogExpandedParameters { @@ -87,7 +89,7 @@ function TreeView<R extends {}, Multiple extends boolean | undefined>( const ownerState = themeProps as TreeViewProps<any, any>; const { pluginParams, otherProps } = extractPluginParamsFromProps< - typeof TREE_VIEW_PLUGINS, + ConvertPluginsIntoSignatures<typeof TREE_VIEW_PLUGINS>, DefaultTreeViewPluginSlots, DefaultTreeViewPluginSlotProps, TreeViewProps<R, Multiple> @@ -128,20 +130,34 @@ function TreeView<R extends {}, Multiple extends boolean | undefined>( ); } -const ITEMS: TreeViewBaseItem[] = [ +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { - id: '1', - label: 'Applications', - children: [{ id: '2', label: 'Calendar' }], + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], }, { - id: '5', - label: 'Documents', + id: 'pickers', + label: 'Date and Time Pickers', children: [ - { id: '10', label: 'OSS' }, - { id: '6', label: 'MUI', children: [{ id: '8', label: 'index.js' }] }, + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; export default function LogExpandedItems() { @@ -149,17 +165,17 @@ export default function LogExpandedItems() { return ( <Stack spacing={2}> - <TreeView - aria-label="file system navigator" - sx={{ height: 240, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} - items={ITEMS} - areLogsEnabled - logMessage={(message) => - setLogs((prev) => - prev[prev.length - 1] === message ? prev : [...prev, message], - ) - } - /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <TreeView + items={MUI_X_PRODUCTS} + areLogsEnabled + logMessage={(message) => + setLogs((prev) => + prev[prev.length - 1] === message ? prev : [...prev, message], + ) + } + /> + </Box> <Stack spacing={1}> {logs.map((log, index) => ( <Typography key={index}>{log}</Typography> diff --git a/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx.preview b/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx.preview index a70558fcbb12..32cf7d009edc 100644 --- a/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/headless/LogExpandedItems.tsx.preview @@ -1,14 +1,14 @@ -<TreeView - aria-label="file system navigator" - sx={{ height: 240, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }} - items={ITEMS} - areLogsEnabled - logMessage={(message) => - setLogs((prev) => - prev[prev.length - 1] === message ? prev : [...prev, message], - ) - } -/> +<Box sx={{ minHeight: 352, minWidth: 250 }}> + <TreeView + items={MUI_X_PRODUCTS} + areLogsEnabled + logMessage={(message) => + setLogs((prev) => + prev[prev.length - 1] === message ? prev : [...prev, message], + ) + } + /> +</Box> <Stack spacing={1}> {logs.map((log, index) => ( <Typography key={index}>{log}</Typography> diff --git a/docs/data/tree-view/rich-tree-view/headless/headless.md b/docs/data/tree-view/rich-tree-view/headless/headless.md index a258a6e6b524..86ca7bfccbc5 100644 --- a/docs/data/tree-view/rich-tree-view/headless/headless.md +++ b/docs/data/tree-view/rich-tree-view/headless/headless.md @@ -43,7 +43,7 @@ A custom plugins contains 2 required elements: ### Params default value -You can use the `getDefaultizedParams` property to set a default value to your plugin params: +Use the `getDefaultizedParams` property to set a default value to your plugin params: ```ts const useCustomPlugin = ({ params }) => { @@ -203,7 +203,7 @@ If you are using TypeScript, you need to define your dependencies in your plugin ### Pass props to your root element -You can use the `getRootProps` property of your returned value to pass props to your root element: +Use the `getRootProps` property of your returned value to pass props to your root element: ```ts const useCustomPlugin = ({ params }) => { @@ -217,7 +217,7 @@ const useCustomPlugin = ({ params }) => { ### Pass elements to the Tree Item -You can use the `contextValue` property in the returned object to pass elements to the Tree Item: +Use the `contextValue` property in the returned object to pass elements to the Tree Item: :::warning The context is private for now and cannot be accessed outside the provided plugins. @@ -237,7 +237,7 @@ function useTreeItemState(itemId: string) { const { customPlugin, // ...other elements returned by the context - } = useTreeViewContext<DefaultTreeViewPlugins>(); + } = useTreeViewContext<DefaultTreeViewPluginSignatures>(); // ...rest of the `useTreeItemState` hook content diff --git a/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.js b/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.js new file mode 100644 index 000000000000..088f827593f0 --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.js @@ -0,0 +1,66 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; + +import { useTreeViewApiRef } from '@mui/x-tree-view/hooks'; + +const MUI_X_PRODUCTS = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function ApiMethodGetItem() { + const apiRef = useTreeViewApiRef(); + const [selectedItem, setSelectedItem] = React.useState(null); + + const handleSelectedItemsChange = (event, itemId) => { + if (itemId == null) { + setSelectedItem(null); + } else { + setSelectedItem(apiRef.current.getItem(itemId)); + } + }; + + return ( + <Stack spacing={2}> + <Typography sx={{ minWidth: 300 }}> + Selected item: {selectedItem == null ? 'none' : selectedItem.label} + </Typography> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + apiRef={apiRef} + selectedItems={selectedItem?.id ?? null} + onSelectedItemsChange={handleSelectedItemsChange} + /> + </Box> + </Stack> + ); +} diff --git a/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.tsx b/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.tsx new file mode 100644 index 000000000000..94679340fad7 --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.tsx @@ -0,0 +1,71 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; +import { TreeViewBaseItem } from '@mui/x-tree-view/models'; +import { useTreeViewApiRef } from '@mui/x-tree-view/hooks'; + +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function ApiMethodGetItem() { + const apiRef = useTreeViewApiRef(); + const [selectedItem, setSelectedItem] = React.useState<TreeViewBaseItem | null>( + null, + ); + + const handleSelectedItemsChange = ( + event: React.SyntheticEvent, + itemId: string | null, + ) => { + if (itemId == null) { + setSelectedItem(null); + } else { + setSelectedItem(apiRef.current!.getItem(itemId)); + } + }; + + return ( + <Stack spacing={2}> + <Typography sx={{ minWidth: 300 }}> + Selected item: {selectedItem == null ? 'none' : selectedItem.label} + </Typography> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + apiRef={apiRef} + selectedItems={selectedItem?.id ?? null} + onSelectedItemsChange={handleSelectedItemsChange} + /> + </Box> + </Stack> + ); +} diff --git a/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.tsx.preview b/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.tsx.preview new file mode 100644 index 000000000000..8e43259ee708 --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/items/ApiMethodGetItem.tsx.preview @@ -0,0 +1,11 @@ +<Typography sx={{ minWidth: 300 }}> + Selected item: {selectedItem == null ? 'none' : selectedItem.label} +</Typography> +<Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + apiRef={apiRef} + selectedItems={selectedItem?.id ?? null} + onSelectedItemsChange={handleSelectedItemsChange} + /> +</Box> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.js b/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.js index 1758169287e6..7bb6d22d66dd 100644 --- a/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.js +++ b/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.js @@ -21,11 +21,21 @@ const MUI_X_PRODUCTS = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; export default function BasicRichTreeView() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.tsx b/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.tsx index 12357940fd8b..e18e3bfcc070 100644 --- a/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.tsx +++ b/docs/data/tree-view/rich-tree-view/items/BasicRichTreeView.tsx @@ -21,11 +21,21 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; export default function BasicRichTreeView() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.js b/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.js index 01d3c61bd5f5..250b4943b825 100644 --- a/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.js +++ b/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; import Switch from '@mui/material/Switch'; import FormControlLabel from '@mui/material/FormControlLabel'; @@ -26,21 +27,13 @@ const MUI_X_PRODUCTS = [ { id: 'charts', label: 'Charts', - children: [{ id: 'charts-community', label: '@mui/x-charts' }], + children: [{ id: 'charts-community', label: '@mui/x-charts', disabled: true }], }, { id: 'tree-view', label: 'Tree View', - children: [ - { id: 'tree-view-community', label: '@mui/x-tree-view' }, - { id: 'tree-view-pro', label: '@mui/x-tree-view-pro', disabled: true }, - ], - }, - { - id: 'scheduler', - label: 'Scheduler', disabled: true, - children: [{ id: 'scheduler-community', label: '@mui/x-scheduler' }], + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], }, ]; @@ -53,26 +46,24 @@ export default function DisabledItemsFocusable() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> - <FormControlLabel - control={ - <Switch - checked={disabledItemsFocusable} - onChange={handleToggle} - name="disabledItemsFocusable" - /> - } - label="Allow focusing disabled items" - /> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Stack spacing={2}> + <FormControlLabel + control={ + <Switch + checked={disabledItemsFocusable} + onChange={handleToggle} + name="disabledItemsFocusable" + /> + } + label="Allow focusing disabled items" + /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} isItemDisabled={isItemDisabled} disabledItemsFocusable={disabledItemsFocusable} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.tsx b/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.tsx index 47525b38aedd..967e820febde 100644 --- a/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.tsx +++ b/docs/data/tree-view/rich-tree-view/items/DisabledItemsFocusable.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; import Switch from '@mui/material/Switch'; import FormControlLabel from '@mui/material/FormControlLabel'; @@ -32,21 +33,13 @@ const MUI_X_PRODUCTS: MuiXProduct[] = [ { id: 'charts', label: 'Charts', - children: [{ id: 'charts-community', label: '@mui/x-charts' }], + children: [{ id: 'charts-community', label: '@mui/x-charts', disabled: true }], }, { id: 'tree-view', label: 'Tree View', - children: [ - { id: 'tree-view-community', label: '@mui/x-tree-view' }, - { id: 'tree-view-pro', label: '@mui/x-tree-view-pro', disabled: true }, - ], - }, - { - id: 'scheduler', - label: 'Scheduler', disabled: true, - children: [{ id: 'scheduler-community', label: '@mui/x-scheduler' }], + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], }, ]; @@ -59,26 +52,24 @@ export default function DisabledItemsFocusable() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> - <FormControlLabel - control={ - <Switch - checked={disabledItemsFocusable} - onChange={handleToggle} - name="disabledItemsFocusable" - /> - } - label="Allow focusing disabled items" - /> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Stack spacing={2}> + <FormControlLabel + control={ + <Switch + checked={disabledItemsFocusable} + onChange={handleToggle} + name="disabledItemsFocusable" + /> + } + label="Allow focusing disabled items" + /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} isItemDisabled={isItemDisabled} disabledItemsFocusable={disabledItemsFocusable} /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.js b/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.js index 07994b675ecb..07a64c0e72ad 100644 --- a/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.js +++ b/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.js @@ -24,21 +24,13 @@ const MUI_X_PRODUCTS = [ { id: 'charts', label: 'Charts', - children: [{ id: 'charts-community', label: '@mui/x-charts' }], + children: [{ id: 'charts-community', label: '@mui/x-charts', disabled: true }], }, { id: 'tree-view', label: 'Tree View', - children: [ - { id: 'tree-view-community', label: '@mui/x-tree-view' }, - { id: 'tree-view-pro', label: '@mui/x-tree-view-pro', disabled: true }, - ], - }, - { - id: 'scheduler', - label: 'Scheduler', disabled: true, - children: [{ id: 'scheduler-community', label: '@mui/x-scheduler' }], + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], }, ]; @@ -46,7 +38,7 @@ const isItemDisabled = (item) => !!item.disabled; export default function DisabledPropItem() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} isItemDisabled={isItemDisabled} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.tsx b/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.tsx index 5d5b0a2a9c62..bdff28a6ddfb 100644 --- a/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.tsx +++ b/docs/data/tree-view/rich-tree-view/items/DisabledPropItem.tsx @@ -30,21 +30,13 @@ const MUI_X_PRODUCTS: MuiXProduct[] = [ { id: 'charts', label: 'Charts', - children: [{ id: 'charts-community', label: '@mui/x-charts' }], + children: [{ id: 'charts-community', label: '@mui/x-charts', disabled: true }], }, { id: 'tree-view', label: 'Tree View', - children: [ - { id: 'tree-view-community', label: '@mui/x-tree-view' }, - { id: 'tree-view-pro', label: '@mui/x-tree-view-pro', disabled: true }, - ], - }, - { - id: 'scheduler', - label: 'Scheduler', disabled: true, - children: [{ id: 'scheduler-community', label: '@mui/x-scheduler' }], + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], }, ]; @@ -52,7 +44,7 @@ const isItemDisabled = (item: MuiXProduct) => !!item.disabled; export default function DisabledPropItem() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} isItemDisabled={isItemDisabled} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/GetItemId.js b/docs/data/tree-view/rich-tree-view/items/GetItemId.js index 72a50eaeb7e6..10dc7537fa37 100644 --- a/docs/data/tree-view/rich-tree-view/items/GetItemId.js +++ b/docs/data/tree-view/rich-tree-view/items/GetItemId.js @@ -21,13 +21,23 @@ const MUI_X_PRODUCTS = [ { internalId: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + internalId: 'charts', + label: 'Charts', + children: [{ internalId: 'charts-community', label: '@mui/x-charts' }], + }, + { + internalId: 'tree-view', + label: 'Tree View', + children: [{ internalId: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const getItemId = (item) => item.internalId; export default function GetItemId() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} getItemId={getItemId} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/GetItemId.tsx b/docs/data/tree-view/rich-tree-view/items/GetItemId.tsx index deca6e972944..862f837b48b6 100644 --- a/docs/data/tree-view/rich-tree-view/items/GetItemId.tsx +++ b/docs/data/tree-view/rich-tree-view/items/GetItemId.tsx @@ -26,13 +26,23 @@ const MUI_X_PRODUCTS: MuiXProduct[] = [ { internalId: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, ], }, + { + internalId: 'charts', + label: 'Charts', + children: [{ internalId: 'charts-community', label: '@mui/x-charts' }], + }, + { + internalId: 'tree-view', + label: 'Tree View', + children: [{ internalId: 'tree-view-community', label: '@mui/x-tree-view' }], + }, ]; const getItemId = (item: MuiXProduct) => item.internalId; export default function GetItemId() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} getItemId={getItemId} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/GetItemLabel.js b/docs/data/tree-view/rich-tree-view/items/GetItemLabel.js index 830a78258204..a6248d09346f 100644 --- a/docs/data/tree-view/rich-tree-view/items/GetItemLabel.js +++ b/docs/data/tree-view/rich-tree-view/items/GetItemLabel.js @@ -21,13 +21,23 @@ const MUI_X_PRODUCTS = [ { id: 'pickers-pro', name: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + name: 'Charts', + children: [{ id: 'charts-community', name: '@mui/x-charts' }], + }, + { + id: 'tree-view', + name: 'Tree View', + children: [{ id: 'tree-view-community', name: '@mui/x-tree-view' }], + }, ]; const getItemLabel = (item) => item.name; export default function GetItemLabel() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} getItemLabel={getItemLabel} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/GetItemLabel.tsx b/docs/data/tree-view/rich-tree-view/items/GetItemLabel.tsx index 0d6815d0d677..c122ca577359 100644 --- a/docs/data/tree-view/rich-tree-view/items/GetItemLabel.tsx +++ b/docs/data/tree-view/rich-tree-view/items/GetItemLabel.tsx @@ -26,13 +26,23 @@ const MUI_X_PRODUCTS: MuiXProduct[] = [ { id: 'pickers-pro', name: '@mui/x-date-pickers-pro' }, ], }, + { + id: 'charts', + name: 'Charts', + children: [{ id: 'charts-community', name: '@mui/x-charts' }], + }, + { + id: 'tree-view', + name: 'Tree View', + children: [{ id: 'tree-view-community', name: '@mui/x-tree-view' }], + }, ]; const getItemLabel = (item: MuiXProduct) => item.name; export default function GetItemLabel() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} getItemLabel={getItemLabel} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/items/items.md b/docs/data/tree-view/rich-tree-view/items/items.md index e85d35328c69..9370571c23e3 100644 --- a/docs/data/tree-view/rich-tree-view/items/items.md +++ b/docs/data/tree-view/rich-tree-view/items/items.md @@ -119,9 +119,9 @@ Otherwise, the Tree View will re-generate its entire structure. This can be achieved by either defining the prop outside the component scope or by memoizing using the `React.useCallback` hook if the function reuses something from the component scope. ::: -### The disabledItemsFocusable prop +### Focus disabled items -Use the `disabledItemsFocusable` prop to control whether or not a disabled Tree Item can be focused. +Use the `disabledItemsFocusable` prop to control if disabled Tree Items can be focused. When this prop is set to false: @@ -140,3 +140,20 @@ When it's set to true: - Mouse or keyboard interaction will not select disabled items. - <kbd class="key">Shift</kbd> + arrow keys will not skip disabled items, but the disabled item will not be selected. - Programmatic focus will focus disabled items. + +{{"demo": "DisabledItemsFocusable.js", "defaultCodeOpen": false}} + +## Imperative API + +### Get an item by ID + +Use the `getItem` API method to get an item by its ID. + +```ts +const item = apiRef.current.getItem( + // The ID of the item to retrieve + itemId, +); +``` + +{{"demo": "ApiMethodGetItem.js", "defaultCodeOpen": false}} diff --git a/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.js b/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.js index 32ecf3762ded..f5cbb0dc177d 100644 --- a/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.js +++ b/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.js @@ -34,7 +34,7 @@ const MUI_X_PRODUCTS = [ export default function CheckboxMultiSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <RichTreeView multiSelect checkboxSelection items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.tsx b/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.tsx index 0c064df15746..3f63814f8ee7 100644 --- a/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.tsx +++ b/docs/data/tree-view/rich-tree-view/selection/CheckboxMultiSelection.tsx @@ -35,7 +35,7 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ export default function CheckboxMultiSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <RichTreeView multiSelect checkboxSelection items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.js b/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.js index 12b1b503c2b2..2099278403a9 100644 --- a/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.js +++ b/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.js @@ -34,7 +34,7 @@ const MUI_X_PRODUCTS = [ export default function CheckboxSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <RichTreeView checkboxSelection items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.tsx b/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.tsx index 16eac642a240..2e329937cc92 100644 --- a/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.tsx +++ b/docs/data/tree-view/rich-tree-view/selection/CheckboxSelection.tsx @@ -35,7 +35,7 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ export default function CheckboxSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <RichTreeView checkboxSelection items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.js b/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.js index 537b04fc53cb..30af214c7fbd 100644 --- a/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.js +++ b/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.js @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; @@ -59,13 +60,13 @@ export default function ControlledSelection() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleSelectClick}> {selectedItems.length === 0 ? 'Select all' : 'Unselect all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} selectedItems={selectedItems} @@ -73,6 +74,6 @@ export default function ControlledSelection() { multiSelect /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx b/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx index 3f2967a50d4a..a0333944ed2b 100644 --- a/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx +++ b/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { TreeViewBaseItem, TreeViewItemId } from '@mui/x-tree-view/models'; @@ -60,13 +61,13 @@ export default function ControlledSelection() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleSelectClick}> {selectedItems.length === 0 ? 'Select all' : 'Unselect all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} selectedItems={selectedItems} @@ -74,6 +75,6 @@ export default function ControlledSelection() { multiSelect /> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx.preview b/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx.preview index e1b7677fd754..f05fb2f2435d 100644 --- a/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/selection/ControlledSelection.tsx.preview @@ -1,9 +1,9 @@ -<Box sx={{ mb: 1 }}> +<div> <Button onClick={handleSelectClick}> {selectedItems.length === 0 ? 'Select all' : 'Unselect all'} </Button> -</Box> -<Box sx={{ minHeight: 200, flexGrow: 1 }}> +</div> +<Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView items={MUI_X_PRODUCTS} selectedItems={selectedItems} diff --git a/docs/data/tree-view/rich-tree-view/selection/DisableSelection.js b/docs/data/tree-view/rich-tree-view/selection/DisableSelection.js index 45f155a4b3e4..540c2d0911e2 100644 --- a/docs/data/tree-view/rich-tree-view/selection/DisableSelection.js +++ b/docs/data/tree-view/rich-tree-view/selection/DisableSelection.js @@ -34,7 +34,7 @@ const MUI_X_PRODUCTS = [ export default function DisableSelection() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView disableSelection items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/DisableSelection.tsx b/docs/data/tree-view/rich-tree-view/selection/DisableSelection.tsx index 7937123a72e3..17d4a19d088b 100644 --- a/docs/data/tree-view/rich-tree-view/selection/DisableSelection.tsx +++ b/docs/data/tree-view/rich-tree-view/selection/DisableSelection.tsx @@ -35,7 +35,7 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ export default function DisableSelection() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView disableSelection items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.js b/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.js index ea21e6cb404b..aa65993ee26a 100644 --- a/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.js +++ b/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.js @@ -34,7 +34,7 @@ const MUI_X_PRODUCTS = [ export default function MultiSelectTreeView() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView multiSelect items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.tsx b/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.tsx index deea7256e615..8b6627572ca8 100644 --- a/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.tsx +++ b/docs/data/tree-view/rich-tree-view/selection/MultiSelectTreeView.tsx @@ -35,7 +35,7 @@ const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ export default function MultiSelectTreeView() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <RichTreeView multiSelect items={MUI_X_PRODUCTS} /> </Box> ); diff --git a/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.js b/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.js new file mode 100644 index 000000000000..8f9dd61e4df9 --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.js @@ -0,0 +1,98 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; +import { useTreeViewApiRef } from '@mui/x-tree-view/hooks'; + +const MUI_X_PRODUCTS = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +function getItemDescendantsIds(item) { + const ids = []; + item.children?.forEach((child) => { + ids.push(child.id); + ids.push(...getItemDescendantsIds(child)); + }); + + return ids; +} + +export default function ParentChildrenSelectionRelationship() { + const [selectedItems, setSelectedItems] = React.useState([]); + const toggledItemRef = React.useRef({}); + const apiRef = useTreeViewApiRef(); + + const handleItemSelectionToggle = (event, itemId, isSelected) => { + toggledItemRef.current[itemId] = isSelected; + }; + + const handleSelectedItemsChange = (event, newSelectedItems) => { + setSelectedItems(newSelectedItems); + + // Select / unselect the children of the toggled item + const itemsToSelect = []; + const itemsToUnSelect = {}; + Object.entries(toggledItemRef.current).forEach(([itemId, isSelected]) => { + const item = apiRef.current.getItem(itemId); + if (isSelected) { + itemsToSelect.push(...getItemDescendantsIds(item)); + } else { + getItemDescendantsIds(item).forEach((descendantId) => { + itemsToUnSelect[descendantId] = true; + }); + } + }); + + const newSelectedItemsWithChildren = Array.from( + new Set( + [...newSelectedItems, ...itemsToSelect].filter( + (itemId) => !itemsToUnSelect[itemId], + ), + ), + ); + + setSelectedItems(newSelectedItemsWithChildren); + + toggledItemRef.current = {}; + }; + + return ( + <Box sx={{ minHeight: 352, minWidth: 290 }}> + <RichTreeView + multiSelect + checkboxSelection + apiRef={apiRef} + items={MUI_X_PRODUCTS} + selectedItems={selectedItems} + onSelectedItemsChange={handleSelectedItemsChange} + onItemSelectionToggle={handleItemSelectionToggle} + /> + </Box> + ); +} diff --git a/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.tsx b/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.tsx new file mode 100644 index 000000000000..e45bdbb4fb3c --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.tsx @@ -0,0 +1,106 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; +import { useTreeViewApiRef } from '@mui/x-tree-view/hooks'; +import { TreeViewBaseItem } from '@mui/x-tree-view/models'; + +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +function getItemDescendantsIds(item: TreeViewBaseItem) { + const ids: string[] = []; + item.children?.forEach((child) => { + ids.push(child.id); + ids.push(...getItemDescendantsIds(child)); + }); + + return ids; +} + +export default function ParentChildrenSelectionRelationship() { + const [selectedItems, setSelectedItems] = React.useState<string[]>([]); + const toggledItemRef = React.useRef<{ [itemId: string]: boolean }>({}); + const apiRef = useTreeViewApiRef(); + + const handleItemSelectionToggle = ( + event: React.SyntheticEvent, + itemId: string, + isSelected: boolean, + ) => { + toggledItemRef.current[itemId] = isSelected; + }; + + const handleSelectedItemsChange = ( + event: React.SyntheticEvent, + newSelectedItems: string[], + ) => { + setSelectedItems(newSelectedItems); + + // Select / unselect the children of the toggled item + const itemsToSelect: string[] = []; + const itemsToUnSelect: { [itemId: string]: boolean } = {}; + Object.entries(toggledItemRef.current).forEach(([itemId, isSelected]) => { + const item = apiRef.current!.getItem(itemId); + if (isSelected) { + itemsToSelect.push(...getItemDescendantsIds(item)); + } else { + getItemDescendantsIds(item).forEach((descendantId) => { + itemsToUnSelect[descendantId] = true; + }); + } + }); + + const newSelectedItemsWithChildren = Array.from( + new Set( + [...newSelectedItems, ...itemsToSelect].filter( + (itemId) => !itemsToUnSelect[itemId], + ), + ), + ); + + setSelectedItems(newSelectedItemsWithChildren); + + toggledItemRef.current = {}; + }; + + return ( + <Box sx={{ minHeight: 352, minWidth: 290 }}> + <RichTreeView + multiSelect + checkboxSelection + apiRef={apiRef} + items={MUI_X_PRODUCTS} + selectedItems={selectedItems} + onSelectedItemsChange={handleSelectedItemsChange} + onItemSelectionToggle={handleItemSelectionToggle} + /> + </Box> + ); +} diff --git a/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.tsx.preview b/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.tsx.preview new file mode 100644 index 000000000000..6fa38db9c231 --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/selection/ParentChildrenSelectionRelationship.tsx.preview @@ -0,0 +1,9 @@ +<RichTreeView + multiSelect + checkboxSelection + apiRef={apiRef} + items={MUI_X_PRODUCTS} + selectedItems={selectedItems} + onSelectedItemsChange={handleSelectedItemsChange} + onItemSelectionToggle={handleItemSelectionToggle} +/> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.js b/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.js new file mode 100644 index 000000000000..adde68fa5153 --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.js @@ -0,0 +1,41 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; + +const MUI_X_PRODUCTS = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function SingleSelectTreeView() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView items={MUI_X_PRODUCTS} /> + </Box> + ); +} diff --git a/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx b/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx new file mode 100644 index 000000000000..dca2893bc162 --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx @@ -0,0 +1,42 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; +import { TreeViewBaseItem } from '@mui/x-tree-view/models'; + +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function SingleSelectTreeView() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView items={MUI_X_PRODUCTS} /> + </Box> + ); +} diff --git a/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx.preview b/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx.preview new file mode 100644 index 000000000000..19ab6390267f --- /dev/null +++ b/docs/data/tree-view/rich-tree-view/selection/SingleSelectTreeView.tsx.preview @@ -0,0 +1 @@ +<RichTreeView items={MUI_X_PRODUCTS} /> \ No newline at end of file diff --git a/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.js b/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.js index 4c3bb49281bb..9d310064592c 100644 --- a/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.js +++ b/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.js @@ -51,7 +51,7 @@ export default function TrackItemSelectionToggle() { ? 'No item selection recorded' : `Last selected item: ${lastSelectedItem}`} </Typography> - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 300 }}> <RichTreeView items={MUI_X_PRODUCTS} onItemSelectionToggle={handleItemSelectionToggle} diff --git a/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx b/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx index d769a7a99d76..50893614cde5 100644 --- a/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx +++ b/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx @@ -57,7 +57,7 @@ export default function TrackItemSelectionToggle() { ? 'No item selection recorded' : `Last selected item: ${lastSelectedItem}`} </Typography> - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 300 }}> <RichTreeView items={MUI_X_PRODUCTS} onItemSelectionToggle={handleItemSelectionToggle} diff --git a/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx.preview b/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx.preview index 8e3053bf4f65..c45b26bfb96d 100644 --- a/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx.preview +++ b/docs/data/tree-view/rich-tree-view/selection/TrackItemSelectionToggle.tsx.preview @@ -3,7 +3,7 @@ ? 'No item selection recorded' : `Last selected item: ${lastSelectedItem}`} </Typography> -<Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> +<Box sx={{ minHeight: 352, minWidth: 300 }}> <RichTreeView items={MUI_X_PRODUCTS} onItemSelectionToggle={handleItemSelectionToggle} diff --git a/docs/data/tree-view/rich-tree-view/selection/selection.md b/docs/data/tree-view/rich-tree-view/selection/selection.md index 929d048d5377..2fb893baee65 100644 --- a/docs/data/tree-view/rich-tree-view/selection/selection.md +++ b/docs/data/tree-view/rich-tree-view/selection/selection.md @@ -11,12 +11,32 @@ waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/ <p class="description">Handle how users can select items.</p> +## Single selection + +By default, the Tree View allows selecting a single item. + +{{"demo": "SingleSelectTreeView.js"}} + +:::success +When the Tree View uses single selection, you can select an item by clicking it, +or using the [keyboard shortcuts](/x/react-tree-view/accessibility/#on-single-select-trees). +::: + ## Multi selection -The Tree View also supports multi-selection: +Use the `multiSelect` prop to enable multi-selection. {{"demo": "MultiSelectTreeView.js"}} +:::success +When the Tree View uses multi selection, you can select multiple items using the mouse in two ways: + +- To select multiple independent items, hold <kbd class="key">Ctrl</kbd> (or <kbd class="key">⌘ Command</kbd> on macOS) and click the items. +- To select a range of items, click on the first item of the range, then hold the <kbd class="key">Shift</kbd> key while clicking on the last item of the range. + +You can also use the [keyboard shortcuts](/x/react-tree-view/accessibility/#on-multi-select-trees) to select items. +::: + ## Disable selection Use the `disableSelection` prop if you don't want your items to be selectable: @@ -54,3 +74,23 @@ Learn more about the _Controlled and uncontrolled_ pattern in the [React documen Use the `onItemSelectionToggle` prop if you want to react to an item selection change: {{"demo": "TrackItemSelectionToggle.js"}} + +## Parent / children selection relationship + +Automatically select an item when all of its children are selected and automatically select all children when the parent is selected. + +:::warning +This feature isn't implemented yet. It's coming. + +👍 Upvote [issue #4821](https://github.com/mui/mui-x/issues/4821) if you want to see it land faster. + +Don't hesitate to leave a comment on the same issue to influence what gets built. +Especially if you already have a use case for this component, +or if you are facing a pain point with your current solution. +::: + +If you cannot wait for the official implementation, +you can create your own custom solution using the `selectedItems`, +`onSelectedItemsChange` and `onItemSelectionToggle` props: + +{{"demo": "ParentChildrenSelectionRelationship.js"}} diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.js b/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.js index 8db5e31fc09d..f507b6768cca 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.js +++ b/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import Collapse from '@mui/material/Collapse'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; @@ -30,25 +31,24 @@ const CustomTreeItem = React.forwardRef((props, ref) => ( export default function CustomAnimation() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - > - <CustomTreeItem itemId="1" label="Main"> - <CustomTreeItem itemId="2" label="Hello" /> - <CustomTreeItem itemId="3" label="Subtree with children"> - <CustomTreeItem itemId="6" label="Hello" /> - <CustomTreeItem itemId="7" label="Sub-subtree with children"> - <CustomTreeItem itemId="9" label="Child 1" /> - <CustomTreeItem itemId="10" label="Child 2" /> - <CustomTreeItem itemId="11" label="Child 3" /> - </CustomTreeItem> - <CustomTreeItem itemId="8" label="Hello" /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> </CustomTreeItem> - <CustomTreeItem itemId="4" label="World" /> - <CustomTreeItem itemId="5" label="Something something" /> - </CustomTreeItem> - </SimpleTreeView> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </CustomTreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.tsx b/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.tsx index 786650ea38e0..5a2428ac5a08 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.tsx +++ b/docs/data/tree-view/simple-tree-view/customization/CustomAnimation.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import Collapse from '@mui/material/Collapse'; import { TransitionProps } from '@mui/material/transitions'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; @@ -32,25 +33,24 @@ const CustomTreeItem = React.forwardRef( export default function CustomAnimation() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - > - <CustomTreeItem itemId="1" label="Main"> - <CustomTreeItem itemId="2" label="Hello" /> - <CustomTreeItem itemId="3" label="Subtree with children"> - <CustomTreeItem itemId="6" label="Hello" /> - <CustomTreeItem itemId="7" label="Sub-subtree with children"> - <CustomTreeItem itemId="9" label="Child 1" /> - <CustomTreeItem itemId="10" label="Child 2" /> - <CustomTreeItem itemId="11" label="Child 3" /> - </CustomTreeItem> - <CustomTreeItem itemId="8" label="Hello" /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> </CustomTreeItem> - <CustomTreeItem itemId="4" label="World" /> - <CustomTreeItem itemId="5" label="Something something" /> - </CustomTreeItem> - </SimpleTreeView> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </CustomTreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomIcons.js b/docs/data/tree-view/simple-tree-view/customization/CustomIcons.js index 3bfdaf46af80..99b4b6c4f0b6 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomIcons.js +++ b/docs/data/tree-view/simple-tree-view/customization/CustomIcons.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import AddBoxIcon from '@mui/icons-material/AddBox'; import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox'; import SvgIcon from '@mui/material/SvgIcon'; @@ -30,30 +31,31 @@ function CloseSquare(props) { export default function CustomIcons() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['1']} - slots={{ - expandIcon: AddBoxIcon, - collapseIcon: IndeterminateCheckBoxIcon, - endIcon: CloseSquare, - }} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - > - <CustomTreeItem itemId="1" label="Main"> - <CustomTreeItem itemId="2" label="Hello" /> - <CustomTreeItem itemId="3" label="Subtree with children"> - <CustomTreeItem itemId="6" label="Hello" /> - <CustomTreeItem itemId="7" label="Sub-subtree with children"> - <CustomTreeItem itemId="9" label="Child 1" /> - <CustomTreeItem itemId="10" label="Child 2" /> - <CustomTreeItem itemId="11" label="Child 3" /> - </CustomTreeItem> - <CustomTreeItem itemId="8" label="Hello" /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView + defaultExpandedItems={['grid']} + slots={{ + expandIcon: AddBoxIcon, + collapseIcon: IndeterminateCheckBoxIcon, + endIcon: CloseSquare, + }} + > + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> </CustomTreeItem> - <CustomTreeItem itemId="4" label="World" /> - <CustomTreeItem itemId="5" label="Something something" /> - </CustomTreeItem> - </SimpleTreeView> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomIcons.tsx b/docs/data/tree-view/simple-tree-view/customization/CustomIcons.tsx index f8746f6dd376..202b636b1fd5 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomIcons.tsx +++ b/docs/data/tree-view/simple-tree-view/customization/CustomIcons.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import AddBoxIcon from '@mui/icons-material/AddBox'; import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox'; import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon'; @@ -30,30 +31,31 @@ function CloseSquare(props: SvgIconProps) { export default function CustomIcons() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['1']} - slots={{ - expandIcon: AddBoxIcon, - collapseIcon: IndeterminateCheckBoxIcon, - endIcon: CloseSquare, - }} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - > - <CustomTreeItem itemId="1" label="Main"> - <CustomTreeItem itemId="2" label="Hello" /> - <CustomTreeItem itemId="3" label="Subtree with children"> - <CustomTreeItem itemId="6" label="Hello" /> - <CustomTreeItem itemId="7" label="Sub-subtree with children"> - <CustomTreeItem itemId="9" label="Child 1" /> - <CustomTreeItem itemId="10" label="Child 2" /> - <CustomTreeItem itemId="11" label="Child 3" /> - </CustomTreeItem> - <CustomTreeItem itemId="8" label="Hello" /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView + defaultExpandedItems={['grid']} + slots={{ + expandIcon: AddBoxIcon, + collapseIcon: IndeterminateCheckBoxIcon, + endIcon: CloseSquare, + }} + > + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> </CustomTreeItem> - <CustomTreeItem itemId="4" label="World" /> - <CustomTreeItem itemId="5" label="Something something" /> - </CustomTreeItem> - </SimpleTreeView> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomStyling.js b/docs/data/tree-view/simple-tree-view/customization/CustomStyling.js index f2426eb5cbf0..3b2fc9d59aa6 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomStyling.js +++ b/docs/data/tree-view/simple-tree-view/customization/CustomStyling.js @@ -1,9 +1,10 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { styled, alpha } from '@mui/material/styles'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem'; -const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ +const CustomTreeItem = styled(TreeItem)(({ theme }) => ({ color: theme.palette.mode === 'light' ? theme.palette.grey[800] @@ -26,29 +27,33 @@ const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ color: theme.palette.mode === 'dark' && theme.palette.primary.contrastText, padding: theme.spacing(0, 1.2), }, + [`& .${treeItemClasses.groupTransition}`]: { + marginLeft: 15, + paddingLeft: 18, + borderLeft: `1px dashed ${alpha(theme.palette.text.primary, 0.4)}`, + }, })); export default function CustomStyling() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - > - <StyledTreeItem itemId="1" label="Main"> - <StyledTreeItem itemId="2" label="Hello" /> - <StyledTreeItem itemId="3" label="Subtree with children"> - <StyledTreeItem itemId="6" label="Hello" /> - <StyledTreeItem itemId="7" label="Sub-subtree with children"> - <StyledTreeItem itemId="9" label="Child 1" /> - <StyledTreeItem itemId="10" label="Child 2" /> - <StyledTreeItem itemId="11" label="Child 3" /> - </StyledTreeItem> - <StyledTreeItem itemId="8" label="Hello" /> - </StyledTreeItem> - <StyledTreeItem itemId="4" label="World" /> - <StyledTreeItem itemId="5" label="Something something" /> - </StyledTreeItem> - </SimpleTreeView> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </CustomTreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomStyling.tsx b/docs/data/tree-view/simple-tree-view/customization/CustomStyling.tsx index 1f9aa0a895b6..8a8b2d213719 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomStyling.tsx +++ b/docs/data/tree-view/simple-tree-view/customization/CustomStyling.tsx @@ -1,9 +1,10 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { styled, alpha } from '@mui/material/styles'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem'; -const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ +const CustomTreeItem = styled(TreeItem)(({ theme }) => ({ color: theme.palette.mode === 'light' ? theme.palette.grey[800] @@ -27,29 +28,33 @@ const StyledTreeItem = styled(TreeItem)(({ theme }) => ({ color: theme.palette.mode === 'dark' && theme.palette.primary.contrastText, padding: theme.spacing(0, 1.2), }, + [`& .${treeItemClasses.groupTransition}`]: { + marginLeft: 15, + paddingLeft: 18, + borderLeft: `1px dashed ${alpha(theme.palette.text.primary, 0.4)}`, + }, })); export default function CustomStyling() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['1']} - sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, maxWidth: 300 }} - > - <StyledTreeItem itemId="1" label="Main"> - <StyledTreeItem itemId="2" label="Hello" /> - <StyledTreeItem itemId="3" label="Subtree with children"> - <StyledTreeItem itemId="6" label="Hello" /> - <StyledTreeItem itemId="7" label="Sub-subtree with children"> - <StyledTreeItem itemId="9" label="Child 1" /> - <StyledTreeItem itemId="10" label="Child 2" /> - <StyledTreeItem itemId="11" label="Child 3" /> - </StyledTreeItem> - <StyledTreeItem itemId="8" label="Hello" /> - </StyledTreeItem> - <StyledTreeItem itemId="4" label="World" /> - <StyledTreeItem itemId="5" label="Something something" /> - </StyledTreeItem> - </SimpleTreeView> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </CustomTreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.js b/docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.js similarity index 90% rename from docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.js rename to docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.js index c16dc8ac924a..671659396440 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.js +++ b/docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.js @@ -60,14 +60,10 @@ const CustomTreeItem = React.forwardRef(function CustomTreeItem(props, ref) { ); }); -export default function CustomContentTreeView() { +export default function HeadlessAPI() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> - <SimpleTreeView - aria-label="icon expansion" - sx={{ position: 'relative' }} - defaultExpandedItems={['3']} - > + <Box sx={{ minHeight: 200, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['3']}> <CustomTreeItem itemId="1" label="Amelia Hart"> <CustomTreeItem itemId="2" label="Jane Fisher" /> </CustomTreeItem> diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.tsx b/docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx similarity index 91% rename from docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.tsx rename to docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx index c4d333d40f08..e810c4bf4ce2 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.tsx +++ b/docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx @@ -70,14 +70,10 @@ const CustomTreeItem = React.forwardRef(function CustomTreeItem( ); }); -export default function CustomContentTreeView() { +export default function HeadlessAPI() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> - <SimpleTreeView - aria-label="icon expansion" - sx={{ position: 'relative' }} - defaultExpandedItems={['3']} - > + <Box sx={{ minHeight: 200, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['3']}> <CustomTreeItem itemId="1" label="Amelia Hart"> <CustomTreeItem itemId="2" label="Jane Fisher" /> </CustomTreeItem> diff --git a/docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.tsx.preview b/docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx.preview similarity index 78% rename from docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.tsx.preview rename to docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx.preview index 8d935ef57ba7..66f9d114b23b 100644 --- a/docs/data/tree-view/simple-tree-view/customization/CustomContentTreeView.tsx.preview +++ b/docs/data/tree-view/simple-tree-view/customization/HeadlessAPI.tsx.preview @@ -1,8 +1,4 @@ -<SimpleTreeView - aria-label="icon expansion" - sx={{ position: 'relative' }} - defaultExpandedItems={['3']} -> +<SimpleTreeView defaultExpandedItems={['3']}> <CustomTreeItem itemId="1" label="Amelia Hart"> <CustomTreeItem itemId="2" label="Jane Fisher" /> </CustomTreeItem> diff --git a/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.js b/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.js index 2aac5812e5d8..36e9e200da11 100644 --- a/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.js +++ b/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.js @@ -34,16 +34,22 @@ const CustomTreeItem = React.forwardRef(function MyTreeItem(props, ref) { export default function IconExpansionTreeView() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView aria-label="icon expansion"> - <CustomTreeItem itemId="1" label="Applications"> - <CustomTreeItem itemId="2" label="Calendar" /> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> </CustomTreeItem> - <CustomTreeItem itemId="5" label="Documents"> - <CustomTreeItem itemId="10" label="OSS" /> - <CustomTreeItem itemId="6" label="MUI"> - <CustomTreeItem itemId="8" label="index.js" /> - </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> </CustomTreeItem> </SimpleTreeView> </Box> diff --git a/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.tsx b/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.tsx index 816ee7f375df..f0a5de292e60 100644 --- a/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.tsx +++ b/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.tsx @@ -37,16 +37,22 @@ const CustomTreeItem = React.forwardRef(function MyTreeItem( export default function IconExpansionTreeView() { return ( - <Box sx={{ minHeight: 180, flexGrow: 1, maxWidth: 300 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView aria-label="icon expansion"> - <CustomTreeItem itemId="1" label="Applications"> - <CustomTreeItem itemId="2" label="Calendar" /> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> </CustomTreeItem> - <CustomTreeItem itemId="5" label="Documents"> - <CustomTreeItem itemId="10" label="OSS" /> - <CustomTreeItem itemId="6" label="MUI"> - <CustomTreeItem itemId="8" label="index.js" /> - </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> </CustomTreeItem> </SimpleTreeView> </Box> diff --git a/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.tsx.preview b/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.tsx.preview deleted file mode 100644 index c72caa3b106d..000000000000 --- a/docs/data/tree-view/simple-tree-view/customization/IconExpansionTreeView.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ -<SimpleTreeView aria-label="icon expansion"> - <CustomTreeItem itemId="1" label="Applications"> - <CustomTreeItem itemId="2" label="Calendar" /> - </CustomTreeItem> - <CustomTreeItem itemId="5" label="Documents"> - <CustomTreeItem itemId="10" label="OSS" /> - <CustomTreeItem itemId="6" label="MUI"> - <CustomTreeItem itemId="8" label="index.js" /> - </CustomTreeItem> - </CustomTreeItem> -</SimpleTreeView> \ No newline at end of file diff --git a/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.js b/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.js index 59c40e034d24..4908de784996 100644 --- a/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.js +++ b/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem2 } from '@mui/x-tree-view/TreeItem2'; @@ -16,20 +17,24 @@ const CustomTreeItem = React.forwardRef((props, ref) => ( export default function LabelSlotProps() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['pickers']} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} - > - <CustomTreeItem itemId="grid" label="Data Grid"> - <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> - <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> - <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> - </CustomTreeItem> - <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> - <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> - <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> - </CustomTreeItem> - </SimpleTreeView> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </CustomTreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.tsx b/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.tsx index 3476b3b8e13c..99bb07a10be0 100644 --- a/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.tsx +++ b/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Box from '@mui/material/Box'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem2, TreeItem2Props } from '@mui/x-tree-view/TreeItem2'; @@ -18,20 +19,24 @@ const CustomTreeItem = React.forwardRef( export default function LabelSlotProps() { return ( - <SimpleTreeView - aria-label="customized" - defaultExpandedItems={['pickers']} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} - > - <CustomTreeItem itemId="grid" label="Data Grid"> - <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> - <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> - <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> - </CustomTreeItem> - <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> - <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> - <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> - </CustomTreeItem> - </SimpleTreeView> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> + <CustomTreeItem itemId="grid" label="Data Grid"> + <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </CustomTreeItem> + <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> + <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem itemId="charts-community" label="@mui/x-charts" /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </CustomTreeItem> + </SimpleTreeView> + </Box> ); } diff --git a/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.tsx.preview b/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.tsx.preview deleted file mode 100644 index 1aaad97525e6..000000000000 --- a/docs/data/tree-view/simple-tree-view/customization/LabelSlotProps.tsx.preview +++ /dev/null @@ -1,15 +0,0 @@ -<SimpleTreeView - aria-label="customized" - defaultExpandedItems={['pickers']} - sx={{ overflowX: 'hidden', minHeight: 224, flexGrow: 1, maxWidth: 300 }} -> - <CustomTreeItem itemId="grid" label="Data Grid"> - <CustomTreeItem itemId="grid-community" label="@mui/x-data-grid" /> - <CustomTreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> - <CustomTreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> - </CustomTreeItem> - <CustomTreeItem itemId="pickers" label="Date and Time Pickers"> - <CustomTreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> - <CustomTreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> - </CustomTreeItem> -</SimpleTreeView> \ No newline at end of file diff --git a/docs/data/tree-view/simple-tree-view/customization/LabelSlots.js b/docs/data/tree-view/simple-tree-view/customization/LabelSlots.js index cec9de6b0aeb..e5ff0f51a96d 100644 --- a/docs/data/tree-view/simple-tree-view/customization/LabelSlots.js +++ b/docs/data/tree-view/simple-tree-view/customization/LabelSlots.js @@ -29,8 +29,8 @@ const CustomTreeItem = React.forwardRef((props, ref) => { export default function LabelSlots() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> - <SimpleTreeView defaultExpandedItems={['pickers']}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> <CustomTreeItem itemId="grid" label="Data Grid"> <CustomTreeItem itemId="grid-community" @@ -60,6 +60,20 @@ export default function LabelSlots() { labelTooltip="Pro version (commercial) of the Date and Time Pickers" /> </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem + itemId="charts-community" + label="@mui/x-charts" + labelTooltip="Community version (MIT) of the Charts" + /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem + itemId="tree-view-community" + label="@mui/x-tree-view" + labelTooltip="Community version (MIT) of the Tree View" + /> + </CustomTreeItem> </SimpleTreeView> </Box> ); diff --git a/docs/data/tree-view/simple-tree-view/customization/LabelSlots.tsx b/docs/data/tree-view/simple-tree-view/customization/LabelSlots.tsx index 59882c3023c1..36bf15aae886 100644 --- a/docs/data/tree-view/simple-tree-view/customization/LabelSlots.tsx +++ b/docs/data/tree-view/simple-tree-view/customization/LabelSlots.tsx @@ -44,8 +44,8 @@ const CustomTreeItem = React.forwardRef( export default function LabelSlots() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> - <SimpleTreeView defaultExpandedItems={['pickers']}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView defaultExpandedItems={['grid']}> <CustomTreeItem itemId="grid" label="Data Grid"> <CustomTreeItem itemId="grid-community" @@ -75,6 +75,20 @@ export default function LabelSlots() { labelTooltip="Pro version (commercial) of the Date and Time Pickers" /> </CustomTreeItem> + <CustomTreeItem itemId="charts" label="Charts"> + <CustomTreeItem + itemId="charts-community" + label="@mui/x-charts" + labelTooltip="Community version (MIT) of the Charts" + /> + </CustomTreeItem> + <CustomTreeItem itemId="tree-view" label="Tree View"> + <CustomTreeItem + itemId="tree-view-community" + label="@mui/x-tree-view" + labelTooltip="Community version (MIT) of the Tree View" + /> + </CustomTreeItem> </SimpleTreeView> </Box> ); diff --git a/docs/data/tree-view/simple-tree-view/customization/customization.md b/docs/data/tree-view/simple-tree-view/customization/customization.md index 4e74f185137d..e5e70b9e4aa8 100644 --- a/docs/data/tree-view/simple-tree-view/customization/customization.md +++ b/docs/data/tree-view/simple-tree-view/customization/customization.md @@ -60,7 +60,7 @@ The demo below shows how to add a tooltip on the Tree Item label: Use the `useTreeItem2` hook to create your own component. The demo below shows how to add an avatar and custom typography elements. -{{"demo": "CustomContentTreeView.js", "defaultCodeOpen": false}} +{{"demo": "HeadlessAPI.js", "defaultCodeOpen": false}} ## Common examples diff --git a/docs/data/tree-view/simple-tree-view/expansion/ChangeItemExpansion.js b/docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.js similarity index 73% rename from docs/data/tree-view/simple-tree-view/expansion/ChangeItemExpansion.js rename to docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.js index 7af3290f9f7e..4d62aacd5525 100644 --- a/docs/data/tree-view/simple-tree-view/expansion/ChangeItemExpansion.js +++ b/docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.js @@ -6,7 +6,7 @@ import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import { useTreeViewApiRef } from '@mui/x-tree-view/hooks'; -export default function ChangeItemExpansion() { +export default function ApiMethodSetItemExpansion() { const apiRef = useTreeViewApiRef(); const handleExpandClick = (event) => { @@ -18,12 +18,12 @@ export default function ChangeItemExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Stack sx={{ mb: 1 }} spacing={2} direction="row"> + <Stack spacing={2}> + <Stack spacing={2} direction="row"> <Button onClick={handleExpandClick}>Expand Data Grid</Button> <Button onClick={handleCollapseClick}>Collapse Data Grid</Button> </Stack> - <Box sx={{ minHeight: 220, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView apiRef={apiRef}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -34,8 +34,14 @@ export default function ChangeItemExpansion() { <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/expansion/ChangeItemExpansion.tsx b/docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.tsx similarity index 74% rename from docs/data/tree-view/simple-tree-view/expansion/ChangeItemExpansion.tsx rename to docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.tsx index ceddc17a3a26..01393a180d9d 100644 --- a/docs/data/tree-view/simple-tree-view/expansion/ChangeItemExpansion.tsx +++ b/docs/data/tree-view/simple-tree-view/expansion/ApiMethodSetItemExpansion.tsx @@ -6,7 +6,7 @@ import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import { useTreeViewApiRef } from '@mui/x-tree-view/hooks'; -export default function ChangeItemExpansion() { +export default function ApiMethodSetItemExpansion() { const apiRef = useTreeViewApiRef(); const handleExpandClick = (event: React.MouseEvent) => { @@ -18,12 +18,12 @@ export default function ChangeItemExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Stack sx={{ mb: 1 }} spacing={2} direction="row"> + <Stack spacing={2}> + <Stack spacing={2} direction="row"> <Button onClick={handleExpandClick}>Expand Data Grid</Button> <Button onClick={handleCollapseClick}>Collapse Data Grid</Button> </Stack> - <Box sx={{ minHeight: 220, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView apiRef={apiRef}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -34,8 +34,14 @@ export default function ChangeItemExpansion() { <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.js b/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.js index a11d874a4659..60988ccb5108 100644 --- a/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.js +++ b/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.js @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; @@ -32,13 +33,13 @@ export default function ControlledExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleExpandClick}> {expandedItems.length === 0 ? 'Expand all' : 'Collapse all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView expandedItems={expandedItems} onExpandedItemsChange={handleExpandedItemsChange} @@ -60,6 +61,6 @@ export default function ControlledExpansion() { </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.tsx b/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.tsx index ec0f524d81cf..7846e0452a27 100644 --- a/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.tsx +++ b/docs/data/tree-view/simple-tree-view/expansion/ControlledExpansion.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; @@ -35,13 +36,13 @@ export default function ControlledExpansion() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleExpandClick}> {expandedItems.length === 0 ? 'Expand all' : 'Collapse all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView expandedItems={expandedItems} onExpandedItemsChange={handleExpandedItemsChange} @@ -63,6 +64,6 @@ export default function ControlledExpansion() { </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.js b/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.js index e46f59e50ff6..6164a3bc5749 100644 --- a/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.js +++ b/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.js @@ -22,7 +22,7 @@ export default function TrackItemExpansionToggle() { </Typography> )} - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView onItemExpansionToggle={handleItemExpansionToggle}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.tsx b/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.tsx index 549b9e66e477..a8945812b2d9 100644 --- a/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.tsx +++ b/docs/data/tree-view/simple-tree-view/expansion/TrackItemExpansionToggle.tsx @@ -28,7 +28,7 @@ export default function TrackItemExpansionToggle() { Last action: {action.isExpanded ? 'expand' : 'collapse'} {action.itemId} </Typography> )} - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView onItemExpansionToggle={handleItemExpansionToggle}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/expansion/expansion.md b/docs/data/tree-view/simple-tree-view/expansion/expansion.md index d984b1bfb813..a6b0a3f4e46a 100644 --- a/docs/data/tree-view/simple-tree-view/expansion/expansion.md +++ b/docs/data/tree-view/simple-tree-view/expansion/expansion.md @@ -32,8 +32,34 @@ Use the `onItemExpansionToggle` prop to trigger an action upon an item being exp {{"demo": "TrackItemExpansionToggle.js"}} -## Change item expansion +## Imperative API -You can use the `setItemExpansion` API method to imperatively change the expansion of an item: +:::success +To use the `apiRef` object, you need to initialize it using the `useTreeViewApiRef` hook as follows: -{{"demo": "ChangeItemExpansion.js"}} +```tsx +const apiRef = useTreeViewApiRef(); + +return <SimpleTreeView apiRef={apiRef}>{children}</SimpleTreeView>; +``` + +When your component first renders, `apiRef` will be `undefined`. +After this initial render, `apiRef` holds methods to interact imperatively with the Tree View. +::: + +### Change an item expansion + +Use the `setItemExpansion` API method to change the expansion of an item. + +```ts +apiRef.current.setItemExpansion( + // The DOM event that triggered the change + event, + // The ID of the item to expand or collapse + itemId, + // `true` if the item should be expanded, `false` if it should be collapsed + isExpanded, +); +``` + +{{"demo": "ApiMethodSetItemExpansion.js"}} diff --git a/docs/data/tree-view/simple-tree-view/focus/FocusedSimpleTreeView.js b/docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.js similarity index 87% rename from docs/data/tree-view/simple-tree-view/focus/FocusedSimpleTreeView.js rename to docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.js index 9e12cc3ce060..52053493b5ae 100644 --- a/docs/data/tree-view/simple-tree-view/focus/FocusedSimpleTreeView.js +++ b/docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.js @@ -1,22 +1,23 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import { useTreeViewApiRef } from '@mui/x-tree-view/hooks/useTreeViewApiRef'; -export default function FocusedSimpleTreeView() { +export default function ApiMethodFocusItem() { const apiRef = useTreeViewApiRef(); const handleButtonClick = (event) => { apiRef.current?.focusItem(event, 'pickers'); }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleButtonClick}>Focus pickers item</Button> - </Box> - <Box sx={{ minHeight: 264, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView apiRef={apiRef}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -35,6 +36,6 @@ export default function FocusedSimpleTreeView() { </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/focus/FocusedSimpleTreeView.tsx b/docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.tsx similarity index 88% rename from docs/data/tree-view/simple-tree-view/focus/FocusedSimpleTreeView.tsx rename to docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.tsx index bc98ac6e25a9..1f881952954a 100644 --- a/docs/data/tree-view/simple-tree-view/focus/FocusedSimpleTreeView.tsx +++ b/docs/data/tree-view/simple-tree-view/focus/ApiMethodFocusItem.tsx @@ -1,22 +1,23 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import { useTreeViewApiRef } from '@mui/x-tree-view/hooks/useTreeViewApiRef'; -export default function FocusedSimpleTreeView() { +export default function ApiMethodFocusItem() { const apiRef = useTreeViewApiRef(); const handleButtonClick = (event: React.SyntheticEvent) => { apiRef.current?.focusItem(event, 'pickers'); }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleButtonClick}>Focus pickers item</Button> - </Box> - <Box sx={{ minHeight: 264, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView apiRef={apiRef}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -35,6 +36,6 @@ export default function FocusedSimpleTreeView() { </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/focus/focus.md b/docs/data/tree-view/simple-tree-view/focus/focus.md index b408b02c9f35..d1596614823c 100644 --- a/docs/data/tree-view/simple-tree-view/focus/focus.md +++ b/docs/data/tree-view/simple-tree-view/focus/focus.md @@ -11,10 +11,7 @@ waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/ <p class="description">Learn how to focus Tree View items.</p> -## Focus a specific item - -You can use the the `apiRef.focusItem` method to focus a specific item. -This methods receives two parameters: `event` and `itemId`. +## Imperative API :::success To use the `apiRef` object, you need to initialize it using the `useTreeViewApiRef` hook as follows: @@ -25,12 +22,26 @@ const apiRef = useTreeViewApiRef(); return <SimpleTreeView apiRef={apiRef}>{children}</SimpleTreeView>; ``` -`apiRef` will be undefined during the first render and will then contain methods allowing you to imperatively interact with the Tree View. +When your component first renders, `apiRef` will be `undefined`. +After this initial render, `apiRef` holds methods to interact imperatively with the Tree View. ::: +### Focus a specific item + +Use the `focusItem` API method to focus a specific item. + +```ts +apiRef.current.focusItem( + // The DOM event that triggered the change + event, + // The ID of the item to focus + itemId, +); +``` + :::info This method only works with items that are currently visible. Calling `apiRef.focusItem` on an item whose parent is collapsed will do nothing. ::: -{{"demo": "FocusedSimpleTreeView.js"}} +{{"demo": "ApiMethodFocusItem.js"}} diff --git a/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.js b/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.js index 5757cfb2964e..a1d3763587f3 100644 --- a/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.js +++ b/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.js @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function BasicSimpleTreeView() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -16,6 +16,12 @@ export default function BasicSimpleTreeView() { <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> </SimpleTreeView> </Box> ); diff --git a/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx b/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx index 5757cfb2964e..a1d3763587f3 100644 --- a/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx +++ b/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function BasicSimpleTreeView() { return ( - <Box sx={{ height: 220, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -16,6 +16,12 @@ export default function BasicSimpleTreeView() { <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> </SimpleTreeView> </Box> ); diff --git a/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx.preview b/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx.preview deleted file mode 100644 index 3641f9443f57..000000000000 --- a/docs/data/tree-view/simple-tree-view/items/BasicSimpleTreeView.tsx.preview +++ /dev/null @@ -1,11 +0,0 @@ -<SimpleTreeView> - <TreeItem itemId="grid" label="Data Grid"> - <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> - <TreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> - <TreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> - </TreeItem> - <TreeItem itemId="pickers" label="Date and Time Pickers"> - <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> - <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> - </TreeItem> -</SimpleTreeView> \ No newline at end of file diff --git a/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.js b/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.js index 773e68d490d0..f3712332000a 100644 --- a/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.js +++ b/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.js @@ -1,4 +1,5 @@ import * as React from 'react'; +import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; import Switch from '@mui/material/Switch'; import FormControlLabel from '@mui/material/FormControlLabel'; @@ -12,20 +13,18 @@ export default function DisabledItemsFocusable() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> - <FormControlLabel - control={ - <Switch - checked={disabledItemsFocusable} - onChange={handleToggle} - name="disabledItemsFocusable" - /> - } - label="Allow focusing disabled items" - /> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Stack spacing={2}> + <FormControlLabel + control={ + <Switch + checked={disabledItemsFocusable} + onChange={handleToggle} + name="disabledItemsFocusable" + /> + } + label="Allow focusing disabled items" + /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView disabledItemsFocusable={disabledItemsFocusable}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -37,17 +36,13 @@ export default function DisabledItemsFocusable() { <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> <TreeItem itemId="charts" label="Charts"> - <TreeItem itemId="charts-community" label="@mui/x-charts" /> + <TreeItem itemId="charts-community" label="@mui/x-charts" disabled /> </TreeItem> - <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view" label="Tree View" disabled> <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> - <TreeItem itemId="tree-view-pro" label="@mui/x-tree-view-pro" disabled /> - </TreeItem> - <TreeItem itemId="scheduler" label="Scheduler" disabled> - <TreeItem itemId="scheduler-community" label="@mui/x-scheduler" /> </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.tsx b/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.tsx index 2cab7252b0a9..010c5ff42162 100644 --- a/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.tsx +++ b/docs/data/tree-view/simple-tree-view/items/DisabledItemsFocusable.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import Stack from '@mui/material/Stack'; import Box from '@mui/material/Box'; import Switch from '@mui/material/Switch'; import FormControlLabel from '@mui/material/FormControlLabel'; @@ -12,20 +13,18 @@ export default function DisabledItemsFocusable() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> - <FormControlLabel - control={ - <Switch - checked={disabledItemsFocusable} - onChange={handleToggle} - name="disabledItemsFocusable" - /> - } - label="Allow focusing disabled items" - /> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Stack spacing={2}> + <FormControlLabel + control={ + <Switch + checked={disabledItemsFocusable} + onChange={handleToggle} + name="disabledItemsFocusable" + /> + } + label="Allow focusing disabled items" + /> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView disabledItemsFocusable={disabledItemsFocusable}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -37,17 +36,13 @@ export default function DisabledItemsFocusable() { <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> <TreeItem itemId="charts" label="Charts"> - <TreeItem itemId="charts-community" label="@mui/x-charts" /> + <TreeItem itemId="charts-community" label="@mui/x-charts" disabled /> </TreeItem> - <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view" label="Tree View" disabled> <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> - <TreeItem itemId="tree-view-pro" label="@mui/x-tree-view-pro" disabled /> - </TreeItem> - <TreeItem itemId="scheduler" label="Scheduler" disabled> - <TreeItem itemId="scheduler-community" label="@mui/x-scheduler" /> </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.js b/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.js index 14a73027e0ad..4ae365f859a9 100644 --- a/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.js +++ b/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.js @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function DisabledJSXItem() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 320, minWidth: 250 }}> <SimpleTreeView> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -17,14 +17,10 @@ export default function DisabledJSXItem() { <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> <TreeItem itemId="charts" label="Charts"> - <TreeItem itemId="charts-community" label="@mui/x-charts" /> + <TreeItem itemId="charts-community" label="@mui/x-charts" disabled /> </TreeItem> - <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view" label="Tree View" disabled> <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> - <TreeItem itemId="tree-view-pro" label="@mui/x-tree-view-pro" disabled /> - </TreeItem> - <TreeItem itemId="scheduler" label="Scheduler" disabled> - <TreeItem itemId="scheduler-community" label="@mui/x-scheduler" /> </TreeItem> </SimpleTreeView> </Box> diff --git a/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.tsx b/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.tsx index 14a73027e0ad..4ae365f859a9 100644 --- a/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.tsx +++ b/docs/data/tree-view/simple-tree-view/items/DisabledJSXItem.tsx @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function DisabledJSXItem() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 320, minWidth: 250 }}> <SimpleTreeView> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> @@ -17,14 +17,10 @@ export default function DisabledJSXItem() { <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> </TreeItem> <TreeItem itemId="charts" label="Charts"> - <TreeItem itemId="charts-community" label="@mui/x-charts" /> + <TreeItem itemId="charts-community" label="@mui/x-charts" disabled /> </TreeItem> - <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view" label="Tree View" disabled> <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> - <TreeItem itemId="tree-view-pro" label="@mui/x-tree-view-pro" disabled /> - </TreeItem> - <TreeItem itemId="scheduler" label="Scheduler" disabled> - <TreeItem itemId="scheduler-community" label="@mui/x-scheduler" /> </TreeItem> </SimpleTreeView> </Box> diff --git a/docs/data/tree-view/simple-tree-view/items/items.md b/docs/data/tree-view/simple-tree-view/items/items.md index 9105dc5588cc..a35ce2f3119c 100644 --- a/docs/data/tree-view/simple-tree-view/items/items.md +++ b/docs/data/tree-view/simple-tree-view/items/items.md @@ -47,7 +47,7 @@ You must pass a `label` prop to each Tree Item component, as shown below: Use the `disabled` prop on the Tree Item component to disable interaction and focus: -{{"demo": "DisabledItemsFocusable.js", "defaultCodeOpen": false}} +{{"demo": "DisabledJSXItem.js", "defaultCodeOpen": false}} #### The disabledItemsFocusable prop @@ -71,3 +71,5 @@ When it's set to true: - Mouse or keyboard interaction will not select disabled items. - <kbd class="key">Shift</kbd> + arrow keys will not skip disabled items, but the disabled item will not be selected. - Programmatic focus will focus disabled items. + +{{"demo": "DisabledItemsFocusable.js", "defaultCodeOpen": false}} diff --git a/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.js b/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.js index 4c5cc2874d52..1fa61790720c 100644 --- a/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.js +++ b/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.js @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function CheckboxMultiSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <SimpleTreeView multiSelect checkboxSelection> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.tsx b/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.tsx index 4c5cc2874d52..1fa61790720c 100644 --- a/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.tsx +++ b/docs/data/tree-view/simple-tree-view/selection/CheckboxMultiSelection.tsx @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function CheckboxMultiSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <SimpleTreeView multiSelect checkboxSelection> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.js b/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.js index 1b1d057131b7..9f4c9b6a77b7 100644 --- a/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.js +++ b/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.js @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function CheckboxSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <SimpleTreeView checkboxSelection> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.tsx b/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.tsx index 1b1d057131b7..9f4c9b6a77b7 100644 --- a/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.tsx +++ b/docs/data/tree-view/simple-tree-view/selection/CheckboxSelection.tsx @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function CheckboxSelection() { return ( - <Box sx={{ height: 264, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 290 }}> <SimpleTreeView checkboxSelection> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.js b/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.js index 12f8708449c3..2ede54e6e32c 100644 --- a/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.js +++ b/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.js @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import Button from '@mui/material/Button'; @@ -32,13 +33,13 @@ export default function ControlledSelection() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleSelectClick}> {selectedItems.length === 0 ? 'Select all' : 'Unselect all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView selectedItems={selectedItems} onSelectedItemsChange={handleSelectedItemsChange} @@ -61,6 +62,6 @@ export default function ControlledSelection() { </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.tsx b/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.tsx index b638e19eecee..21465a8b44ab 100644 --- a/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.tsx +++ b/docs/data/tree-view/simple-tree-view/selection/ControlledSelection.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import Box from '@mui/material/Box'; +import Stack from '@mui/material/Stack'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem } from '@mui/x-tree-view/TreeItem'; import Button from '@mui/material/Button'; @@ -32,13 +33,13 @@ export default function ControlledSelection() { }; return ( - <Box sx={{ flexGrow: 1, maxWidth: 400 }}> - <Box sx={{ mb: 1 }}> + <Stack spacing={2}> + <div> <Button onClick={handleSelectClick}> {selectedItems.length === 0 ? 'Select all' : 'Unselect all'} </Button> - </Box> - <Box sx={{ minHeight: 200, flexGrow: 1 }}> + </div> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView selectedItems={selectedItems} onSelectedItemsChange={handleSelectedItemsChange} @@ -61,6 +62,6 @@ export default function ControlledSelection() { </TreeItem> </SimpleTreeView> </Box> - </Box> + </Stack> ); } diff --git a/docs/data/tree-view/simple-tree-view/selection/DisableSelection.js b/docs/data/tree-view/simple-tree-view/selection/DisableSelection.js index 9db0d16ef7e6..ffc7d808332f 100644 --- a/docs/data/tree-view/simple-tree-view/selection/DisableSelection.js +++ b/docs/data/tree-view/simple-tree-view/selection/DisableSelection.js @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function DisableSelection() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView disableSelection> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/DisableSelection.tsx b/docs/data/tree-view/simple-tree-view/selection/DisableSelection.tsx index 9db0d16ef7e6..ffc7d808332f 100644 --- a/docs/data/tree-view/simple-tree-view/selection/DisableSelection.tsx +++ b/docs/data/tree-view/simple-tree-view/selection/DisableSelection.tsx @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function DisableSelection() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView disableSelection> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.js b/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.js index eba9bb8cd17f..affd5bdee3e8 100644 --- a/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.js +++ b/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.js @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function MultiSelectTreeView() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView multiSelect> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.tsx b/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.tsx index eba9bb8cd17f..affd5bdee3e8 100644 --- a/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.tsx +++ b/docs/data/tree-view/simple-tree-view/selection/MultiSelectTreeView.tsx @@ -5,7 +5,7 @@ import { TreeItem } from '@mui/x-tree-view/TreeItem'; export default function MultiSelectTreeView() { return ( - <Box sx={{ minHeight: 200, flexGrow: 1, maxWidth: 400 }}> + <Box sx={{ minHeight: 352, minWidth: 250 }}> <SimpleTreeView multiSelect> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.js b/docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.js new file mode 100644 index 000000000000..ab9bd504a607 --- /dev/null +++ b/docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.js @@ -0,0 +1,28 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; +import { TreeItem } from '@mui/x-tree-view/TreeItem'; + +export default function SingleSelectTreeView() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView> + <TreeItem itemId="grid" label="Data Grid"> + <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <TreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <TreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </TreeItem> + <TreeItem itemId="pickers" label="Date and Time Pickers"> + <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> + </SimpleTreeView> + </Box> + ); +} diff --git a/docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.tsx b/docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.tsx new file mode 100644 index 000000000000..ab9bd504a607 --- /dev/null +++ b/docs/data/tree-view/simple-tree-view/selection/SingleSelectTreeView.tsx @@ -0,0 +1,28 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; +import { TreeItem } from '@mui/x-tree-view/TreeItem'; + +export default function SingleSelectTreeView() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <SimpleTreeView> + <TreeItem itemId="grid" label="Data Grid"> + <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> + <TreeItem itemId="grid-pro" label="@mui/x-data-grid-pro" /> + <TreeItem itemId="grid-premium" label="@mui/x-data-grid-premium" /> + </TreeItem> + <TreeItem itemId="pickers" label="Date and Time Pickers"> + <TreeItem itemId="pickers-community" label="@mui/x-date-pickers" /> + <TreeItem itemId="pickers-pro" label="@mui/x-date-pickers-pro" /> + </TreeItem> + <TreeItem itemId="charts" label="Charts"> + <TreeItem itemId="charts-community" label="@mui/x-charts" /> + </TreeItem> + <TreeItem itemId="tree-view" label="Tree View"> + <TreeItem itemId="tree-view-community" label="@mui/x-tree-view" /> + </TreeItem> + </SimpleTreeView> + </Box> + ); +} diff --git a/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.js b/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.js index 55c76b326e22..a42fbf9f74a7 100644 --- a/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.js +++ b/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.js @@ -21,7 +21,7 @@ export default function TrackItemSelectionToggle() { ? 'No item selection recorded' : `Last selected item: ${lastSelectedItem}`} </Typography> - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 300 }}> <SimpleTreeView onItemSelectionToggle={handleItemSelectionToggle}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.tsx b/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.tsx index ccc5bde9bfed..665c44a496fc 100644 --- a/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.tsx +++ b/docs/data/tree-view/simple-tree-view/selection/TrackItemSelectionToggle.tsx @@ -27,7 +27,7 @@ export default function TrackItemSelectionToggle() { ? 'No item selection recorded' : `Last selected item: ${lastSelectedItem}`} </Typography> - <Box sx={{ minHeight: 200, minWidth: 300, flexGrow: 1 }}> + <Box sx={{ minHeight: 352, minWidth: 300 }}> <SimpleTreeView onItemSelectionToggle={handleItemSelectionToggle}> <TreeItem itemId="grid" label="Data Grid"> <TreeItem itemId="grid-community" label="@mui/x-data-grid" /> diff --git a/docs/data/tree-view/simple-tree-view/selection/selection.md b/docs/data/tree-view/simple-tree-view/selection/selection.md index 18337196bec7..434a4284a0a2 100644 --- a/docs/data/tree-view/simple-tree-view/selection/selection.md +++ b/docs/data/tree-view/simple-tree-view/selection/selection.md @@ -11,12 +11,32 @@ waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/ <p class="description">Learn how to enable item selection for the Tree View component.</p> +## Single selection + +By default, the Tree View allows selecting a single item. + +{{"demo": "SingleSelectTreeView.js"}} + +:::success +When the Tree View uses single selection, you can select an item by clicking it, +or using the [keyboard shortcuts](/x/react-tree-view/accessibility/#on-single-select-trees). +::: + ## Multi selection -Apply the `multiSelect` prop on the Tree View to let users select multiple items. +Use the `multiSelect` prop to enable multi-selection. {{"demo": "MultiSelectTreeView.js"}} +:::success +When the Tree View uses multi selection, you can select multiple items using the mouse in two ways: + +- To select multiple independent items, hold <kbd class="key">Ctrl</kbd> (or <kbd class="key">⌘ Command</kbd> on macOS) and click the items. +- To select a range of items, click on the first item of the range, then hold the <kbd class="key">Shift</kbd> key while clicking on the last item of the range. + +You can also use the [keyboard shortcuts](/x/react-tree-view/accessibility/#on-multi-select-trees) to select items. +::: + ## Disable selection Use the `disableSelection` prop if you don't want your items to be selectable: diff --git a/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.js b/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.js new file mode 100644 index 000000000000..674e7b6a5637 --- /dev/null +++ b/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.js @@ -0,0 +1,46 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; + +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; + +const MUI_X_PRODUCTS = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function IndentationAtItemLevel() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + experimentalFeatures={{ indentationAtItemLevel: true }} + defaultExpandedItems={['grid']} + /> + </Box> + ); +} diff --git a/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.tsx b/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.tsx new file mode 100644 index 000000000000..0b4c629dd37f --- /dev/null +++ b/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { TreeViewBaseItem } from '@mui/x-tree-view/models'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; + +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function IndentationAtItemLevel() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + experimentalFeatures={{ indentationAtItemLevel: true }} + defaultExpandedItems={['grid']} + /> + </Box> + ); +} diff --git a/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.tsx.preview b/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.tsx.preview new file mode 100644 index 000000000000..659fb32599af --- /dev/null +++ b/docs/data/tree-view/tree-item-customization/IndentationAtItemLevel.tsx.preview @@ -0,0 +1,5 @@ +<RichTreeView + items={MUI_X_PRODUCTS} + experimentalFeatures={{ indentationAtItemLevel: true }} + defaultExpandedItems={['grid']} +/> \ No newline at end of file diff --git a/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.js b/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.js new file mode 100644 index 000000000000..05f7fb429469 --- /dev/null +++ b/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.js @@ -0,0 +1,46 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; + +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; + +const MUI_X_PRODUCTS = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function ItemChildrenIndentationProp() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + itemChildrenIndentation={24} + defaultExpandedItems={['grid']} + /> + </Box> + ); +} diff --git a/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.tsx b/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.tsx new file mode 100644 index 000000000000..fc379bc83c4a --- /dev/null +++ b/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.tsx @@ -0,0 +1,46 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import { TreeViewBaseItem } from '@mui/x-tree-view/models'; +import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; + +const MUI_X_PRODUCTS: TreeViewBaseItem[] = [ + { + id: 'grid', + label: 'Data Grid', + children: [ + { id: 'grid-community', label: '@mui/x-data-grid' }, + { id: 'grid-pro', label: '@mui/x-data-grid-pro' }, + { id: 'grid-premium', label: '@mui/x-data-grid-premium' }, + ], + }, + { + id: 'pickers', + label: 'Date and Time Pickers', + children: [ + { id: 'pickers-community', label: '@mui/x-date-pickers' }, + { id: 'pickers-pro', label: '@mui/x-date-pickers-pro' }, + ], + }, + { + id: 'charts', + label: 'Charts', + children: [{ id: 'charts-community', label: '@mui/x-charts' }], + }, + { + id: 'tree-view', + label: 'Tree View', + children: [{ id: 'tree-view-community', label: '@mui/x-tree-view' }], + }, +]; + +export default function ItemChildrenIndentationProp() { + return ( + <Box sx={{ minHeight: 352, minWidth: 250 }}> + <RichTreeView + items={MUI_X_PRODUCTS} + itemChildrenIndentation={24} + defaultExpandedItems={['grid']} + /> + </Box> + ); +} diff --git a/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.tsx.preview b/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.tsx.preview new file mode 100644 index 000000000000..3f52945434cd --- /dev/null +++ b/docs/data/tree-view/tree-item-customization/ItemChildrenIndentationProp.tsx.preview @@ -0,0 +1,5 @@ +<RichTreeView + items={MUI_X_PRODUCTS} + itemChildrenIndentation={24} + defaultExpandedItems={['grid']} +/> \ No newline at end of file diff --git a/docs/data/tree-view/tree-item-customization/tree-item-customization.md b/docs/data/tree-view/tree-item-customization/tree-item-customization.md new file mode 100644 index 000000000000..ffc3be81307a --- /dev/null +++ b/docs/data/tree-view/tree-item-customization/tree-item-customization.md @@ -0,0 +1,71 @@ +--- +productId: x-tree-view +title: Tree Item Customization +components: SimpleTreeView, RichTreeView, TreeItem, TreeItem2 +packageName: '@mui/x-tree-view' +githubLabel: 'component: tree view' +waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/treeview/ +--- + +# Tree Item Customization + +<p class="description">Learn how to customize the Tree Item component.</p> + +## Basics + +### Change nested item's indentation + +Use the `itemChildrenIndentation` prop to change the indentation of the nested items. +By default, a nested item is indented by `12px` from its parent item. + +{{"demo": "ItemChildrenIndentationProp.js"}} + +:::success +This feature is compatible with both the `TreeItem` and `TreeItem2` components +If you are using a custom Tree Item component, and you want to override the padding, +then apply the following padding to your `groupTransition` element: + +```ts +const CustomTreeItem2GroupTransition = styled(TreeItem2GroupTransition)(({ theme }) => ({ + // ...other styles + paddingLeft: `var(--TreeView-itemChildrenIndentation)`, +} +``` + +If you are using the `indentationAtItemLevel` prop, then instead apply the following padding to your `content` element: + +```ts +const CustomTreeItem2Content = styled(TreeItem2Content)(({ theme }) => ({ + // ...other styles + paddingLeft: + `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`, +} +``` + +::: + +### Apply the nested item's indentation at the item level + +By default, the indentation of nested items is applied by the `groupTransition` slot of its parent (i.e.: the DOM element that wraps all the children of a given item). +This approach is not compatible with upcoming features like the reordering of items using drag & drop. + +To apply the indentation at the item level (i.e.: have each item responsible for setting its own indentation using the `padding-left` CSS property on its `content` slot), +you can use the `indentationAtItemLevel` experimental feature. +It will become the default behavior in the next major version of the Tree View component. + +{{"demo": "IndentationAtItemLevel.js"}} + +:::success +This feature is compatible with both the `TreeItem` and `TreeItem2` components and with the `itemChildrenIndentation` prop. +If you are using a custom Tree Item component, and you want to override the padding, +then apply the following padding to your `content` element: + +```ts +const CustomTreeItem2Content = styled(TreeItem2Content)(({ theme }) => ({ + // ...other styles + paddingLeft: + `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`, +} +``` + +::: diff --git a/docs/package.json b/docs/package.json index 4f7f9ea67383..ea824c72a9dd 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,27 +14,27 @@ "serve": "serve ./export -l 3010", "create-playground": "cpy --cwd=scripts playground.template.tsx ../../pages/playground --rename=index.tsx", "typescript": "tsc -p tsconfig.json", - "typescript:transpile": "cross-env BABEL_ENV=development babel-node --extensions \".tsx,.ts,.js\" scripts/formattedTSDemos", - "typescript:transpile:dev": "cross-env BABEL_ENV=development babel-node --extensions \".tsx,.ts,.js\" scripts/formattedTSDemos --watch", - "populate:demos": "cross-env BABEL_ENV=development babel-node --extensions \".tsx,.ts,.js\" scripts/populatePickersDemos" + "typescript:transpile": "cross-env BABEL_ENV=development node scripts/formattedTSDemos", + "typescript:transpile:dev": "cross-env BABEL_ENV=development node scripts/formattedTSDemos --watch", + "populate:demos": "tsx scripts/populatePickersDemos" }, "dependencies": { - "@babel/core": "^7.24.5", - "@babel/runtime": "^7.24.5", - "@babel/runtime-corejs2": "^7.24.5", + "@babel/core": "^7.24.6", + "@babel/runtime": "^7.24.6", + "@babel/runtime-corejs2": "^7.24.6", "@docsearch/react": "^3.6.0", "@emotion/cache": "^11.11.0", "@emotion/react": "^11.11.4", "@emotion/server": "^11.11.0", "@emotion/styled": "^11.11.5", "@mui/base": "^5.0.0-beta.40", - "@mui/icons-material": "^5.15.14", - "@mui/joy": "^5.0.0-beta.32", - "@mui/lab": "^5.0.0-alpha.169", - "@mui/material": "^5.15.14", + "@mui/icons-material": "^5.15.19", + "@mui/joy": "5.0.0-beta.32", + "@mui/lab": "^5.0.0-alpha.170", + "@mui/material": "^5.15.19", "@mui/material-nextjs": "^5.15.11", - "@mui/styles": "^5.15.14", - "@mui/system": "^5.15.14", + "@mui/styles": "^5.15.19", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@mui/x-charts": "workspace:*", "@mui/x-data-grid": "workspace:*", @@ -69,7 +69,6 @@ "luxon": "^3.4.4", "lz-string": "^1.5.0", "markdown-to-jsx": "^7.4.7", - "marked": "^5.1.2", "moment": "^2.30.1", "moment-hijri": "^2.1.2", "moment-jalaali": "^0.10.0", @@ -79,39 +78,38 @@ "postcss": "^8.4.38", "prismjs": "^1.29.0", "prop-types": "^15.8.1", - "raw-loader": "^1.0.0", "react": "^18.2.0", "react-docgen": "^5.4.3", "react-dom": "^18.2.0", - "react-hook-form": "^7.51.4", + "react-hook-form": "^7.51.5", "react-is": "^18.2.0", - "react-router": "^6.22.3", - "react-router-dom": "^6.22.3", + "react-router": "^6.23.1", + "react-router-dom": "^6.23.1", "react-runner": "^1.0.3", "react-simple-code-editor": "^0.13.1", - "recast": "^0.23.6", - "rimraf": "^5.0.5", + "recast": "^0.23.9", + "rimraf": "^5.0.7", "rxjs": "^7.8.1", - "styled-components": "^6.1.8", - "stylis": "^4.3.1", + "styled-components": "^6.1.11", + "stylis": "^4.3.2", "stylis-plugin-rtl": "^2.1.1", - "webpack-bundle-analyzer": "^4.10.1" + "webpack-bundle-analyzer": "^4.10.2" }, "devDependencies": { - "@babel/plugin-transform-react-constant-elements": "^7.24.1", - "@babel/preset-typescript": "^7.24.1", + "@babel/plugin-transform-react-constant-elements": "^7.24.6", + "@babel/preset-typescript": "^7.24.6", "@mui/internal-docs-utils": "^1.0.4", "@mui/internal-scripts": "^1.0.3", "@types/chance": "^1.1.6", "@types/d3-scale": "^4.0.8", "@types/doctrine": "^0.0.9", - "@types/lodash": "^4.17.1", + "@types/lodash": "^4.17.4", "@types/luxon": "^3.4.2", "@types/moment-hijri": "^2.1.4", "@types/moment-jalaali": "^0.7.9", - "@types/react-dom": "18.2.19", + "@types/react-dom": "18.2.25", "@types/react-router-dom": "^5.3.3", - "@types/stylis": "^4.2.5", + "@types/stylis": "^4.2.6", "@types/webpack-bundle-analyzer": "^4.7.0", "gm": "^1.25.0", "serve": "^14.2.3" diff --git a/docs/pages/_app.js b/docs/pages/_app.js index a9db3930db71..69982b1a9e72 100644 --- a/docs/pages/_app.js +++ b/docs/pages/_app.js @@ -41,7 +41,10 @@ ponyfillGlobal.muiDocConfig = { csbIncludePeerDependencies: (deps, { versions }) => { const newDeps = { ...deps }; - newDeps['@mui/material'] = versions['@mui/material']; + // #default-branch-switch + // Check which version of `@mui/material` should be resolved when opening docs examples in StackBlitz or CodeSandbox + newDeps['@mui/material'] = + versions['@mui/material'] !== 'next' ? versions['@mui/material'] : 'latest'; if (newDeps['@mui/x-data-grid-generator']) { newDeps['@mui/icons-material'] = versions['@mui/icons-material']; @@ -58,6 +61,7 @@ ponyfillGlobal.muiDocConfig = { '@mui/x-date-pickers': getMuiPackageVersion('x-date-pickers', muiCommitRef), '@mui/x-date-pickers-pro': getMuiPackageVersion('x-date-pickers-pro', muiCommitRef), '@mui/x-charts': getMuiPackageVersion('x-charts', muiCommitRef), + '@mui/x-charts-pro': getMuiPackageVersion('x-charts-pro', muiCommitRef), '@mui/x-tree-view': getMuiPackageVersion('x-tree-view', muiCommitRef), '@mui/x-tree-view-pro': getMuiPackageVersion('x-tree-view-pro', muiCommitRef), exceljs: 'latest', diff --git a/docs/pages/x/api/charts/axis-config.json b/docs/pages/x/api/charts/axis-config.json index ffa4d0a84105..8f826848b286 100644 --- a/docs/pages/x/api/charts/axis-config.json +++ b/docs/pages/x/api/charts/axis-config.json @@ -4,39 +4,18 @@ "properties": { "id": { "type": { "description": "AxisId" }, "required": true }, "scaleType": { "type": { "description": "'linear'" }, "required": true }, - "axisId": { "type": { "description": "AxisId" } }, - "classes": { "type": { "description": "Partial<ChartsAxisClasses>" } }, "colorMap": { "type": { "description": "ContinuousColorConfig | PiecewiseColorConfig" } }, "data": { "type": { "description": "V[]" } }, "dataKey": { "type": { "description": "string" } }, - "disableLine": { "type": { "description": "boolean" }, "default": "false" }, - "disableTicks": { "type": { "description": "boolean" }, "default": "false" }, - "fill": { "type": { "description": "string" }, "default": "'currentColor'" }, "hideTooltip": { "type": { "description": "boolean" } }, - "label": { "type": { "description": "string" } }, - "labelFontSize": { "type": { "description": "number" }, "default": "14" }, - "labelStyle": { "type": { "description": "ChartsTextProps['style']" } }, "max": { "type": { "description": "number | Date" } }, "min": { "type": { "description": "number | Date" } }, - "position": { "type": { "description": "'top' | 'bottom'" } }, "reverse": { "type": { "description": "boolean" } }, - "slotProps": { - "type": { "description": "Partial<ChartsAxisSlotProps>" }, - "default": "{}" - }, - "slots": { "type": { "description": "Partial<ChartsAxisSlots>" }, "default": "{}" }, - "stroke": { "type": { "description": "string" }, "default": "'currentColor'" }, - "tickFontSize": { "type": { "description": "number" }, "default": "12" }, "tickInterval": { "type": { "description": "'auto' | ((value: any, index: number) => boolean) | any[]" }, "default": "'auto'" }, - "tickLabelInterval": { - "type": { "description": "'auto' | ((value: any, index: number) => boolean)" }, - "default": "'auto'" - }, "tickLabelPlacement": { "type": { "description": "'middle' | 'tick'" }, "default": "'middle'" }, - "tickLabelStyle": { "type": { "description": "ChartsTextProps['style']" } }, "tickMaxStep": { "type": { "description": "number" } }, "tickMinStep": { "type": { "description": "number" } }, "tickNumber": { "type": { "description": "number" } }, @@ -44,7 +23,6 @@ "type": { "description": "'start' | 'end' | 'middle' | 'extremities'" }, "default": "'extremities'" }, - "tickSize": { "type": { "description": "number" }, "default": "6" }, "valueFormatter": { "type": { "description": "(value: V, context: AxisValueFormatterContext) => string" } } diff --git a/docs/pages/x/api/charts/bar-chart.json b/docs/pages/x/api/charts/bar-chart.json index 809e11c9a76c..733d559d019e 100644 --- a/docs/pages/x/api/charts/bar-chart.json +++ b/docs/pages/x/api/charts/bar-chart.json @@ -14,6 +14,7 @@ "text": "highlight docs" } }, + "barLabel": { "type": { "name": "union", "description": "'value'<br>| func" } }, "borderRadius": { "type": { "name": "number" } }, "bottomAxis": { "type": { "name": "union", "description": "object<br>| string" }, @@ -29,6 +30,12 @@ "type": { "name": "shape", "description": "{ horizontal?: bool, vertical?: bool }" } }, "height": { "type": { "name": "number" } }, + "highlightedItem": { + "type": { + "name": "shape", + "description": "{ dataIndex?: number, seriesId?: number<br>| string }" + } + }, "layout": { "type": { "name": "enum", "description": "'horizontal'<br>| 'vertical'" }, "default": "'vertical'" @@ -52,6 +59,13 @@ "describedArgs": ["event", "data"] } }, + "onHighlightChange": { + "type": { "name": "func" }, + "signature": { + "type": "function(highlightedItem: HighlightItemData | null) => void", + "describedArgs": ["highlightedItem"] + } + }, "onItemClick": { "type": { "name": "func" }, "signature": { @@ -85,13 +99,13 @@ "xAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } }, "yAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'left'<br>| 'right', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } } }, @@ -131,6 +145,12 @@ "default": "BarElementPath", "class": null }, + { + "name": "barLabel", + "description": "The component that renders the bar label.", + "default": "BarLabel", + "class": null + }, { "name": "legend", "description": "Custom rendering of the legend.", diff --git a/docs/pages/x/api/charts/bar-label.js b/docs/pages/x/api/charts/bar-label.js new file mode 100644 index 000000000000..48aeaf5b8d31 --- /dev/null +++ b/docs/pages/x/api/charts/bar-label.js @@ -0,0 +1,23 @@ +import * as React from 'react'; +import ApiPage from 'docs/src/modules/components/ApiPage'; +import mapApiPageTranslations from 'docs/src/modules/utils/mapApiPageTranslations'; +import jsonPageContent from './bar-label.json'; + +export default function Page(props) { + const { descriptions, pageContent } = props; + return <ApiPage descriptions={descriptions} pageContent={pageContent} />; +} + +Page.getInitialProps = () => { + const req = require.context( + 'docsx/translations/api-docs/charts/bar-label', + false, + /\.\/bar-label.*.json$/, + ); + const descriptions = mapApiPageTranslations(req); + + return { + descriptions, + pageContent: jsonPageContent, + }; +}; diff --git a/docs/pages/x/api/charts/bar-label.json b/docs/pages/x/api/charts/bar-label.json new file mode 100644 index 000000000000..b5a68df0e457 --- /dev/null +++ b/docs/pages/x/api/charts/bar-label.json @@ -0,0 +1,41 @@ +{ + "props": {}, + "name": "BarLabel", + "imports": [ + "import { BarLabel } from '@mui/x-charts/BarChart';", + "import { BarLabel } from '@mui/x-charts';" + ], + "slots": [ + { + "name": "barLabel", + "description": "The component that renders the bar label.", + "default": "BarLabel", + "class": null + } + ], + "classes": [ + { + "key": "faded", + "className": "MuiBarLabel-faded", + "description": "Styles applied to the root element if it is faded.", + "isGlobal": false + }, + { + "key": "highlighted", + "className": "MuiBarLabel-highlighted", + "description": "Styles applied to the root element if it is highlighted.", + "isGlobal": false + }, + { + "key": "root", + "className": "MuiBarLabel-root", + "description": "Styles applied to the root element.", + "isGlobal": false + } + ], + "muiName": "MuiBarLabel", + "filename": "/packages/x-charts/src/BarChart/BarLabel/BarLabel.tsx", + "inheritance": null, + "demos": "<ul><li><a href=\"/x/react-charts/bars/\">Charts - Bars</a></li></ul>", + "cssComponent": false +} diff --git a/docs/pages/x/api/charts/bar-plot.json b/docs/pages/x/api/charts/bar-plot.json index 51afe2f2a2d1..cb04173a4311 100644 --- a/docs/pages/x/api/charts/bar-plot.json +++ b/docs/pages/x/api/charts/bar-plot.json @@ -1,5 +1,6 @@ { "props": { + "barLabel": { "type": { "name": "union", "description": "'value'<br>| func" } }, "borderRadius": { "type": { "name": "number" } }, "onItemClick": { "type": { "name": "func" }, @@ -27,6 +28,12 @@ "description": "The component that renders the bar.", "default": "BarElementPath", "class": null + }, + { + "name": "barLabel", + "description": "The component that renders the bar label.", + "default": "BarLabel", + "class": null } ], "classes": [], diff --git a/docs/pages/x/api/charts/chart-container.json b/docs/pages/x/api/charts/chart-container.json index 00b3c7cc9f45..bd978a54494a 100644 --- a/docs/pages/x/api/charts/chart-container.json +++ b/docs/pages/x/api/charts/chart-container.json @@ -12,6 +12,12 @@ }, "dataset": { "type": { "name": "arrayOf", "description": "Array<object>" } }, "disableAxisListener": { "type": { "name": "bool" }, "default": "false" }, + "highlightedItem": { + "type": { + "name": "shape", + "description": "{ dataIndex?: number, seriesId?: number<br>| string }" + } + }, "margin": { "type": { "name": "shape", @@ -19,16 +25,24 @@ }, "default": "object Depends on the charts type." }, + "onHighlightChange": { + "type": { "name": "func" }, + "signature": { + "type": "function(highlightedItem: HighlightItemData | null) => void", + "describedArgs": ["highlightedItem"] + } + }, + "plugins": { "type": { "name": "arrayOf", "description": "Array<object>" } }, "xAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } }, "yAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'left'<br>| 'right', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } } }, diff --git a/docs/pages/x/api/charts/line-chart.json b/docs/pages/x/api/charts/line-chart.json index dc1f17344b4f..a80423dcca65 100644 --- a/docs/pages/x/api/charts/line-chart.json +++ b/docs/pages/x/api/charts/line-chart.json @@ -30,6 +30,12 @@ "type": { "name": "shape", "description": "{ horizontal?: bool, vertical?: bool }" } }, "height": { "type": { "name": "number" } }, + "highlightedItem": { + "type": { + "name": "shape", + "description": "{ dataIndex?: number, seriesId?: number<br>| string }" + } + }, "leftAxis": { "type": { "name": "union", "description": "object<br>| string" }, "default": "yAxisIds[0] The id of the first provided axis" @@ -50,6 +56,13 @@ "describedArgs": ["event", "data"] } }, + "onHighlightChange": { + "type": { "name": "func" }, + "signature": { + "type": "function(highlightedItem: HighlightItemData | null) => void", + "describedArgs": ["highlightedItem"] + } + }, "onLineClick": { "type": { "name": "func" } }, "onMarkClick": { "type": { "name": "func" } }, "rightAxis": { @@ -79,13 +92,13 @@ "xAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } }, "yAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'left'<br>| 'right', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } } }, diff --git a/docs/pages/x/api/charts/pie-chart.json b/docs/pages/x/api/charts/pie-chart.json index 1049909ffa9e..0ea4ae013208 100644 --- a/docs/pages/x/api/charts/pie-chart.json +++ b/docs/pages/x/api/charts/pie-chart.json @@ -26,6 +26,12 @@ "dataset": { "type": { "name": "arrayOf", "description": "Array<object>" } }, "disableAxisListener": { "type": { "name": "bool" }, "default": "false" }, "height": { "type": { "name": "number" } }, + "highlightedItem": { + "type": { + "name": "shape", + "description": "{ dataIndex?: number, seriesId?: number<br>| string }" + } + }, "leftAxis": { "type": { "name": "union", "description": "object<br>| string" }, "default": "null" @@ -47,6 +53,13 @@ }, "default": "object Depends on the charts type." }, + "onHighlightChange": { + "type": { "name": "func" }, + "signature": { + "type": "function(highlightedItem: HighlightItemData | null) => void", + "describedArgs": ["highlightedItem"] + } + }, "onItemClick": { "type": { "name": "func" } }, "rightAxis": { "type": { "name": "union", "description": "object<br>| string" }, @@ -75,13 +88,13 @@ "xAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } }, "yAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'left'<br>| 'right', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } } }, diff --git a/docs/pages/x/api/charts/responsive-chart-container.json b/docs/pages/x/api/charts/responsive-chart-container.json index d39623b6c9d8..cc76f819d027 100644 --- a/docs/pages/x/api/charts/responsive-chart-container.json +++ b/docs/pages/x/api/charts/responsive-chart-container.json @@ -11,6 +11,12 @@ "dataset": { "type": { "name": "arrayOf", "description": "Array<object>" } }, "disableAxisListener": { "type": { "name": "bool" }, "default": "false" }, "height": { "type": { "name": "number" } }, + "highlightedItem": { + "type": { + "name": "shape", + "description": "{ dataIndex?: number, seriesId?: number<br>| string }" + } + }, "margin": { "type": { "name": "shape", @@ -18,17 +24,25 @@ }, "default": "object Depends on the charts type." }, + "onHighlightChange": { + "type": { "name": "func" }, + "signature": { + "type": "function(highlightedItem: HighlightItemData | null) => void", + "describedArgs": ["highlightedItem"] + } + }, + "plugins": { "type": { "name": "arrayOf", "description": "Array<object>" } }, "width": { "type": { "name": "number" } }, "xAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } }, "yAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'left'<br>| 'right', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } } }, diff --git a/docs/pages/x/api/charts/scatter-chart.json b/docs/pages/x/api/charts/scatter-chart.json index 0a0efd96ca71..42263922241a 100644 --- a/docs/pages/x/api/charts/scatter-chart.json +++ b/docs/pages/x/api/charts/scatter-chart.json @@ -30,6 +30,12 @@ "type": { "name": "shape", "description": "{ horizontal?: bool, vertical?: bool }" } }, "height": { "type": { "name": "number" } }, + "highlightedItem": { + "type": { + "name": "shape", + "description": "{ dataIndex?: number, seriesId?: number<br>| string }" + } + }, "leftAxis": { "type": { "name": "union", "description": "object<br>| string" }, "default": "yAxisIds[0] The id of the first provided axis" @@ -42,6 +48,13 @@ }, "default": "object Depends on the charts type." }, + "onHighlightChange": { + "type": { "name": "func" }, + "signature": { + "type": "function(highlightedItem: HighlightItemData | null) => void", + "describedArgs": ["highlightedItem"] + } + }, "onItemClick": { "type": { "name": "func" }, "signature": { @@ -76,13 +89,13 @@ "xAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } }, "yAxis": { "type": { "name": "arrayOf", - "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" + "description": "Array<{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'left'<br>| 'right', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }>" } }, "zAxis": { diff --git a/docs/pages/x/api/charts/spark-line-chart.json b/docs/pages/x/api/charts/spark-line-chart.json index ac8392ac969e..f6aeab26c810 100644 --- a/docs/pages/x/api/charts/spark-line-chart.json +++ b/docs/pages/x/api/charts/spark-line-chart.json @@ -12,6 +12,12 @@ "dataset": { "type": { "name": "arrayOf", "description": "Array<object>" } }, "disableAxisListener": { "type": { "name": "bool" }, "default": "false" }, "height": { "type": { "name": "number" } }, + "highlightedItem": { + "type": { + "name": "shape", + "description": "{ dataIndex?: number, seriesId?: number<br>| string }" + } + }, "margin": { "type": { "name": "shape", @@ -19,6 +25,13 @@ }, "default": "{\n top: 5,\n bottom: 5,\n left: 5,\n right: 5,\n}" }, + "onHighlightChange": { + "type": { "name": "func" }, + "signature": { + "type": "function(highlightedItem: HighlightItemData | null) => void", + "describedArgs": ["highlightedItem"] + } + }, "plotType": { "type": { "name": "enum", "description": "'bar'<br>| 'line'" }, "default": "'line'" @@ -44,7 +57,7 @@ "xAxis": { "type": { "name": "shape", - "description": "{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'left'<br>| 'right'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }" + "description": "{ axisId?: number<br>| string, classes?: object, colorMap?: { colors: Array<string>, type: 'ordinal', unknownColor?: string, values?: Array<Date<br>| number<br>| string> }<br>| { color: Array<string><br>| func, max?: Date<br>| number, min?: Date<br>| number, type: 'continuous' }<br>| { colors: Array<string>, thresholds: Array<Date<br>| number>, type: 'piecewise' }, data?: array, dataKey?: string, disableLine?: bool, disableTicks?: bool, fill?: string, hideTooltip?: bool, id?: number<br>| string, label?: string, labelFontSize?: number, labelStyle?: object, max?: Date<br>| number, min?: Date<br>| number, position?: 'bottom'<br>| 'top', reverse?: bool, scaleType?: 'band'<br>| 'linear'<br>| 'log'<br>| 'point'<br>| 'pow'<br>| 'sqrt'<br>| 'time'<br>| 'utc', slotProps?: object, slots?: object, stroke?: string, tickFontSize?: number, tickInterval?: 'auto'<br>| array<br>| func, tickLabelInterval?: 'auto'<br>| func, tickLabelPlacement?: 'middle'<br>| 'tick', tickLabelStyle?: object, tickMaxStep?: number, tickMinStep?: number, tickNumber?: number, tickPlacement?: 'end'<br>| 'extremities'<br>| 'middle'<br>| 'start', tickSize?: number, valueFormatter?: func }" } } }, diff --git a/docs/pages/x/api/data-grid/data-grid-premium.json b/docs/pages/x/api/data-grid/data-grid-premium.json index 5800b14cc52f..9c1b3c520566 100644 --- a/docs/pages/x/api/data-grid/data-grid-premium.json +++ b/docs/pages/x/api/data-grid/data-grid-premium.json @@ -673,7 +673,7 @@ { "name": "columnHeaders", "description": "Component responsible for rendering the column headers.", - "default": "DataGridColumnHeaders", + "default": "GridColumnHeaders", "class": "MuiDataGridPremium-columnHeaders" }, { diff --git a/docs/pages/x/api/data-grid/data-grid-pro.json b/docs/pages/x/api/data-grid/data-grid-pro.json index 5e96f8adbe84..adac731e3a34 100644 --- a/docs/pages/x/api/data-grid/data-grid-pro.json +++ b/docs/pages/x/api/data-grid/data-grid-pro.json @@ -608,7 +608,7 @@ { "name": "columnHeaders", "description": "Component responsible for rendering the column headers.", - "default": "DataGridColumnHeaders", + "default": "GridColumnHeaders", "class": "MuiDataGridPro-columnHeaders" }, { diff --git a/docs/pages/x/api/data-grid/data-grid.json b/docs/pages/x/api/data-grid/data-grid.json index 8fad1a4c4063..b7d2b16bc7ea 100644 --- a/docs/pages/x/api/data-grid/data-grid.json +++ b/docs/pages/x/api/data-grid/data-grid.json @@ -506,7 +506,7 @@ { "name": "columnHeaders", "description": "Component responsible for rendering the column headers.", - "default": "DataGridColumnHeaders", + "default": "GridColumnHeaders", "class": "MuiDataGrid-columnHeaders" }, { diff --git a/docs/pages/x/api/data-grid/grid-csv-export-options.json b/docs/pages/x/api/data-grid/grid-csv-export-options.json index 5d2236f5eb6f..bb210b233a77 100644 --- a/docs/pages/x/api/data-grid/grid-csv-export-options.json +++ b/docs/pages/x/api/data-grid/grid-csv-export-options.json @@ -9,6 +9,7 @@ "properties": { "allColumns": { "type": { "description": "boolean" }, "default": "false" }, "delimiter": { "type": { "description": "string" }, "default": "','" }, + "escapeFormulas": { "type": { "description": "boolean" }, "default": "true" }, "fields": { "type": { "description": "string[]" } }, "fileName": { "type": { "description": "string" }, "default": "document.title" }, "getRowsToExport": { diff --git a/docs/pages/x/api/data-grid/grid-excel-export-options.json b/docs/pages/x/api/data-grid/grid-excel-export-options.json index ed0fd0297e1d..97bfbc6bde65 100644 --- a/docs/pages/x/api/data-grid/grid-excel-export-options.json +++ b/docs/pages/x/api/data-grid/grid-excel-export-options.json @@ -9,6 +9,11 @@ "isPremiumPlan": true }, "columnsStyles": { "type": { "description": "ColumnsStylesInterface" }, "isPremiumPlan": true }, + "escapeFormulas": { + "type": { "description": "boolean" }, + "default": "true", + "isPremiumPlan": true + }, "exceljsPostProcess": { "type": { "description": "(processInput: GridExceljsProcessInput) => Promise<void>" diff --git a/docs/pages/x/api/date-pickers/pickers-layout.json b/docs/pages/x/api/date-pickers/pickers-layout.json index f340a4c17beb..d4786c77062e 100644 --- a/docs/pages/x/api/date-pickers/pickers-layout.json +++ b/docs/pages/x/api/date-pickers/pickers-layout.json @@ -1,5 +1,6 @@ { "props": { + "isRtl": { "type": { "name": "bool" }, "required": true }, "classes": { "type": { "name": "object" }, "additionalInfo": { "cssApi": true } }, "orientation": { "type": { "name": "enum", "description": "'landscape'<br>| 'portrait'" } diff --git a/docs/pages/x/api/tree-view/rich-tree-view.json b/docs/pages/x/api/tree-view/rich-tree-view.json index c80f7ce68570..7da4e28d56f0 100644 --- a/docs/pages/x/api/tree-view/rich-tree-view.json +++ b/docs/pages/x/api/tree-view/rich-tree-view.json @@ -16,6 +16,9 @@ "disabledItemsFocusable": { "type": { "name": "bool" }, "default": "false" }, "disableSelection": { "type": { "name": "bool" }, "default": "false" }, "expandedItems": { "type": { "name": "arrayOf", "description": "Array<string>" } }, + "experimentalFeatures": { + "type": { "name": "shape", "description": "{ indentationAtItemLevel?: bool }" } + }, "getItemId": { "type": { "name": "func" }, "default": "(item) => item.id", @@ -43,6 +46,10 @@ "returned": "boolean" } }, + "itemChildrenIndentation": { + "type": { "name": "union", "description": "number<br>| string" }, + "default": "12px" + }, "multiSelect": { "type": { "name": "bool" }, "default": "false" }, "onExpandedItemsChange": { "type": { "name": "func" }, @@ -135,6 +142,6 @@ "forwardsRefTo": "HTMLUListElement", "filename": "/packages/x-tree-view/src/RichTreeView/RichTreeView.tsx", "inheritance": null, - "demos": "<ul><li><a href=\"/x/react-tree-view/getting-started/\">Tree View - Getting Started</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/expansion/\">Rich Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/focus/\">Rich Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/items/\">Rich Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/selection/\">Rich Tree View - Selection</a></li></ul>", + "demos": "<ul><li><a href=\"/x/react-tree-view/getting-started/\">Tree View - Getting Started</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/expansion/\">Rich Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/focus/\">Rich Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/items/\">Rich Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/selection/\">Rich Tree View - Selection</a></li>\n<li><a href=\"/x/react-tree-view/tree-item-customization/\">Tree Item Customization</a></li></ul>", "cssComponent": false } diff --git a/docs/pages/x/api/tree-view/simple-tree-view.json b/docs/pages/x/api/tree-view/simple-tree-view.json index f346fcd7a700..1c52f9e03646 100644 --- a/docs/pages/x/api/tree-view/simple-tree-view.json +++ b/docs/pages/x/api/tree-view/simple-tree-view.json @@ -17,7 +17,14 @@ "disabledItemsFocusable": { "type": { "name": "bool" }, "default": "false" }, "disableSelection": { "type": { "name": "bool" }, "default": "false" }, "expandedItems": { "type": { "name": "arrayOf", "description": "Array<string>" } }, + "experimentalFeatures": { + "type": { "name": "shape", "description": "{ indentationAtItemLevel?: bool }" } + }, "id": { "type": { "name": "string" } }, + "itemChildrenIndentation": { + "type": { "name": "union", "description": "number<br>| string" }, + "default": "12px" + }, "multiSelect": { "type": { "name": "bool" }, "default": "false" }, "onExpandedItemsChange": { "type": { "name": "func" }, @@ -100,6 +107,6 @@ "forwardsRefTo": "HTMLUListElement", "filename": "/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.tsx", "inheritance": null, - "demos": "<ul><li><a href=\"/x/react-tree-view/getting-started/\">Tree View - Getting Started</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/expansion/\">Simple Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/focus/\">Simple Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/items/\">Simple Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/selection/\">Simple Tree View - Selection</a></li></ul>", + "demos": "<ul><li><a href=\"/x/react-tree-view/getting-started/\">Tree View - Getting Started</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/expansion/\">Simple Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/focus/\">Simple Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/items/\">Simple Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/selection/\">Simple Tree View - Selection</a></li>\n<li><a href=\"/x/react-tree-view/tree-item-customization/\">Tree Item Customization</a></li></ul>", "cssComponent": false } diff --git a/docs/pages/x/api/tree-view/tree-item-2.json b/docs/pages/x/api/tree-view/tree-item-2.json index 499dc44eb46e..00c9508458ca 100644 --- a/docs/pages/x/api/tree-view/tree-item-2.json +++ b/docs/pages/x/api/tree-view/tree-item-2.json @@ -96,6 +96,6 @@ "muiName": "MuiTreeItem2", "filename": "/packages/x-tree-view/src/TreeItem2/TreeItem2.tsx", "inheritance": null, - "demos": "<ul><li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li></ul>", + "demos": "<ul><li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/tree-item-customization/\">Tree Item Customization</a></li></ul>", "cssComponent": false } diff --git a/docs/pages/x/api/tree-view/tree-item.json b/docs/pages/x/api/tree-view/tree-item.json index 07b0b51a093b..290aa0e5881d 100644 --- a/docs/pages/x/api/tree-view/tree-item.json +++ b/docs/pages/x/api/tree-view/tree-item.json @@ -109,6 +109,6 @@ "forwardsRefTo": "HTMLLIElement", "filename": "/packages/x-tree-view/src/TreeItem/TreeItem.tsx", "inheritance": null, - "demos": "<ul><li><a href=\"/x/react-tree-view/getting-started/\">Tree View - Getting Started</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/expansion/\">Rich Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/focus/\">Rich Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/items/\">Rich Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/selection/\">Rich Tree View - Selection</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/expansion/\">Simple Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/focus/\">Simple Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/items/\">Simple Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/selection/\">Simple Tree View - Selection</a></li></ul>", + "demos": "<ul><li><a href=\"/x/react-tree-view/getting-started/\">Tree View - Getting Started</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/customization/\">Rich Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/expansion/\">Rich Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/focus/\">Rich Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/items/\">Rich Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/rich-tree-view/selection/\">Rich Tree View - Selection</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/customization/\">Simple Tree View - Customization</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/expansion/\">Simple Tree View - Expansion</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/focus/\">Simple Tree View - Focus</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/items/\">Simple Tree View - Items</a></li>\n<li><a href=\"/x/react-tree-view/simple-tree-view/selection/\">Simple Tree View - Selection</a></li>\n<li><a href=\"/x/react-tree-view/tree-item-customization/\">Tree Item Customization</a></li></ul>", "cssComponent": false } diff --git a/docs/pages/x/api/tree-view/tree-view.json b/docs/pages/x/api/tree-view/tree-view.json index 4fd0587a6b11..a528b9927844 100644 --- a/docs/pages/x/api/tree-view/tree-view.json +++ b/docs/pages/x/api/tree-view/tree-view.json @@ -17,7 +17,14 @@ "disabledItemsFocusable": { "type": { "name": "bool" }, "default": "false" }, "disableSelection": { "type": { "name": "bool" }, "default": "false" }, "expandedItems": { "type": { "name": "arrayOf", "description": "Array<string>" } }, + "experimentalFeatures": { + "type": { "name": "shape", "description": "{ indentationAtItemLevel?: bool }" } + }, "id": { "type": { "name": "string" } }, + "itemChildrenIndentation": { + "type": { "name": "union", "description": "number<br>| string" }, + "default": "12px" + }, "multiSelect": { "type": { "name": "bool" }, "default": "false" }, "onExpandedItemsChange": { "type": { "name": "func" }, @@ -101,5 +108,6 @@ "filename": "/packages/x-tree-view/src/TreeView/TreeView.tsx", "inheritance": null, "demos": "<ul><li><a href=\"/x/react-tree-view/getting-started/\">Tree View - Getting Started</a></li></ul>", - "cssComponent": false + "cssComponent": false, + "deprecated": true } diff --git a/docs/pages/x/react-date-pickers/accessibility.js b/docs/pages/x/react-date-pickers/accessibility.js new file mode 100644 index 000000000000..a3890966ee74 --- /dev/null +++ b/docs/pages/x/react-date-pickers/accessibility.js @@ -0,0 +1,7 @@ +import * as React from 'react'; +import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; +import * as pageProps from 'docsx/data/date-pickers/accessibility/accessibility.md?muiMarkdown'; + +export default function Page() { + return <MarkdownDocs {...pageProps} />; +} diff --git a/docs/pages/x/react-tree-view/tree-item-customization.js b/docs/pages/x/react-tree-view/tree-item-customization.js new file mode 100644 index 000000000000..af937e3ce020 --- /dev/null +++ b/docs/pages/x/react-tree-view/tree-item-customization.js @@ -0,0 +1,7 @@ +import * as React from 'react'; +import MarkdownDocs from 'docs/src/modules/components/MarkdownDocs'; +import * as pageProps from 'docsx/data/tree-view/tree-item-customization/tree-item-customization.md?muiMarkdown'; + +export default function Page() { + return <MarkdownDocs {...pageProps} />; +} diff --git a/docs/scripts/createXTypeScriptProjects.ts b/docs/scripts/createXTypeScriptProjects.ts index 071e11aadccb..3b859b06427a 100644 --- a/docs/scripts/createXTypeScriptProjects.ts +++ b/docs/scripts/createXTypeScriptProjects.ts @@ -317,6 +317,25 @@ export const createXTypeScriptProjects = () => { }), ); + // TODO x-charts-pro uncomment when making the package public + // projects.set( + // 'x-charts-pro', + // createXTypeScriptProject({ + // name: 'x-charts-pro', + // rootPath: path.join(workspaceRoot, 'packages/x-charts-pro'), + // entryPointPath: 'src/index.ts', + // documentationFolderName: 'charts', + // getComponentsWithPropTypes: getComponentPaths({ + // folders: ['src'], + // includeUnstableComponents: true, + // }), + // getComponentsWithApiDoc: getComponentPaths({ + // folders: ['src'], + // includeUnstableComponents: true, + // }), + // }), + // ); + projects.set( 'x-tree-view', createXTypeScriptProject({ diff --git a/docs/scripts/formattedTSDemos.js b/docs/scripts/formattedTSDemos.js index 10ca79e00b42..51eb1f82ea79 100644 --- a/docs/scripts/formattedTSDemos.js +++ b/docs/scripts/formattedTSDemos.js @@ -198,12 +198,12 @@ yargs return command .option('watch', { default: false, - description: 'transpiles demos as soon as they changed', + description: 'Transpile demos as soon as they change', type: 'boolean', }) .option('disable-cache', { default: false, - description: 'transpiles all demos even if they didnt change', + description: "Transpile all demos even if they didn't change", type: 'boolean', }); }, diff --git a/docs/scripts/generateProptypes.ts b/docs/scripts/generateProptypes.ts index 399128bc531e..b43a78c8c0b3 100644 --- a/docs/scripts/generateProptypes.ts +++ b/docs/scripts/generateProptypes.ts @@ -71,6 +71,7 @@ async function generateProptypes(project: XTypeScriptProject, sourceFile: string 'topAxis', 'leftAxis', 'rightAxis', + 'plugins', ]; if (propsToNotResolve.includes(name)) { return false; @@ -99,7 +100,7 @@ async function generateProptypes(project: XTypeScriptProject, sourceFile: string comment: [ '----------------------------- Warning --------------------------------', '| These PropTypes are generated from the TypeScript type definitions |', - '| To update them edit the TypeScript types and run "yarn proptypes" |', + '| To update them edit the TypeScript types and run "pnpm proptypes" |', '----------------------------------------------------------------------', ].join('\n'), reconcilePropTypes: (prop, previous, generated) => { diff --git a/docs/translations/api-docs/charts/axis-config.json b/docs/translations/api-docs/charts/axis-config.json index a0bc3d838875..feb903056b6a 100644 --- a/docs/translations/api-docs/charts/axis-config.json +++ b/docs/translations/api-docs/charts/axis-config.json @@ -3,10 +3,6 @@ "propertiesDescriptions": { "id": { "description": "Id used to identify the axis." }, "scaleType": { "description": "" }, - "axisId": { - "description": "The id of the axis to render.<br />If undefined, it will be the first defined axis." - }, - "classes": { "description": "Override or extend the styles applied to the component." }, "colorMap": { "description": "" }, "data": { "description": "The data used by <code>'band'</code> and <code>'point'</code> scales." @@ -14,35 +10,20 @@ "dataKey": { "description": "The key used to retrieve <code>data</code> from the <code>dataset</code> prop." }, - "disableLine": { "description": "If true, the axis line is disabled." }, - "disableTicks": { "description": "If true, the ticks are disabled." }, - "fill": { "description": "The fill color of the axis text." }, "hideTooltip": { "description": "If <code>true</code>, hide this value in the tooltip" }, - "label": { "description": "The label of the axis." }, - "labelFontSize": { "description": "The font size of the axis label." }, - "labelStyle": { "description": "The style applied to the axis label." }, "max": { "description": "The maximal value of the domain.<br />If not provided, it gets computed to display the entire chart data." }, "min": { "description": "The minimal value of the domain.<br />If not provided, it gets computed to display the entire chart data." }, - "position": { "description": "Position of the axis." }, "reverse": { "description": "If <code>true</code>, Reverse the axis scaleBand." }, - "slotProps": { "description": "The props used for each component slot." }, - "slots": { "description": "Overridable component slots." }, - "stroke": { "description": "The stroke color of the axis line." }, - "tickFontSize": { "description": "The font size of the axis ticks text." }, "tickInterval": { - "description": "Defines which ticks are displayed. Its value can be:<br />- 'auto' In such case the ticks are computed based on axis scale and other parameters.<br />- a filtering function of the form <code>(value, index) =&gt; boolean</code> which is available only if the axis has a data property.<br />- an array containing the values where ticks should be displayed." - }, - "tickLabelInterval": { - "description": "Defines which ticks get its label displayed. Its value can be:<br />- 'auto' In such case, labels are displayed if they do not overlap with the previous one.<br />- a filtering function of the form (value, index) => boolean. Warning: the index is tick index, not data ones." + "description": "Defines which ticks are displayed.<br />Its value can be:<br />- 'auto' In such case the ticks are computed based on axis scale and other parameters.<br />- a filtering function of the form <code>(value, index) =&gt; boolean</code> which is available only if the axis has "point" scale.<br />- an array containing the values where ticks should be displayed." }, "tickLabelPlacement": { "description": "The placement of ticks label. Can be the middle of the band, or the tick position.<br />Only used if scale is 'band'." }, - "tickLabelStyle": { "description": "The style applied to ticks text." }, "tickMaxStep": { "description": "Maximal step between two ticks.<br />When using time data, the value is assumed to be in ms.<br />Not supported by categorical axis (band, points)." }, @@ -55,7 +36,6 @@ "tickPlacement": { "description": "The placement of ticks in regard to the band interval.<br />Only used if scale is 'band'." }, - "tickSize": { "description": "The size of the ticks." }, "valueFormatter": { "description": "Formats the axis value." } } } diff --git a/docs/translations/api-docs/charts/bar-chart/bar-chart.json b/docs/translations/api-docs/charts/bar-chart/bar-chart.json index 88dc2317541f..b20ef3bdfad0 100644 --- a/docs/translations/api-docs/charts/bar-chart/bar-chart.json +++ b/docs/translations/api-docs/charts/bar-chart/bar-chart.json @@ -5,6 +5,9 @@ "description": "The configuration of axes highlight. Default is set to 'band' in the bar direction. Depends on <code>layout</code> prop.", "seeMoreText": "See {{link}} for more details." }, + "barLabel": { + "description": "If provided, the function will be used to format the label of the bar. It can be set to 'value' to display the current value." + }, "borderRadius": { "description": "Defines the border radius of the bar element." }, "bottomAxis": { "description": "Indicate which axis to display the bottom of the charts. Can be a string (the id of the axis) or an object <code>ChartsXAxisProps</code>." @@ -20,6 +23,9 @@ "height": { "description": "The height of the chart in px. If not defined, it takes the height of the parent element." }, + "highlightedItem": { + "description": "The item currently highlighted. Turns highlighting into a controlled prop." + }, "layout": { "description": "The direction of the bar elements." }, "leftAxis": { "description": "Indicate which axis to display the left of the charts. Can be a string (the id of the axis) or an object <code>ChartsYAxisProps</code>." @@ -35,6 +41,10 @@ "data": "The data about the clicked axis and items associated with it." } }, + "onHighlightChange": { + "description": "The callback fired when the highlighted item changes.", + "typeDescriptions": { "highlightedItem": "The newly highlighted item." } + }, "onItemClick": { "description": "Callback fired when a bar item is clicked.", "typeDescriptions": { @@ -76,6 +86,7 @@ "axisTick": "Custom component for the axis tick.", "axisTickLabel": "Custom component for tick label.", "bar": "The component that renders the bar.", + "barLabel": "The component that renders the bar label.", "itemContent": "Custom component for displaying tooltip content when triggered by item event.", "legend": "Custom rendering of the legend.", "loadingOverlay": "Overlay component rendered when the chart is in a loading state.", diff --git a/docs/translations/api-docs/charts/bar-label/bar-label.json b/docs/translations/api-docs/charts/bar-label/bar-label.json new file mode 100644 index 000000000000..9d908b3e5797 --- /dev/null +++ b/docs/translations/api-docs/charts/bar-label/bar-label.json @@ -0,0 +1,18 @@ +{ + "componentDescription": "", + "propDescriptions": {}, + "classDescriptions": { + "faded": { + "description": "Styles applied to {{nodeName}} if {{conditions}}.", + "nodeName": "the root element", + "conditions": "it is faded" + }, + "highlighted": { + "description": "Styles applied to {{nodeName}} if {{conditions}}.", + "nodeName": "the root element", + "conditions": "it is highlighted" + }, + "root": { "description": "Styles applied to the root element." } + }, + "slotDescriptions": { "barLabel": "The component that renders the bar label." } +} diff --git a/docs/translations/api-docs/charts/bar-plot/bar-plot.json b/docs/translations/api-docs/charts/bar-plot/bar-plot.json index b56710ba45b2..a4eed37a0972 100644 --- a/docs/translations/api-docs/charts/bar-plot/bar-plot.json +++ b/docs/translations/api-docs/charts/bar-plot/bar-plot.json @@ -1,6 +1,9 @@ { "componentDescription": "", "propDescriptions": { + "barLabel": { + "description": "If provided, the function will be used to format the label of the bar. It can be set to 'value' to display the current value." + }, "borderRadius": { "description": "Defines the border radius of the bar element." }, "onItemClick": { "description": "Callback fired when a bar item is clicked.", @@ -14,5 +17,8 @@ "slots": { "description": "Overridable component slots." } }, "classDescriptions": {}, - "slotDescriptions": { "bar": "The component that renders the bar." } + "slotDescriptions": { + "bar": "The component that renders the bar.", + "barLabel": "The component that renders the bar label." + } } diff --git a/docs/translations/api-docs/charts/bar-series-type.json b/docs/translations/api-docs/charts/bar-series-type.json index 8af9eaf2bf8e..535e72409254 100644 --- a/docs/translations/api-docs/charts/bar-series-type.json +++ b/docs/translations/api-docs/charts/bar-series-type.json @@ -5,7 +5,7 @@ "color": { "description": "" }, "data": { "description": "Data associated to each bar." }, "dataKey": { "description": "The key used to retrieve data from the dataset." }, - "highlightScope": { "description": "" }, + "highlightScope": { "description": "The scope to apply when the series is highlighted." }, "id": { "description": "" }, "label": { "description": "The label to display on the tooltip or the legend. It can be a string or a function." diff --git a/docs/translations/api-docs/charts/chart-container/chart-container.json b/docs/translations/api-docs/charts/chart-container/chart-container.json index ea5d89b42ea5..625af15ee031 100644 --- a/docs/translations/api-docs/charts/chart-container/chart-container.json +++ b/docs/translations/api-docs/charts/chart-container/chart-container.json @@ -9,9 +9,19 @@ "description": "If <code>true</code>, the charts will not listen to the mouse move event. It might break interactive features, but will improve performance." }, "height": { "description": "The height of the chart in px." }, + "highlightedItem": { + "description": "The item currently highlighted. Turns highlighting into a controlled prop." + }, "margin": { "description": "The margin between the SVG and the drawing area. It's used for leaving some space for extra information such as the x- and y-axis or legend. Accepts an object with the optional properties: <code>top</code>, <code>bottom</code>, <code>left</code>, and <code>right</code>." }, + "onHighlightChange": { + "description": "The callback fired when the highlighted item changes.", + "typeDescriptions": { "highlightedItem": "The newly highlighted item." } + }, + "plugins": { + "description": "An array of plugins defining how to preprocess data. If not provided, the container supports line, bar, scatter and pie charts." + }, "series": { "description": "The array of series to display. Each type of series has its own specificity. Please refer to the appropriate docs page to learn more about it." }, diff --git a/docs/translations/api-docs/charts/charts-x-axis/charts-x-axis.json b/docs/translations/api-docs/charts/charts-x-axis/charts-x-axis.json index 6a3063c582e6..cebaff3cbde6 100644 --- a/docs/translations/api-docs/charts/charts-x-axis/charts-x-axis.json +++ b/docs/translations/api-docs/charts/charts-x-axis/charts-x-axis.json @@ -17,7 +17,7 @@ "stroke": { "description": "The stroke color of the axis line." }, "tickFontSize": { "description": "The font size of the axis ticks text." }, "tickInterval": { - "description": "Defines which ticks are displayed. Its value can be: - 'auto' In such case the ticks are computed based on axis scale and other parameters. - a filtering function of the form <code>(value, index) => boolean</code> which is available only if the axis has a data property. - an array containing the values where ticks should be displayed." + "description": "Defines which ticks are displayed. Its value can be: - 'auto' In such case the ticks are computed based on axis scale and other parameters. - a filtering function of the form <code>(value, index) => boolean</code> which is available only if the axis has "point" scale. - an array containing the values where ticks should be displayed." }, "tickLabelInterval": { "description": "Defines which ticks get its label displayed. Its value can be: - 'auto' In such case, labels are displayed if they do not overlap with the previous one. - a filtering function of the form (value, index) => boolean. Warning: the index is tick index, not data ones." diff --git a/docs/translations/api-docs/charts/charts-y-axis/charts-y-axis.json b/docs/translations/api-docs/charts/charts-y-axis/charts-y-axis.json index 6a3063c582e6..cebaff3cbde6 100644 --- a/docs/translations/api-docs/charts/charts-y-axis/charts-y-axis.json +++ b/docs/translations/api-docs/charts/charts-y-axis/charts-y-axis.json @@ -17,7 +17,7 @@ "stroke": { "description": "The stroke color of the axis line." }, "tickFontSize": { "description": "The font size of the axis ticks text." }, "tickInterval": { - "description": "Defines which ticks are displayed. Its value can be: - 'auto' In such case the ticks are computed based on axis scale and other parameters. - a filtering function of the form <code>(value, index) => boolean</code> which is available only if the axis has a data property. - an array containing the values where ticks should be displayed." + "description": "Defines which ticks are displayed. Its value can be: - 'auto' In such case the ticks are computed based on axis scale and other parameters. - a filtering function of the form <code>(value, index) => boolean</code> which is available only if the axis has "point" scale. - an array containing the values where ticks should be displayed." }, "tickLabelInterval": { "description": "Defines which ticks get its label displayed. Its value can be: - 'auto' In such case, labels are displayed if they do not overlap with the previous one. - a filtering function of the form (value, index) => boolean. Warning: the index is tick index, not data ones." diff --git a/docs/translations/api-docs/charts/line-chart/line-chart.json b/docs/translations/api-docs/charts/line-chart/line-chart.json index 2df6f3875d55..5b85ec4bd7cb 100644 --- a/docs/translations/api-docs/charts/line-chart/line-chart.json +++ b/docs/translations/api-docs/charts/line-chart/line-chart.json @@ -22,6 +22,9 @@ "height": { "description": "The height of the chart in px. If not defined, it takes the height of the parent element." }, + "highlightedItem": { + "description": "The item currently highlighted. Turns highlighting into a controlled prop." + }, "leftAxis": { "description": "Indicate which axis to display the left of the charts. Can be a string (the id of the axis) or an object <code>ChartsYAxisProps</code>." }, @@ -37,6 +40,10 @@ "data": "The data about the clicked axis and items associated with it." } }, + "onHighlightChange": { + "description": "The callback fired when the highlighted item changes.", + "typeDescriptions": { "highlightedItem": "The newly highlighted item." } + }, "onLineClick": { "description": "Callback fired when a line element is clicked." }, "onMarkClick": { "description": "Callback fired when a mark element is clicked." }, "rightAxis": { diff --git a/docs/translations/api-docs/charts/line-series-type.json b/docs/translations/api-docs/charts/line-series-type.json index e4fa94dfe8fd..d75b7c50670a 100644 --- a/docs/translations/api-docs/charts/line-series-type.json +++ b/docs/translations/api-docs/charts/line-series-type.json @@ -13,7 +13,7 @@ "disableHighlight": { "description": "Do not render the line highlight item if set to <code>true</code>." }, - "highlightScope": { "description": "" }, + "highlightScope": { "description": "The scope to apply when the series is highlighted." }, "id": { "description": "" }, "label": { "description": "The label to display on the tooltip or the legend. It can be a string or a function." diff --git a/docs/translations/api-docs/charts/pie-chart/pie-chart.json b/docs/translations/api-docs/charts/pie-chart/pie-chart.json index d5a4ea4df15e..7f1be4fa44cc 100644 --- a/docs/translations/api-docs/charts/pie-chart/pie-chart.json +++ b/docs/translations/api-docs/charts/pie-chart/pie-chart.json @@ -18,6 +18,9 @@ "height": { "description": "The height of the chart in px. If not defined, it takes the height of the parent element." }, + "highlightedItem": { + "description": "The item currently highlighted. Turns highlighting into a controlled prop." + }, "leftAxis": { "description": "Indicate which axis to display the left of the charts. Can be a string (the id of the axis) or an object <code>ChartsYAxisProps</code>." }, @@ -26,6 +29,10 @@ "margin": { "description": "The margin between the SVG and the drawing area. It's used for leaving some space for extra information such as the x- and y-axis or legend. Accepts an object with the optional properties: <code>top</code>, <code>bottom</code>, <code>left</code>, and <code>right</code>." }, + "onHighlightChange": { + "description": "The callback fired when the highlighted item changes.", + "typeDescriptions": { "highlightedItem": "The newly highlighted item." } + }, "onItemClick": { "description": "Callback fired when a pie arc is clicked." }, "rightAxis": { "description": "Indicate which axis to display the right of the charts. Can be a string (the id of the axis) or an object <code>ChartsYAxisProps</code>." diff --git a/docs/translations/api-docs/charts/pie-series-type.json b/docs/translations/api-docs/charts/pie-series-type.json index d11f88c9565c..ecf2084ab1bc 100644 --- a/docs/translations/api-docs/charts/pie-series-type.json +++ b/docs/translations/api-docs/charts/pie-series-type.json @@ -21,7 +21,7 @@ "endAngle": { "description": "The end angle (deg) of the last item." }, "faded": { "description": "Override the arc attributes when it is faded." }, "highlighted": { "description": "Override the arc attributes when it is highlighted." }, - "highlightScope": { "description": "" }, + "highlightScope": { "description": "The scope to apply when the series is highlighted." }, "id": { "description": "" }, "innerRadius": { "description": "The radius between circle center and the beginning of the arc.<br />Can be a number (in px) or a string with a percentage such as '50%'.<br />The '100%' is the maximal radius that fit into the drawing area." diff --git a/docs/translations/api-docs/charts/responsive-chart-container/responsive-chart-container.json b/docs/translations/api-docs/charts/responsive-chart-container/responsive-chart-container.json index 48ac45553874..812a9391959a 100644 --- a/docs/translations/api-docs/charts/responsive-chart-container/responsive-chart-container.json +++ b/docs/translations/api-docs/charts/responsive-chart-container/responsive-chart-container.json @@ -11,9 +11,19 @@ "height": { "description": "The height of the chart in px. If not defined, it takes the height of the parent element." }, + "highlightedItem": { + "description": "The item currently highlighted. Turns highlighting into a controlled prop." + }, "margin": { "description": "The margin between the SVG and the drawing area. It's used for leaving some space for extra information such as the x- and y-axis or legend. Accepts an object with the optional properties: <code>top</code>, <code>bottom</code>, <code>left</code>, and <code>right</code>." }, + "onHighlightChange": { + "description": "The callback fired when the highlighted item changes.", + "typeDescriptions": { "highlightedItem": "The newly highlighted item." } + }, + "plugins": { + "description": "An array of plugins defining how to preprocess data. If not provided, the container supports line, bar, scatter and pie charts." + }, "series": { "description": "The array of series to display. Each type of series has its own specificity. Please refer to the appropriate docs page to learn more about it." }, diff --git a/docs/translations/api-docs/charts/scatter-chart/scatter-chart.json b/docs/translations/api-docs/charts/scatter-chart/scatter-chart.json index 7c64bdaf7757..5e9b1baac91e 100644 --- a/docs/translations/api-docs/charts/scatter-chart/scatter-chart.json +++ b/docs/translations/api-docs/charts/scatter-chart/scatter-chart.json @@ -22,6 +22,9 @@ "height": { "description": "The height of the chart in px. If not defined, it takes the height of the parent element." }, + "highlightedItem": { + "description": "The item currently highlighted. Turns highlighting into a controlled prop." + }, "leftAxis": { "description": "Indicate which axis to display the left of the charts. Can be a string (the id of the axis) or an object <code>ChartsYAxisProps</code>." }, @@ -29,6 +32,10 @@ "margin": { "description": "The margin between the SVG and the drawing area. It's used for leaving some space for extra information such as the x- and y-axis or legend. Accepts an object with the optional properties: <code>top</code>, <code>bottom</code>, <code>left</code>, and <code>right</code>." }, + "onHighlightChange": { + "description": "The callback fired when the highlighted item changes.", + "typeDescriptions": { "highlightedItem": "The newly highlighted item." } + }, "onItemClick": { "description": "Callback fired when clicking on a scatter item.", "typeDescriptions": { diff --git a/docs/translations/api-docs/charts/scatter-series-type.json b/docs/translations/api-docs/charts/scatter-series-type.json index f1b2cecd0e5e..72bd1fbf430f 100644 --- a/docs/translations/api-docs/charts/scatter-series-type.json +++ b/docs/translations/api-docs/charts/scatter-series-type.json @@ -7,7 +7,7 @@ "disableHover": { "description": "If true, the interaction will not use element hover for this series." }, - "highlightScope": { "description": "" }, + "highlightScope": { "description": "The scope to apply when the series is highlighted." }, "id": { "description": "" }, "label": { "description": "The label to display on the tooltip or the legend. It can be a string or a function." diff --git a/docs/translations/api-docs/charts/spark-line-chart/spark-line-chart.json b/docs/translations/api-docs/charts/spark-line-chart/spark-line-chart.json index e17bf6529969..7ea64f1d05ba 100644 --- a/docs/translations/api-docs/charts/spark-line-chart/spark-line-chart.json +++ b/docs/translations/api-docs/charts/spark-line-chart/spark-line-chart.json @@ -15,9 +15,16 @@ "height": { "description": "The height of the chart in px. If not defined, it takes the height of the parent element." }, + "highlightedItem": { + "description": "The item currently highlighted. Turns highlighting into a controlled prop." + }, "margin": { "description": "The margin between the SVG and the drawing area. It's used for leaving some space for extra information such as the x- and y-axis or legend. Accepts an object with the optional properties: <code>top</code>, <code>bottom</code>, <code>left</code>, and <code>right</code>." }, + "onHighlightChange": { + "description": "The callback fired when the highlighted item changes.", + "typeDescriptions": { "highlightedItem": "The newly highlighted item." } + }, "plotType": { "description": "Type of plot used." }, "showHighlight": { "description": "Set to <code>true</code> to highlight the value. With line, it shows a point. With bar, it shows a highlight band." diff --git a/docs/translations/api-docs/data-grid/data-grid-premium/data-grid-premium.json b/docs/translations/api-docs/data-grid/data-grid-premium/data-grid-premium.json index 891f2d299dc2..7acafbb5fb7b 100644 --- a/docs/translations/api-docs/data-grid/data-grid-premium/data-grid-premium.json +++ b/docs/translations/api-docs/data-grid/data-grid-premium/data-grid-premium.json @@ -14,7 +14,7 @@ "description": "The id of the element containing a label for the Data Grid." }, "autoHeight": { - "description": "If <code>true</code>, the Data Grid height is dynamic and follow the number of rows in the Data Grid." + "description": "If <code>true</code>, the Data Grid height is dynamic and follows the number of rows in the Data Grid." }, "autoPageSize": { "description": "If <code>true</code>, the pageSize is calculated according to the container size and the max number of rows to avoid rendering a vertical scroll bar." diff --git a/docs/translations/api-docs/data-grid/data-grid-pro/data-grid-pro.json b/docs/translations/api-docs/data-grid/data-grid-pro/data-grid-pro.json index be79188d0bbc..65352ff84b61 100644 --- a/docs/translations/api-docs/data-grid/data-grid-pro/data-grid-pro.json +++ b/docs/translations/api-docs/data-grid/data-grid-pro/data-grid-pro.json @@ -9,7 +9,7 @@ "description": "The id of the element containing a label for the Data Grid." }, "autoHeight": { - "description": "If <code>true</code>, the Data Grid height is dynamic and follow the number of rows in the Data Grid." + "description": "If <code>true</code>, the Data Grid height is dynamic and follows the number of rows in the Data Grid." }, "autoPageSize": { "description": "If <code>true</code>, the pageSize is calculated according to the container size and the max number of rows to avoid rendering a vertical scroll bar." diff --git a/docs/translations/api-docs/data-grid/data-grid/data-grid.json b/docs/translations/api-docs/data-grid/data-grid/data-grid.json index 7ea702d9b210..770bf5af8fa5 100644 --- a/docs/translations/api-docs/data-grid/data-grid/data-grid.json +++ b/docs/translations/api-docs/data-grid/data-grid/data-grid.json @@ -9,7 +9,7 @@ "description": "The id of the element containing a label for the Data Grid." }, "autoHeight": { - "description": "If <code>true</code>, the Data Grid height is dynamic and follow the number of rows in the Data Grid." + "description": "If <code>true</code>, the Data Grid height is dynamic and follows the number of rows in the Data Grid." }, "autoPageSize": { "description": "If <code>true</code>, the pageSize is calculated according to the container size and the max number of rows to avoid rendering a vertical scroll bar." diff --git a/docs/translations/api-docs/data-grid/grid-csv-export-options.json b/docs/translations/api-docs/data-grid/grid-csv-export-options.json index dfcea88f04e0..0f0330a40a1f 100644 --- a/docs/translations/api-docs/data-grid/grid-csv-export-options.json +++ b/docs/translations/api-docs/data-grid/grid-csv-export-options.json @@ -5,6 +5,9 @@ "description": "If <code>true</code>, the hidden columns will also be exported." }, "delimiter": { "description": "The character used to separate fields." }, + "escapeFormulas": { + "description": "If <code>false</code>, the formulas in the cells will not be escaped.<br />It is not recommended to disable this option as it exposes the user to potential CSV injection attacks.<br />See <a href=\"https://owasp.org/www-community/attacks/CSV_Injection\">https://owasp.org/www-community/attacks/CSV_Injection</a> for more information." + }, "fields": { "description": "The columns exported.<br />This should only be used if you want to restrict the columns exports." }, diff --git a/docs/translations/api-docs/data-grid/grid-excel-export-options.json b/docs/translations/api-docs/data-grid/grid-excel-export-options.json index f05570b1eaff..9807dde4a0f6 100644 --- a/docs/translations/api-docs/data-grid/grid-excel-export-options.json +++ b/docs/translations/api-docs/data-grid/grid-excel-export-options.json @@ -5,6 +5,9 @@ "description": "If <code>true</code>, the hidden columns will also be exported." }, "columnsStyles": { "description": "Object mapping column field to Exceljs style" }, + "escapeFormulas": { + "description": "If <code>false</code>, the formulas in the cells will not be escaped.<br />It is not recommended to disable this option as it exposes the user to potential CSV injection attacks.<br />See <a href=\"https://owasp.org/www-community/attacks/CSV_Injection\">https://owasp.org/www-community/attacks/CSV_Injection</a> for more information." + }, "exceljsPostProcess": { "description": "Method called after adding the rows to the workbook.<br />Not supported when <code>worker</code> is set.<br />To use with web workers, use the option in <code>setupExcelExportWebWorker</code>." }, diff --git a/docs/translations/api-docs/date-pickers/pickers-layout/pickers-layout.json b/docs/translations/api-docs/date-pickers/pickers-layout/pickers-layout.json index 1fc772c256d8..57a28904a850 100644 --- a/docs/translations/api-docs/date-pickers/pickers-layout/pickers-layout.json +++ b/docs/translations/api-docs/date-pickers/pickers-layout/pickers-layout.json @@ -2,6 +2,9 @@ "componentDescription": "", "propDescriptions": { "classes": { "description": "Override or extend the styles applied to the component." }, + "isRtl": { + "description": "<code>true</code> if the application is in right-to-left direction." + }, "orientation": { "description": "Force rendering in particular orientation." }, "slotProps": { "description": "The props used for each component slot." }, "slots": { "description": "Overridable component slots." }, diff --git a/docs/translations/api-docs/tree-view/rich-tree-view/rich-tree-view.json b/docs/translations/api-docs/tree-view/rich-tree-view/rich-tree-view.json index 1dc23fbbce09..b866f4dcc07a 100644 --- a/docs/translations/api-docs/tree-view/rich-tree-view/rich-tree-view.json +++ b/docs/translations/api-docs/tree-view/rich-tree-view/rich-tree-view.json @@ -21,6 +21,9 @@ "expandedItems": { "description": "Expanded item ids. Used when the item's expansion is controlled." }, + "experimentalFeatures": { + "description": "Unstable features, breaking changes might be introduced. For each feature, if the flag is not explicitly set to <code>true</code>, the feature will be fully disabled and any property / method call will not have any effect." + }, "getItemId": { "description": "Used to determine the id of a given item.", "typeDescriptions": { "item": "The item to check.", "string": "The id of the item." } @@ -39,6 +42,9 @@ "boolean": "<code>true</code> if the item should be disabled." } }, + "itemChildrenIndentation": { + "description": "Horizontal indentation between an item and its children. Examples: 24, "24px", "2rem", "2em"." + }, "multiSelect": { "description": "If <code>true</code>, <code>ctrl</code> and <code>shift</code> will trigger multiselect." }, diff --git a/docs/translations/api-docs/tree-view/simple-tree-view/simple-tree-view.json b/docs/translations/api-docs/tree-view/simple-tree-view/simple-tree-view.json index 637ca728dab0..a12a98351778 100644 --- a/docs/translations/api-docs/tree-view/simple-tree-view/simple-tree-view.json +++ b/docs/translations/api-docs/tree-view/simple-tree-view/simple-tree-view.json @@ -22,9 +22,15 @@ "expandedItems": { "description": "Expanded item ids. Used when the item's expansion is controlled." }, + "experimentalFeatures": { + "description": "Unstable features, breaking changes might be introduced. For each feature, if the flag is not explicitly set to <code>true</code>, the feature will be fully disabled and any property / method call will not have any effect." + }, "id": { "description": "This prop is used to help implement the accessibility logic. If you don't provide this prop. It falls back to a randomly generated id." }, + "itemChildrenIndentation": { + "description": "Horizontal indentation between an item and its children. Examples: 24, "24px", "2rem", "2em"." + }, "multiSelect": { "description": "If <code>true</code>, <code>ctrl</code> and <code>shift</code> will trigger multiselect." }, diff --git a/docs/translations/api-docs/tree-view/tree-view/tree-view.json b/docs/translations/api-docs/tree-view/tree-view/tree-view.json index 907ed9df8c7c..c29df2121733 100644 --- a/docs/translations/api-docs/tree-view/tree-view/tree-view.json +++ b/docs/translations/api-docs/tree-view/tree-view/tree-view.json @@ -22,9 +22,15 @@ "expandedItems": { "description": "Expanded item ids. Used when the item's expansion is controlled." }, + "experimentalFeatures": { + "description": "Unstable features, breaking changes might be introduced. For each feature, if the flag is not explicitly set to <code>true</code>, the feature will be fully disabled and any property / method call will not have any effect." + }, "id": { "description": "This prop is used to help implement the accessibility logic. If you don't provide this prop. It falls back to a randomly generated id." }, + "itemChildrenIndentation": { + "description": "Horizontal indentation between an item and its children. Examples: 24, "24px", "2rem", "2em"." + }, "multiSelect": { "description": "If <code>true</code>, <code>ctrl</code> and <code>shift</code> will trigger multiselect." }, diff --git a/lerna.json b/lerna.json index 086066839af1..43fbd72f76f0 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { + "$schema": "node_modules/lerna/schemas/lerna-schema.json", "npmClient": "pnpm", - "version": "independent", - "useNx": false + "version": "independent" } diff --git a/package.json b/package.json index b4b23a2a7e3c..5ef014cdb226 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "7.5.0", + "version": "7.6.2", "private": true, "scripts": { "preinstall": "npx only-allow pnpm", @@ -18,8 +18,8 @@ "docs:size-why": "cross-env DOCS_STATS_ENABLED=true pnpm docs:build", "docs:deploy": "pnpm --filter docs deploy", "deduplicate": "pnpm dedupe", - "dataset:file-tree": "babel-node -x .ts ./scripts/treeDataFromFileTree.ts", - "l10n": "babel-node -x .ts ./scripts/l10n.ts", + "dataset:file-tree": "tsx ./scripts/treeDataFromFileTree.ts", + "l10n": "tsx ./scripts/l10n.ts", "jsonlint": "node ./scripts/jsonlint.mjs", "eslint": "eslint . --cache --report-unused-disable-directives --ext .js,.ts,.tsx --max-warnings 0", "eslint:fix": "pnpm eslint --fix", @@ -32,8 +32,9 @@ "size:why": "pnpm size:snapshot --analyze --accurateBundles", "tc": "node test/cli.js", "test": "node scripts/test.mjs", - "test:coverage": "cross-env NODE_ENV=test BABEL_ENV=coverage nyc mocha --exclude '**/node_modules/**' && nyc report -r lcovonly", - "test:coverage:html": "cross-env NODE_ENV=test BABEL_ENV=coverage nyc mocha --exclude '**/node_modules/**' && nyc report --reporter=html", + "test:coverage": "cross-env NODE_OPTIONS=--max-old-space-size=4096 NODE_ENV=test TZ=UTC BABEL_ENV=coverage nyc mocha --exclude '**/node_modules/**' && nyc report -r lcovonly", + "test:coverage:html": "cross-env NODE_ENV=test TZ=UTC BABEL_ENV=coverage nyc mocha --exclude '**/node_modules/**' && nyc report --reporter=html", + "test:coverage:inspect": "cross-env NODE_ENV=test TZ=UTC BABEL_ENV=coverage mocha --inspect-brk --exclude '**/node_modules/**' ", "test:karma": "cross-env NODE_ENV=test TZ=UTC karma start test/karma.conf.js", "test:karma:parallel": "cross-env NODE_ENV=test TZ=UTC PARALLEL=true karma start test/karma.conf.js", "test:unit": "cross-env NODE_ENV=test TZ=UTC mocha -n expose_gc", @@ -66,54 +67,55 @@ }, "devDependencies": { "@argos-ci/core": "^1.5.5", - "@babel/cli": "^7.24.5", - "@babel/core": "^7.24.5", - "@babel/node": "^7.23.9", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-react-constant-elements": "^7.24.1", - "@babel/plugin-transform-runtime": "^7.24.3", - "@babel/preset-env": "^7.24.5", - "@babel/preset-react": "^7.24.1", - "@babel/preset-typescript": "^7.24.1", - "@babel/register": "^7.23.7", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/cli": "^7.24.6", + "@babel/core": "^7.24.6", + "@babel/node": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-react-constant-elements": "^7.24.6", + "@babel/plugin-transform-runtime": "^7.24.6", + "@babel/preset-env": "^7.24.6", + "@babel/preset-react": "^7.24.6", + "@babel/preset-typescript": "^7.24.6", + "@babel/register": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "@emotion/cache": "^11.11.0", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@mnajdova/enzyme-adapter-react-18": "^0.2.0", - "@mui/icons-material": "^5.15.14", - "@mui/internal-markdown": "^1.0.3", - "@mui/material": "^5.15.14", - "@mui/monorepo": "github:mui/material-ui#3c888ed6cf0774815c32c6309e8cea2d8b5e684b", + "@mui/icons-material": "^5.15.19", + "@mui/internal-markdown": "^1.0.4", + "@mui/internal-test-utils": "1.0.0", + "@mui/material": "^5.15.19", + "@mui/monorepo": "github:mui/material-ui#f0026ad5bf4e1957cebd65b882bf45219514ca64", "@mui/utils": "^5.15.14", "@next/eslint-plugin-next": "14.2.3", "@octokit/plugin-retry": "^6.0.1", - "@octokit/rest": "^20.0.2", - "@playwright/test": "^1.43.1", - "@testing-library/react": "^14.2.1", + "@octokit/rest": "^20.1.1", + "@playwright/test": "^1.44.1", + "@testing-library/react": "^15.0.7", "@types/babel__core": "^7.20.5", "@types/chai": "^4.3.16", "@types/chai-dom": "^1.11.3", "@types/enzyme": "3.10.12", "@types/fs-extra": "^11.0.4", - "@types/lodash": "^4.17.1", + "@types/karma": "^6.3.8", + "@types/lodash": "^4.17.4", "@types/mocha": "^10.0.6", "@types/node": "^18.19.33", - "@types/prettier": "^2.7.3", "@types/react": "^18.2.60", - "@types/react-dom": "^18.2.19", - "@types/react-test-renderer": "^18.0.7", + "@types/react-dom": "^18.2.25", + "@types/react-test-renderer": "^18.3.0", "@types/requestidlecallback": "^0.3.7", "@types/sinon": "^10.0.20", "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", "autoprefixer": "^10.4.19", - "axe-core": "4.8.4", + "axe-core": "4.9.1", "babel-loader": "^9.1.3", "babel-plugin-istanbul": "^6.1.1", "babel-plugin-module-resolver": "^5.0.2", @@ -128,7 +130,7 @@ "concurrently": "^8.2.2", "cpy-cli": "^5.0.0", "cross-env": "^7.0.3", - "danger": "^11.3.1", + "danger": "^12.3.0", "date-fns-jalali-v3": "npm:date-fns-jalali@3.6.0-0", "date-fns-v3": "npm:date-fns@3.6.0", "enzyme": "^3.11.0", @@ -139,12 +141,13 @@ "eslint-import-resolver-webpack": "^0.13.8", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.3", + "eslint-plugin-jsdoc": "^48.2.7", "eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-material-ui": "workspace:^", "eslint-plugin-mocha": "^10.4.3", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-compiler": "0.0.0-experimental-51a85ea-20240601", "eslint-plugin-react-hooks": "^4.6.2", "fast-glob": "^3.3.2", "format-util": "^1.0.5", @@ -152,7 +155,7 @@ "glob-gitignore": "^1.0.14", "globby": "^14.0.1", "html-webpack-plugin": "^5.6.0", - "jsdom": "23.1.0", + "jsdom": "24.1.0", "jss": "^10.10.0", "jss-plugin-template": "^10.10.0", "jss-rtl": "^0.3.0", @@ -162,30 +165,31 @@ "karma-parallel": "^0.3.1", "karma-sourcemap-loader": "^0.4.0", "karma-webpack": "^5.0.1", - "lerna": "^8.1.2", + "lerna": "^8.1.3", "lodash": "^4.17.21", "markdownlint-cli2": "^0.13.0", "mocha": "^10.4.0", "moment": "^2.30.1", "moment-timezone": "^0.5.45", "nyc": "^15.1.0", - "prettier": "^3.2.5", + "prettier": "^3.3.0", "pretty-quick": "^4.0.0", "process": "^0.11.10", "react": "^18.2.0", "react-dom": "^18.2.0", "remark": "^13.0.0", + "rimraf": "^5.0.7", "serve": "^14.2.3", "sinon": "^16.1.3", "stream-browserify": "^3.0.0", "string-replace-loader": "^3.1.0", "terser-webpack-plugin": "^5.3.10", - "tsx": "^4.7.3", + "tsx": "^4.11.0", "typescript": "^5.4.5", "unist-util-visit": "^2.0.3", "util": "^0.12.5", "webpack": "^5.91.0", - "webpack-bundle-analyzer": "^4.10.1", + "webpack-bundle-analyzer": "^4.10.2", "webpack-cli": "^5.1.4", "yargs": "^17.7.2" }, @@ -193,7 +197,10 @@ "react-is": "^18.2.0", "@types/node": "^18.19.33" }, - "packageManager": "pnpm@8.15.8", + "packageManager": "pnpm@9.2.0", + "engines": { + "pnpm": "9.2.0" + }, "pnpm": { "patchedDependencies": { "karma-mocha@2.0.1": "patches/karma-mocha@2.0.1.patch", diff --git a/packages/eslint-plugin-material-ui/package.json b/packages/eslint-plugin-material-ui/package.json index c483d7604956..030e2626c2c4 100644 --- a/packages/eslint-plugin-material-ui/package.json +++ b/packages/eslint-plugin-material-ui/package.json @@ -6,8 +6,8 @@ "main": "src/index.js", "devDependencies": { "@types/eslint": "^8.56.10", - "@typescript-eslint/utils": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0" + "@typescript-eslint/utils": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0" }, "scripts": { "test": "cd ../../ && cross-env NODE_ENV=test mocha 'packages/eslint-plugin-material-ui/**/*.test.js' --timeout 3000" diff --git a/packages/x-charts-pro/.mocharc.js b/packages/x-charts-pro/.mocharc.js new file mode 100644 index 000000000000..a5fea4f72d99 --- /dev/null +++ b/packages/x-charts-pro/.mocharc.js @@ -0,0 +1,34 @@ +// We can't import the `.mocharc.js` of the monorepo, otherwise we trigger its `setupBabel`. +module.exports = { + extension: ['js', 'ts', 'tsx'], + ignore: [ + '**/build/**', + '**/node_modules/**', + // Mocha seems to ignore .next anyway (maybe because dotfiles?). + // We're leaving this to make sure. + 'docs/.next/**', + ], + recursive: true, + timeout: (process.env.CIRCLECI === 'true' ? 5 : 2) * 1000, // Circle CI has low-performance CPUs. + reporter: 'dot', + require: [ + require.resolve('../../test/utils/setupBabel'), + // Not strictly necessary, but just to keep the babel plugins in the loop for the tests + // For compiling pure ESM modules that @babel/register can't handle. + // See https://babeljs.io/docs/babel-register#experimental-babel-8-implementation + // Note: @babel/register does not support compiling native Node.js ES modules on the fly, + // since currently there is no stable API for intercepting ES modules loading. + require.resolve('tsx/cjs'), + require.resolve('../../test/utils/setupJSDOM'), + ], + 'watch-ignore': [ + // default + '.git', + // node_modules can be nested with workspaces + '**/node_modules/**', + // Unrelated directories with a large number of files + '**/build/**', + 'docs/.next/**', + ], + spec: ['packages/x-charts-pro/**/*.test.{js,ts,tsx}'], +}; diff --git a/packages/x-charts-pro/LICENSE b/packages/x-charts-pro/LICENSE new file mode 100644 index 000000000000..bda47bde6547 --- /dev/null +++ b/packages/x-charts-pro/LICENSE @@ -0,0 +1,11 @@ +Commercial License + +Copyright (c) 2020 Material-UI SAS + +MUI X Pro (https://mui.com/pricing/) is commercial software. You MUST agree to the +End User License Agreement (EULA: https://mui.com/r/x-license-eula) to be able to +use the software. + +This means that you either need to purchase a commercial license at +https://mui.com/r/x-get-license?scope=pro or be eligible for the Evaluation (trial) +licenses detailed at https://mui.com/r/x-license-trial. diff --git a/packages/x-charts-pro/README.md b/packages/x-charts-pro/README.md new file mode 100644 index 000000000000..f65d2f65836b --- /dev/null +++ b/packages/x-charts-pro/README.md @@ -0,0 +1,26 @@ +# MUI X Pro + +This package is the Pro plan edition of the chart components. +It's part of [MUI X](https://mui.com/x/), an open-core extension of MUI Core, with advanced components. + +## Installation + +Install the package in your project directory with: + +```bash +npm install @mui/x-charts-pro +``` + +This component has the following peer dependencies that you will need to install as well. + +```json +"peerDependencies": { + "@mui/material": "^5.15.14", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" +}, +``` + +## Documentation + +Visit [https://mui.com/x/react-charts/](https://mui.com/x/react-charts/) to view the full documentation. diff --git a/packages/x-charts-pro/package.json b/packages/x-charts-pro/package.json new file mode 100644 index 000000000000..19e0713e805f --- /dev/null +++ b/packages/x-charts-pro/package.json @@ -0,0 +1,100 @@ +{ + "name": "@mui/x-charts-pro", + "version": "7.6.2", + "description": "The community edition of the Charts components (MUI X).", + "author": "MUI Team", + "main": "./src/index.ts", + "license": "SEE LICENSE IN LICENSE", + "bugs": { + "url": "https://github.com/mui/mui-x/issues" + }, + "homepage": "https://mui.com/x/react-charts/", + "sideEffects": false, + "publishConfig": { + "access": "public", + "directory": "build" + }, + "keywords": [ + "react", + "react-component", + "mui", + "mui-x", + "material-ui", + "material design", + "charts" + ], + "scripts": { + "typescript": "tsc -p tsconfig.json", + "build": "pnpm build:modern && pnpm build:node && pnpm build:stable && pnpm build:types && pnpm build:copy-files ", + "build:modern": "node ../../scripts/build.mjs modern", + "build:node": "node ../../scripts/build.mjs node", + "build:stable": "node ../../scripts/build.mjs stable", + "build:copy-files": "node ../../scripts/copyFiles.mjs", + "build:types": "node ../../scripts/buildTypes.mjs", + "prebuild": "rimraf build tsconfig.build.tsbuildinfo" + }, + "repository": { + "type": "git", + "url": "https://github.com/mui/mui-x.git", + "directory": "packages/x-charts-pro" + }, + "dependencies": { + "@babel/runtime": "^7.24.6", + "@mui/base": "^5.0.0-beta.40", + "@mui/system": "^5.15.15", + "@mui/utils": "^5.15.14", + "@mui/x-charts": "workspace:*", + "@mui/x-license": "workspace:*", + "@react-spring/rafz": "^9.7.3", + "@react-spring/web": "^9.7.3", + "clsx": "^2.1.1", + "d3-color": "^3.1.0", + "d3-delaunay": "^6.0.4", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.2.0", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + }, + "devDependencies": { + "@react-spring/core": "^9.7.3", + "@react-spring/shared": "^9.7.3", + "@types/d3-color": "^3.1.3", + "@types/d3-delaunay": "^6.0.4", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-scale": "^4.0.8", + "@types/d3-shape": "^3.1.6", + "@types/prop-types": "^15.7.12", + "csstype": "^3.1.3", + "rimraf": "^5.0.7" + }, + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./esm/index.js", + "default": "./esm/index.js" + }, + "./*": { + "types": "./*/index.d.ts", + "import": "./esm/*/index.js", + "default": "./esm/*/index.js" + } + }, + "engines": { + "node": ">=14.0.0" + } +} diff --git a/packages/x-charts-pro/src/index.ts b/packages/x-charts-pro/src/index.ts new file mode 100644 index 000000000000..4fec074aff7a --- /dev/null +++ b/packages/x-charts-pro/src/index.ts @@ -0,0 +1 @@ +export * from '@mui/x-charts'; diff --git a/packages/x-charts-pro/src/internals/utils/releaseInfo.ts b/packages/x-charts-pro/src/internals/utils/releaseInfo.ts new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/x-charts-pro/tsconfig.build.json b/packages/x-charts-pro/tsconfig.build.json new file mode 100644 index 000000000000..bf4eaef647d2 --- /dev/null +++ b/packages/x-charts-pro/tsconfig.build.json @@ -0,0 +1,20 @@ +{ + // This config is for emitting declarations (.d.ts) only + // Actual .ts source files are transpiled via babel + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": true, + "declaration": true, + "noEmit": false, + "emitDeclarationOnly": true, + "outDir": "build", + "rootDir": "./src", + "types": ["node", "@mui/material/themeCssVarsAugmentation"] + }, + "references": [ + { "path": "../x-charts/tsconfig.build.json" }, + { "path": "../x-license/tsconfig.build.json" } + ], + "include": ["src/**/*.ts*"], + "exclude": ["src/**/*.spec.ts*", "src/**/*.test.ts*", "src/tests/**/*"] +} diff --git a/packages/x-charts-pro/tsconfig.json b/packages/x-charts-pro/tsconfig.json new file mode 100644 index 000000000000..5f862d31ec2b --- /dev/null +++ b/packages/x-charts-pro/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha", + "node" + ], + "noImplicitAny": false + }, + "include": ["src/**/*", "../../test/utils/addChaiAssertions.ts"] +} diff --git a/packages/x-charts/package.json b/packages/x-charts/package.json index ed9a4ef3bc62..3a4faa093831 100644 --- a/packages/x-charts/package.json +++ b/packages/x-charts/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-charts", - "version": "7.5.0", + "version": "7.6.2", "description": "The community edition of the Charts components (MUI X).", "author": "MUI Team", "main": "./src/index.js", @@ -39,9 +39,9 @@ "directory": "packages/x-charts" }, "dependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.14", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@react-spring/rafz": "^9.7.3", "@react-spring/web": "^9.7.3", @@ -69,6 +69,7 @@ } }, "devDependencies": { + "@mui/internal-test-utils": "1.0.0", "@react-spring/core": "^9.7.3", "@react-spring/shared": "^9.7.3", "@types/d3-color": "^3.1.3", @@ -78,7 +79,7 @@ "@types/d3-shape": "^3.1.6", "@types/prop-types": "^15.7.12", "csstype": "^3.1.3", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "exports": { ".": { diff --git a/packages/x-charts/src/BarChart/BarChart.tsx b/packages/x-charts/src/BarChart/BarChart.tsx index acaac47823de..d35db5a296e1 100644 --- a/packages/x-charts/src/BarChart/BarChart.tsx +++ b/packages/x-charts/src/BarChart/BarChart.tsx @@ -51,7 +51,7 @@ export interface BarChartSlotProps ChartsOverlaySlotProps {} export interface BarChartProps - extends Omit<ResponsiveChartContainerProps, 'series'>, + extends Omit<ResponsiveChartContainerProps, 'series' | 'plugins'>, Omit<ChartsAxisProps, 'slots' | 'slotProps'>, Omit<BarPlotProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'>, @@ -138,6 +138,9 @@ const BarChart = React.forwardRef(function BarChart(props: BarChartProps, ref) { slots, slotProps, loading, + barLabel, + highlightedItem, + onHighlightChange, } = props; const id = useId(); @@ -187,6 +190,8 @@ const BarChart = React.forwardRef(function BarChart(props: BarChartProps, ref) { axisHighlight?.y === 'none' && !onAxisClick } + highlightedItem={highlightedItem} + onHighlightChange={onHighlightChange} > {onAxisClick && <ChartsOnAxisClickHandler onAxisClick={onAxisClick} />} {grid && <ChartsGrid vertical={grid.vertical} horizontal={grid.horizontal} />} @@ -197,6 +202,7 @@ const BarChart = React.forwardRef(function BarChart(props: BarChartProps, ref) { skipAnimation={skipAnimation} onItemClick={onItemClick} borderRadius={borderRadius} + barLabel={barLabel} /> <ChartsOverlay loading={loading} slots={slots} slotProps={slotProps} /> </g> @@ -220,7 +226,7 @@ const BarChart = React.forwardRef(function BarChart(props: BarChartProps, ref) { BarChart.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The configuration of axes highlight. @@ -232,6 +238,14 @@ BarChart.propTypes = { x: PropTypes.oneOf(['band', 'line', 'none']), y: PropTypes.oneOf(['band', 'line', 'none']), }), + /** + * If provided, the function will be used to format the label of the bar. + * It can be set to 'value' to display the current value. + * @param {BarItem} item The item to format. + * @param {BarLabelContext} context data about the bar. + * @returns {string} The formatted label. + */ + barLabel: PropTypes.oneOfType([PropTypes.oneOf(['value']), PropTypes.func]), /** * Defines the border radius of the bar element. */ @@ -271,6 +285,13 @@ BarChart.propTypes = { * The height of the chart in px. If not defined, it takes the height of the parent element. */ height: PropTypes.number, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), /** * The direction of the bar elements. * @default 'vertical' @@ -320,6 +341,12 @@ BarChart.propTypes = { * @param {null | AxisData} data The data about the clicked axis and items associated with it. */ onAxisClick: PropTypes.func, + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, /** * Callback fired when a bar item is clicked. * @param {React.MouseEvent<SVGElement, MouseEvent>} event The event source of the callback. @@ -434,7 +461,7 @@ BarChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['bottom', 'top']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, @@ -505,7 +532,7 @@ BarChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['left', 'right']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, diff --git a/packages/x-charts/src/BarChart/BarElement.tsx b/packages/x-charts/src/BarChart/BarElement.tsx index df8f216a82cb..38d082f58d34 100644 --- a/packages/x-charts/src/BarChart/BarElement.tsx +++ b/packages/x-charts/src/BarChart/BarElement.tsx @@ -7,14 +7,9 @@ import { styled } from '@mui/material/styles'; import { color as d3Color } from 'd3-color'; import generateUtilityClasses from '@mui/utils/generateUtilityClasses'; import { AnimatedProps, animated } from '@react-spring/web'; -import { - getIsFaded, - getIsHighlighted, - useInteractionItemProps, -} from '../hooks/useInteractionItemProps'; -import { InteractionContext } from '../context/InteractionProvider'; -import { HighlightScope } from '../context/HighlightProvider'; +import { useInteractionItemProps } from '../hooks/useInteractionItemProps'; import { SeriesId } from '../models/seriesType/common'; +import { useItemHighlighted } from '../context'; export interface BarElementClasses { /** Styles applied to the root element. */ @@ -73,7 +68,6 @@ interface BarProps height?: string | number | undefined; width?: string | number | undefined; }> { - highlightScope?: Partial<HighlightScope>; ownerState: BarElementOwnerState; } @@ -91,7 +85,6 @@ export interface BarElementSlotProps { export type BarElementProps = Omit<BarElementOwnerState, 'isFaded' | 'isHighlighted'> & Omit<React.SVGProps<SVGRectElement>, 'ref' | 'id'> & { - highlightScope?: Partial<HighlightScope>; /** * The props used for each component slot. * @default {} @@ -110,24 +103,17 @@ function BarElement(props: BarElementProps) { dataIndex, classes: innerClasses, color, - highlightScope, slots, slotProps, style, onClick, ...other } = props; - const getInteractionItemProps = useInteractionItemProps(highlightScope); - - const { item } = React.useContext(InteractionContext); - - const isHighlighted = getIsHighlighted( - item, - { type: 'bar', seriesId: id, dataIndex }, - highlightScope, - ); - const isFaded = - !isHighlighted && getIsFaded(item, { type: 'bar', seriesId: id, dataIndex }, highlightScope); + const getInteractionItemProps = useInteractionItemProps(); + const { isFaded, isHighlighted } = useItemHighlighted({ + seriesId: id, + dataIndex, + }); const ownerState = { id, @@ -161,14 +147,10 @@ function BarElement(props: BarElementProps) { BarElement.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object, dataIndex: PropTypes.number.isRequired, - highlightScope: PropTypes.shape({ - faded: PropTypes.oneOf(['global', 'none', 'series']), - highlighted: PropTypes.oneOf(['item', 'none', 'series']), - }), id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, /** * The props used for each component slot. diff --git a/packages/x-charts/src/BarChart/BarLabel/BarLabel.tsx b/packages/x-charts/src/BarChart/BarLabel/BarLabel.tsx new file mode 100644 index 000000000000..7b18ddf9568a --- /dev/null +++ b/packages/x-charts/src/BarChart/BarLabel/BarLabel.tsx @@ -0,0 +1,52 @@ +import * as React from 'react'; +import { styled, useThemeProps } from '@mui/material/styles'; +import { animated } from '@react-spring/web'; +import PropTypes from 'prop-types'; +import { barLabelClasses } from './barLabelClasses'; +import { BarLabelOwnerState } from './BarLabel.types'; + +export const BarLabelComponent = styled(animated.text, { + name: 'MuiBarLabel', + slot: 'Root', + overridesResolver: (_, styles) => [ + { [`&.${barLabelClasses.faded}`]: styles.faded }, + { [`&.${barLabelClasses.highlighted}`]: styles.highlighted }, + styles.root, + ], +})(({ theme }) => ({ + ...theme?.typography?.body2, + stroke: 'none', + fill: (theme.vars || theme)?.palette?.text?.primary, + transition: 'opacity 0.2s ease-in, fill 0.2s ease-in', + textAnchor: 'middle', + dominantBaseline: 'central', + pointerEvents: 'none', + opacity: 1, + [`&.${barLabelClasses.faded}`]: { + opacity: 0.3, + }, +})); + +export type BarLabelProps = Omit<React.SVGProps<SVGTextElement>, 'ref' | 'id'> & BarLabelOwnerState; + +function BarLabel(props: BarLabelProps) { + const themeProps = useThemeProps({ props, name: 'MuiBarLabel' }); + + const { seriesId, dataIndex, color, isFaded, isHighlighted, classes, ...otherProps } = themeProps; + + return <BarLabelComponent {...otherProps} />; +} + +BarLabel.propTypes = { + // ----------------------------- Warning -------------------------------- + // | These PropTypes are generated from the TypeScript type definitions | + // | To update them edit the TypeScript types and run "pnpm proptypes" | + // ---------------------------------------------------------------------- + classes: PropTypes.object, + dataIndex: PropTypes.number.isRequired, + isFaded: PropTypes.bool.isRequired, + isHighlighted: PropTypes.bool.isRequired, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, +} as any; + +export { BarLabel }; diff --git a/packages/x-charts/src/BarChart/BarLabel/BarLabel.types.ts b/packages/x-charts/src/BarChart/BarLabel/BarLabel.types.ts new file mode 100644 index 000000000000..bc0c73ff9631 --- /dev/null +++ b/packages/x-charts/src/BarChart/BarLabel/BarLabel.types.ts @@ -0,0 +1,46 @@ +import { SeriesId } from '../../models/seriesType/common'; +import type { BarLabelClasses } from './barLabelClasses'; + +export interface BarLabelOwnerState { + seriesId: SeriesId; + dataIndex: number; + color: string; + isFaded: boolean; + isHighlighted: boolean; + classes?: Partial<BarLabelClasses>; +} + +export type BarItem = { + /** + * The series id of the bar. + */ + seriesId: SeriesId; + /** + * The index of the data point in the series. + */ + dataIndex: number; + /** + * The value of the data point. + */ + value: number | null; +}; + +export type BarLabelContext = { + bar: { + /** + * The height of the bar. + * It could be used to control the label based on the bar size. + */ + height: number; + /** + * The width of the bar. + * It could be used to control the label based on the bar size. + */ + width: number; + }; +}; + +export type BarLabelFunction = ( + item: BarItem, + context: BarLabelContext, +) => string | null | undefined; diff --git a/packages/x-charts/src/BarChart/BarLabel/BarLabelItem.tsx b/packages/x-charts/src/BarChart/BarLabel/BarLabelItem.tsx new file mode 100644 index 000000000000..f162efb6aa52 --- /dev/null +++ b/packages/x-charts/src/BarChart/BarLabel/BarLabelItem.tsx @@ -0,0 +1,167 @@ +import * as React from 'react'; +import { useSlotProps } from '@mui/base/utils'; +import PropTypes from 'prop-types'; +import { useUtilityClasses } from './barLabelClasses'; +import { BarLabelOwnerState, BarItem, BarLabelContext } from './BarLabel.types'; +import { getBarLabel } from './getBarLabel'; +import { BarLabel, BarLabelProps } from './BarLabel'; +import { useItemHighlighted } from '../../context'; + +export interface BarLabelSlots { + /** + * The component that renders the bar label. + * @default BarLabel + */ + barLabel?: React.JSXElementConstructor<BarLabelProps>; +} + +export interface BarLabelSlotProps { + barLabel?: Partial<BarLabelProps>; +} + +export type BarLabelItemProps = Omit<BarLabelOwnerState, 'isFaded' | 'isHighlighted'> & + Pick<BarLabelProps, 'style'> & { + /** + * The props used for each component slot. + * @default {} + */ + slotProps?: BarLabelSlotProps; + /** + * Overridable component slots. + * @default {} + */ + slots?: BarLabelSlots; + /** + * The height of the bar. + */ + height: number; + /** + * The width of the bar. + */ + width: number; + /** + * The value of the data point. + */ + value: number | null; + /** + * If provided, the function will be used to format the label of the bar. + * It can be set to 'value' to display the current value. + * @param {BarItem} item The item to format. + * @param {BarLabelContext} context data about the bar. + * @returns {string} The formatted label. + */ + barLabel?: 'value' | ((item: BarItem, context: BarLabelContext) => string | null | undefined); + }; + +/** + * @ignore - internal component. + */ +function BarLabelItem(props: BarLabelItemProps) { + const { + seriesId, + classes: innerClasses, + color, + style, + dataIndex, + barLabel, + slots, + slotProps, + height, + width, + value, + ...other + } = props; + const { isFaded, isHighlighted } = useItemHighlighted({ + seriesId, + dataIndex, + }); + + const ownerState = { + seriesId, + classes: innerClasses, + color, + isFaded, + isHighlighted, + dataIndex, + }; + const classes = useUtilityClasses(ownerState); + + const Component = slots?.barLabel ?? BarLabel; + + const { ownerState: barLabelOwnerState, ...barLabelProps } = useSlotProps({ + elementType: Component, + externalSlotProps: slotProps?.barLabel, + additionalProps: { + ...other, + style, + className: classes.root, + }, + ownerState, + }); + + if (!barLabel) { + return null; + } + + const formattedLabelText = getBarLabel({ + barLabel, + value, + dataIndex, + seriesId, + height, + width, + }); + + if (!formattedLabelText) { + return null; + } + + return ( + <Component {...barLabelProps} {...barLabelOwnerState}> + {formattedLabelText} + </Component> + ); +} + +BarLabelItem.propTypes = { + // ----------------------------- Warning -------------------------------- + // | These PropTypes are generated from the TypeScript type definitions | + // | To update them edit the TypeScript types and run "pnpm proptypes" | + // ---------------------------------------------------------------------- + /** + * If provided, the function will be used to format the label of the bar. + * It can be set to 'value' to display the current value. + * @param {BarItem} item The item to format. + * @param {BarLabelContext} context data about the bar. + * @returns {string} The formatted label. + */ + barLabel: PropTypes.oneOfType([PropTypes.oneOf(['value']), PropTypes.func]), + classes: PropTypes.object, + color: PropTypes.string.isRequired, + dataIndex: PropTypes.number.isRequired, + /** + * The height of the bar. + */ + height: PropTypes.number.isRequired, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, + /** + * The props used for each component slot. + * @default {} + */ + slotProps: PropTypes.object, + /** + * Overridable component slots. + * @default {} + */ + slots: PropTypes.object, + /** + * The value of the data point. + */ + value: PropTypes.number, + /** + * The width of the bar. + */ + width: PropTypes.number.isRequired, +} as any; + +export { BarLabelItem }; diff --git a/packages/x-charts/src/BarChart/BarLabel/BarLabelPlot.tsx b/packages/x-charts/src/BarChart/BarLabel/BarLabelPlot.tsx new file mode 100644 index 000000000000..2b14549f2eb5 --- /dev/null +++ b/packages/x-charts/src/BarChart/BarLabel/BarLabelPlot.tsx @@ -0,0 +1,94 @@ +import * as React from 'react'; +import PropTypes from 'prop-types'; +import { useTransition } from '@react-spring/web'; +import type { AnimationData, CompletedBarData } from '../types'; +import { BarLabelItem, BarLabelItemProps } from './BarLabelItem'; + +const leaveStyle = ({ layout, yOrigin, x, width, y, xOrigin, height }: AnimationData) => ({ + ...(layout === 'vertical' + ? { + y: yOrigin, + x: x + width / 2, + height: 0, + width, + } + : { + y: y + height / 2, + x: xOrigin, + height, + width: 0, + }), +}); + +const enterStyle = ({ x, width, y, height }: AnimationData) => ({ + x: x + width / 2, + y: y + height / 2, + height, + width, +}); + +type BarLabelPlotProps = { + bars: CompletedBarData[]; + skipAnimation?: boolean; + barLabel?: BarLabelItemProps['barLabel']; +}; + +/** + * @ignore - internal component. + */ +function BarLabelPlot(props: BarLabelPlotProps) { + const { bars, skipAnimation, ...other } = props; + + const barLabelTransition = useTransition(bars, { + keys: (bar) => `${bar.seriesId}-${bar.dataIndex}`, + from: leaveStyle, + leave: null, + enter: enterStyle, + update: enterStyle, + immediate: skipAnimation, + }); + + return ( + <React.Fragment> + {barLabelTransition((style, { seriesId, dataIndex, color, value, width, height }) => ( + <BarLabelItem + seriesId={seriesId} + dataIndex={dataIndex} + value={value} + color={color} + width={width} + height={height} + {...other} + style={style} + /> + ))} + </React.Fragment> + ); +} + +BarLabelPlot.propTypes = { + // ----------------------------- Warning -------------------------------- + // | These PropTypes are generated from the TypeScript type definitions | + // | To update them edit the TypeScript types and run "pnpm proptypes" | + // ---------------------------------------------------------------------- + barLabel: PropTypes.oneOfType([PropTypes.oneOf(['value']), PropTypes.func]), + bars: PropTypes.arrayOf( + PropTypes.shape({ + color: PropTypes.string.isRequired, + dataIndex: PropTypes.number.isRequired, + height: PropTypes.number.isRequired, + layout: PropTypes.oneOf(['horizontal', 'vertical']), + maskId: PropTypes.string.isRequired, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, + value: PropTypes.number, + width: PropTypes.number.isRequired, + x: PropTypes.number.isRequired, + xOrigin: PropTypes.number.isRequired, + y: PropTypes.number.isRequired, + yOrigin: PropTypes.number.isRequired, + }), + ).isRequired, + skipAnimation: PropTypes.bool, +} as any; + +export { BarLabelPlot }; diff --git a/packages/x-charts/src/BarChart/BarLabel/barLabelClasses.tsx b/packages/x-charts/src/BarChart/BarLabel/barLabelClasses.tsx new file mode 100644 index 000000000000..b892abd62883 --- /dev/null +++ b/packages/x-charts/src/BarChart/BarLabel/barLabelClasses.tsx @@ -0,0 +1,34 @@ +import generateUtilityClass from '@mui/utils/generateUtilityClass'; +import generateUtilityClasses from '@mui/utils/generateUtilityClasses'; +import composeClasses from '@mui/utils/composeClasses'; +import type { BarLabelOwnerState } from './BarLabel.types'; + +export interface BarLabelClasses { + /** Styles applied to the root element. */ + root: string; + /** Styles applied to the root element if it is highlighted. */ + highlighted: string; + /** Styles applied to the root element if it is faded. */ + faded: string; +} + +export type BarLabelClassKey = keyof BarLabelClasses; + +export function getBarLabelUtilityClass(slot: string) { + return generateUtilityClass('MuiBarLabel', slot); +} + +export const barLabelClasses = generateUtilityClasses('MuiBarLabel', [ + 'root', + 'highlighted', + 'faded', +]); + +export const useUtilityClasses = (ownerState: BarLabelOwnerState) => { + const { classes, seriesId, isFaded, isHighlighted } = ownerState; + const slots = { + root: ['root', `series-${seriesId}`, isHighlighted && 'highlighted', isFaded && 'faded'], + }; + + return composeClasses(slots, getBarLabelUtilityClass, classes); +}; diff --git a/packages/x-charts/src/BarChart/BarLabel/getBarLabel.ts b/packages/x-charts/src/BarChart/BarLabel/getBarLabel.ts new file mode 100644 index 000000000000..2459c764d956 --- /dev/null +++ b/packages/x-charts/src/BarChart/BarLabel/getBarLabel.ts @@ -0,0 +1,20 @@ +import { SeriesId } from '../../models/seriesType/common'; +import { BarLabelFunction } from './BarLabel.types'; + +export const getBarLabel = (options: { + barLabel: 'value' | BarLabelFunction; + value: number | null; + dataIndex: number; + seriesId: SeriesId; + height: number; + width: number; +}): string | null | undefined => { + const { barLabel, value, dataIndex, seriesId, height, width } = options; + + if (barLabel === 'value') { + // We don't want to show the label if the value is 0 + return value ? value?.toString() : null; + } + + return barLabel({ seriesId, dataIndex, value }, { bar: { height, width } }); +}; diff --git a/packages/x-charts/src/BarChart/BarLabel/index.ts b/packages/x-charts/src/BarChart/BarLabel/index.ts new file mode 100644 index 000000000000..8778a7e4605b --- /dev/null +++ b/packages/x-charts/src/BarChart/BarLabel/index.ts @@ -0,0 +1,6 @@ +export { BarLabel } from './BarLabel'; +export type { BarLabelProps } from './BarLabel'; +export { barLabelClasses, getBarLabelUtilityClass } from './barLabelClasses'; +export type { BarLabelSlotProps, BarLabelSlots } from './BarLabelItem'; +export type { BarLabelOwnerState, BarItem, BarLabelContext } from './BarLabel.types'; +export type { BarLabelClasses, BarLabelClassKey } from './barLabelClasses'; diff --git a/packages/x-charts/src/BarChart/BarPlot.tsx b/packages/x-charts/src/BarChart/BarPlot.tsx index 2d51d448006c..7ff1e8999a57 100644 --- a/packages/x-charts/src/BarChart/BarPlot.tsx +++ b/packages/x-charts/src/BarChart/BarPlot.tsx @@ -1,17 +1,19 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import { useTransition } from '@react-spring/web'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; -import { BarElement, BarElementProps, BarElementSlotProps, BarElementSlots } from './BarElement'; -import { AxisDefaultized, isBandScaleConfig, isPointScaleConfig } from '../models/axis'; +import { BarElement, BarElementSlotProps, BarElementSlots } from './BarElement'; +import { AxisDefaultized } from '../models/axis'; import { FormatterResult } from '../models/seriesType/config'; import { BarItemIdentifier } from '../models'; -import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants'; import getColor from './getColor'; import { useChartId } from '../hooks'; import { AnimationData, CompletedBarData, MaskData } from './types'; import { BarClipPath } from './BarClipPath'; +import { BarLabelItemProps, BarLabelSlotProps, BarLabelSlots } from './BarLabel/BarLabelItem'; +import { BarLabelPlot } from './BarLabel/BarLabelPlot'; +import { checkScaleErrors } from './checkScaleErrors'; +import { useBarSeries } from '../hooks/useSeries'; /** * Solution of the equations @@ -45,11 +47,11 @@ function getBandSize({ }; } -export interface BarPlotSlots extends BarElementSlots {} +export interface BarPlotSlots extends BarElementSlots, BarLabelSlots {} -export interface BarPlotSlotProps extends BarElementSlotProps {} +export interface BarPlotSlotProps extends BarElementSlotProps, BarLabelSlotProps {} -export interface BarPlotProps extends Pick<BarElementProps, 'slots' | 'slotProps'> { +export interface BarPlotProps extends Pick<BarLabelItemProps, 'barLabel'> { /** * If `true`, animations are skipped. * @default false @@ -68,6 +70,16 @@ export interface BarPlotProps extends Pick<BarElementProps, 'slots' | 'slotProps * Defines the border radius of the bar element. */ borderRadius?: number; + /** + * The props used for each component slot. + * @default {} + */ + slotProps?: BarPlotSlotProps; + /** + * Overridable component slots. + * @default {} + */ + slots?: BarPlotSlots; } const useAggregatedData = (): { @@ -75,7 +87,7 @@ const useAggregatedData = (): { masksData: MaskData[]; } => { const seriesData = - React.useContext(SeriesContext).bar ?? + useBarSeries() ?? ({ series: {}, stackingGroups: [], seriesOrder: [] } as FormatterResult<'bar'>); const axisData = React.useContext(CartesianContext); const chartId = useChartId(); @@ -96,68 +108,12 @@ const useAggregatedData = (): { const yAxisConfig = yAxis[yAxisKey]; const verticalLayout = series[seriesId].layout === 'vertical'; - let baseScaleConfig: AxisDefaultized<'band'>; - - if (verticalLayout) { - if (!isBandScaleConfig(xAxisConfig)) { - throw new Error( - `MUI X Charts: ${ - xAxisKey === DEFAULT_X_AXIS_KEY - ? 'The first `xAxis`' - : `The x-axis with id "${xAxisKey}"` - } should be of type "band" to display the bar series of id "${seriesId}".`, - ); - } - if (xAxis[xAxisKey].data === undefined) { - throw new Error( - `MUI X Charts: ${ - xAxisKey === DEFAULT_X_AXIS_KEY - ? 'The first `xAxis`' - : `The x-axis with id "${xAxisKey}"` - } should have data property.`, - ); - } - baseScaleConfig = xAxisConfig as AxisDefaultized<'band'>; - if (isBandScaleConfig(yAxisConfig) || isPointScaleConfig(yAxisConfig)) { - throw new Error( - `MUI X Charts: ${ - yAxisKey === DEFAULT_Y_AXIS_KEY - ? 'The first `yAxis`' - : `The y-axis with id "${yAxisKey}"` - } should be a continuous type to display the bar series of id "${seriesId}".`, - ); - } - } else { - if (!isBandScaleConfig(yAxisConfig)) { - throw new Error( - `MUI X Charts: ${ - yAxisKey === DEFAULT_Y_AXIS_KEY - ? 'The first `yAxis`' - : `The y-axis with id "${yAxisKey}"` - } should be of type "band" to display the bar series of id "${seriesId}".`, - ); - } - if (yAxis[yAxisKey].data === undefined) { - throw new Error( - `MUI X Charts: ${ - yAxisKey === DEFAULT_Y_AXIS_KEY - ? 'The first `yAxis`' - : `The y-axis with id "${yAxisKey}"` - } should have data property.`, - ); - } - baseScaleConfig = yAxisConfig as AxisDefaultized<'band'>; - if (isBandScaleConfig(xAxisConfig) || isPointScaleConfig(xAxisConfig)) { - throw new Error( - `MUI X Charts: ${ - xAxisKey === DEFAULT_X_AXIS_KEY - ? 'The first `xAxis`' - : `The x-axis with id "${xAxisKey}"` - } should be a continuous type to display the bar series of id "${seriesId}".`, - ); - } - } + checkScaleErrors(verticalLayout, seriesId, xAxisKey, xAxis, yAxisKey, yAxis); + + const baseScaleConfig = ( + verticalLayout ? xAxisConfig : yAxisConfig + ) as AxisDefaultized<'band'>; const xScale = xAxisConfig.scale; const yScale = yAxisConfig.scale; @@ -197,7 +153,6 @@ const useAggregatedData = (): { height: verticalLayout ? maxValueCoord - minValueCoord : barWidth, width: verticalLayout ? barWidth : maxValueCoord - minValueCoord, color: colorGetter(dataIndex), - highlightScope: series[seriesId].highlightScope, value: series[seriesId].data[dataIndex], maskId: `${chartId}_${stackId || seriesId}_${groupIndex}_${dataIndex}`, }; @@ -272,7 +227,7 @@ const enterStyle = ({ x, width, y, height }: AnimationData) => ({ */ function BarPlot(props: BarPlotProps) { const { completedData, masksData } = useAggregatedData(); - const { skipAnimation, onItemClick, borderRadius, ...other } = props; + const { skipAnimation, onItemClick, borderRadius, barLabel, ...other } = props; const transition = useTransition(completedData, { keys: (bar) => `${bar.seriesId}-${bar.dataIndex}`, from: leaveStyle, @@ -305,13 +260,12 @@ function BarPlot(props: BarPlotProps) { /> ); })} - {transition((style, { seriesId, dataIndex, color, highlightScope, maskId }) => { + {transition((style, { seriesId, dataIndex, color, maskId }) => { const barElement = ( <BarElement id={seriesId} dataIndex={dataIndex} color={color} - highlightScope={highlightScope} {...other} onClick={ onItemClick && @@ -329,6 +283,14 @@ function BarPlot(props: BarPlotProps) { return <g clipPath={`url(#${maskId})`}>{barElement}</g>; })} + {barLabel && ( + <BarLabelPlot + bars={completedData} + skipAnimation={skipAnimation} + barLabel={barLabel} + {...other} + /> + )} </React.Fragment> ); } @@ -336,8 +298,16 @@ function BarPlot(props: BarPlotProps) { BarPlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- + /** + * If provided, the function will be used to format the label of the bar. + * It can be set to 'value' to display the current value. + * @param {BarItem} item The item to format. + * @param {BarLabelContext} context data about the bar. + * @returns {string} The formatted label. + */ + barLabel: PropTypes.oneOfType([PropTypes.oneOf(['value']), PropTypes.func]), /** * Defines the border radius of the bar element. */ diff --git a/packages/x-charts/src/BarChart/checkScaleErrors.test.ts b/packages/x-charts/src/BarChart/checkScaleErrors.test.ts new file mode 100644 index 000000000000..6e780a309ad3 --- /dev/null +++ b/packages/x-charts/src/BarChart/checkScaleErrors.test.ts @@ -0,0 +1,221 @@ +import { expect } from 'chai'; +import { checkScaleErrors } from './checkScaleErrors'; +import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants'; + +describe('BarChart - checkScaleErrors', () => { + describe('verticalLayout: true', () => { + it('should throw an error when the x-axis is not a band scale', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + true, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'linear' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'linear' }, + }, + ); + }).throws( + 'MUI X Charts: The first `xAxis` should be of type "band" to display the bar series of id "seriesId".', + ); + }); + + it('should throw an error when the x-axis has no data property', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + true, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'band' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'linear' }, + }, + ); + }).throws('MUI X Charts: The first `xAxis` should have data property.'); + }); + + it('should throw an error when the y-axis is not a continuous scale', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + true, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'band', data: [] }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'band' }, + }, + ); + }).throws( + 'MUI X Charts: The first `yAxis` should be a continuous type to display the bar series of id "seriesId".', + ); + }); + + it('should not throw an error when the scales are correct', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + true, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'band', data: [] }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'linear' }, + }, + ); + }).not.to.throw(); + }); + }); + + describe('verticalLayout: false', () => { + it('should throw an error when the y-axis is not a band scale', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + false, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'linear' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'linear' }, + }, + ); + }).throws( + 'MUI X Charts: The first `yAxis` should be of type "band" to display the bar series of id "seriesId".', + ); + }); + + it('should throw an error when the y-axis has no data property', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + false, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'linear' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'band' }, + }, + ); + }).throws('MUI X Charts: The first `yAxis` should have data property.'); + }); + + it('should throw an error when the x-axis is not a continuous scale', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + false, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'band' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'band', data: [] }, + }, + ); + }).throws( + 'MUI X Charts: The first `xAxis` should be a continuous type to display the bar series of id "seriesId".', + ); + }); + + it('should not throw an error when the scales are correct', () => { + expect(() => { + const xKey = DEFAULT_X_AXIS_KEY; + const yKey = DEFAULT_Y_AXIS_KEY; + checkScaleErrors( + false, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'linear' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'band', data: [] }, + }, + ); + }).not.to.throw(); + }); + }); + + it('should throw an error specifying the x-axis id when it is not the default one', () => { + expect(() => { + const xKey = 'x-test'; + const yKey = 'y-test'; + checkScaleErrors( + true, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'linear' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'band' }, + }, + ); + }).throws( + 'MUI X Charts: The x-axis with id "x-test" should be of type "band" to display the bar series of id "seriesId".', + ); + }); + + it('should throw an error specifying the y-axis id when it is not the default one', () => { + expect(() => { + const xKey = 'x-test'; + const yKey = 'y-test'; + checkScaleErrors( + false, + 'seriesId', + xKey, + { + // @ts-expect-error + [xKey]: { id: xKey, scaleType: 'band' }, + }, + yKey, + { + [yKey]: { id: yKey, scaleType: 'linear' }, + }, + ); + }).throws( + 'MUI X Charts: The y-axis with id "y-test" should be of type "band" to display the bar series of id "seriesId".', + ); + }); +}); diff --git a/packages/x-charts/src/BarChart/checkScaleErrors.ts b/packages/x-charts/src/BarChart/checkScaleErrors.ts new file mode 100644 index 000000000000..e3b7b0803e96 --- /dev/null +++ b/packages/x-charts/src/BarChart/checkScaleErrors.ts @@ -0,0 +1,49 @@ +import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants'; +import { AxisDefaultized, isBandScaleConfig, isPointScaleConfig } from '../models/axis'; +import { SeriesId } from '../models/seriesType/common'; + +const getAxisMessage = (axisDirection: 'x' | 'y', axisKey: string) => { + const axisName = `${axisDirection}-axis`; + const axisKeyName = `${axisDirection}Axis`; + const axisDefaultKey = axisDirection === 'x' ? DEFAULT_X_AXIS_KEY : DEFAULT_Y_AXIS_KEY; + return axisKey === axisDefaultKey + ? `The first \`${axisKeyName}\`` + : `The ${axisName} with id "${axisKey}"`; +}; + +export function checkScaleErrors( + verticalLayout: boolean, + seriesId: SeriesId, + xAxisKey: string, + xAxis: { DEFAULT_X_AXIS_KEY: AxisDefaultized } & { [axisKey: string]: AxisDefaultized }, + yAxisKey: string, + yAxis: { DEFAULT_X_AXIS_KEY: AxisDefaultized } & { [axisKey: string]: AxisDefaultized }, +): void { + const xAxisConfig = xAxis[xAxisKey]; + const yAxisConfig = yAxis[yAxisKey]; + + const discreteAxisConfig = verticalLayout ? xAxisConfig : yAxisConfig; + const continuousAxisConfig = verticalLayout ? yAxisConfig : xAxisConfig; + + const discreteAxisKey = verticalLayout ? xAxisKey : yAxisKey; + const continuousAxisKey = verticalLayout ? yAxisKey : xAxisKey; + + const discreteAxisDirection = verticalLayout ? 'x' : 'y'; + const continuousAxisDirection = verticalLayout ? 'y' : 'x'; + + if (!isBandScaleConfig(discreteAxisConfig)) { + throw new Error( + `MUI X Charts: ${getAxisMessage(discreteAxisDirection, discreteAxisKey)} should be of type "band" to display the bar series of id "${seriesId}".`, + ); + } + if (discreteAxisConfig.data === undefined) { + throw new Error( + `MUI X Charts: ${getAxisMessage(discreteAxisDirection, discreteAxisKey)} should have data property.`, + ); + } + if (isBandScaleConfig(continuousAxisConfig) || isPointScaleConfig(continuousAxisConfig)) { + throw new Error( + `MUI X Charts: ${getAxisMessage(continuousAxisDirection, continuousAxisKey)} should be a continuous type to display the bar series of id "${seriesId}".`, + ); + } +} diff --git a/packages/x-charts/src/BarChart/formatter.ts b/packages/x-charts/src/BarChart/formatter.ts index 548f363c3010..808268e3e130 100644 --- a/packages/x-charts/src/BarChart/formatter.ts +++ b/packages/x-charts/src/BarChart/formatter.ts @@ -6,7 +6,7 @@ import { DatasetType, Formatter, } from '../models/seriesType/config'; -import defaultizeValueFormatter from '../internals/defaultizeValueFormatter'; +import { defaultizeValueFormatter } from '../internals/defaultizeValueFormatter'; import { DefaultizedProps } from '../models/helpers'; import { SeriesId } from '../models/seriesType/common'; diff --git a/packages/x-charts/src/BarChart/getColor.ts b/packages/x-charts/src/BarChart/getColor.ts index 31a06feac93b..ccb8beb2ea23 100644 --- a/packages/x-charts/src/BarChart/getColor.ts +++ b/packages/x-charts/src/BarChart/getColor.ts @@ -3,14 +3,14 @@ import { DefaultizedBarSeriesType } from '../models/seriesType/bar'; export default function getColor( series: DefaultizedBarSeriesType, - xAxis: AxisDefaultized, - yAxis: AxisDefaultized, + xAxis?: AxisDefaultized, + yAxis?: AxisDefaultized, ) { const verticalLayout = series.layout === 'vertical'; - const bandColorScale = verticalLayout ? xAxis.colorScale : yAxis.colorScale; - const valueColorScale = verticalLayout ? yAxis.colorScale : xAxis.colorScale; - const bandValues = verticalLayout ? xAxis.data! : yAxis.data!; + const bandColorScale = verticalLayout ? xAxis?.colorScale : yAxis?.colorScale; + const valueColorScale = verticalLayout ? yAxis?.colorScale : xAxis?.colorScale; + const bandValues = verticalLayout ? xAxis?.data : yAxis?.data; if (valueColorScale) { return (dataIndex: number) => { @@ -22,7 +22,7 @@ export default function getColor( return color; }; } - if (bandColorScale) { + if (bandColorScale && bandValues) { return (dataIndex: number) => { const value = bandValues[dataIndex]; const color = value === null ? series.color : bandColorScale(value); diff --git a/packages/x-charts/src/BarChart/index.ts b/packages/x-charts/src/BarChart/index.ts index b84ff348687d..2c0b9ffa33ab 100644 --- a/packages/x-charts/src/BarChart/index.ts +++ b/packages/x-charts/src/BarChart/index.ts @@ -1,3 +1,4 @@ export * from './BarChart'; export * from './BarPlot'; export * from './BarElement'; +export * from './BarLabel'; diff --git a/packages/x-charts/src/BarChart/plugin.ts b/packages/x-charts/src/BarChart/plugin.ts new file mode 100644 index 000000000000..1527621c8026 --- /dev/null +++ b/packages/x-charts/src/BarChart/plugin.ts @@ -0,0 +1,12 @@ +import { ChartsPluginType } from '../models/plugin'; +import { getExtremumX, getExtremumY } from './extremums'; +import formatter from './formatter'; +import getColor from './getColor'; + +export const plugin: ChartsPluginType<'bar'> = { + seriesType: 'bar', + seriesFormatter: formatter, + colorProcessor: getColor, + xExtremumGetter: getExtremumX, + yExtremumGetter: getExtremumY, +}; diff --git a/packages/x-charts/src/BarChart/types.ts b/packages/x-charts/src/BarChart/types.ts index e72cdaea18eb..77fcc1e62688 100644 --- a/packages/x-charts/src/BarChart/types.ts +++ b/packages/x-charts/src/BarChart/types.ts @@ -1,4 +1,3 @@ -import type { HighlightScope } from '../context'; import type { BarSeriesType } from '../models'; import type { SeriesId } from '../models/seriesType/common'; @@ -17,7 +16,6 @@ export interface CompletedBarData extends AnimationData { dataIndex: number; color: string; value: number | null; - highlightScope?: Partial<HighlightScope>; maskId: string; } diff --git a/packages/x-charts/src/ChartContainer/ChartContainer.tsx b/packages/x-charts/src/ChartContainer/ChartContainer.tsx index 1053b7030992..31770a088e55 100644 --- a/packages/x-charts/src/ChartContainer/ChartContainer.tsx +++ b/packages/x-charts/src/ChartContainer/ChartContainer.tsx @@ -7,23 +7,33 @@ import { SeriesContextProviderProps, } from '../context/SeriesContextProvider'; import { InteractionProvider } from '../context/InteractionProvider'; +import { ColorProvider } from '../context/ColorProvider'; import { useReducedMotion } from '../hooks/useReducedMotion'; import { ChartsSurface, ChartsSurfaceProps } from '../ChartsSurface'; import { CartesianContextProvider, CartesianContextProviderProps, } from '../context/CartesianContextProvider'; -import { HighlightProvider } from '../context/HighlightProvider'; import { ChartsAxesGradients } from '../internals/components/ChartsAxesGradients'; +import { HighlightedProvider, HighlightedProviderProps } from '../context'; +import { ChartsPluginType } from '../models/plugin'; +import { ChartSeriesType } from '../models/seriesType/config'; +import { usePluginsMerge } from './usePluginsMerge'; export type ChartContainerProps = Omit< ChartsSurfaceProps & - SeriesContextProviderProps & + Omit<SeriesContextProviderProps, 'seriesFormatters'> & Omit<DrawingProviderProps, 'svgRef'> & - CartesianContextProviderProps, + Omit<CartesianContextProviderProps, 'xExtremumGetters' | 'yExtremumGetters'> & + HighlightedProviderProps, 'children' > & { children?: React.ReactNode; + /** + * An array of plugins defining how to preprocess data. + * If not provided, the container supports line, bar, scatter and pie charts. + */ + plugins?: ChartsPluginType<ChartSeriesType>[]; }; const ChartContainer = React.forwardRef(function ChartContainer(props: ChartContainerProps, ref) { @@ -40,35 +50,56 @@ const ChartContainer = React.forwardRef(function ChartContainer(props: ChartCont title, desc, disableAxisListener, + highlightedItem, + onHighlightChange, + plugins, children, } = props; const svgRef = React.useRef<SVGSVGElement>(null); const handleRef = useForkRef(ref, svgRef); + const { xExtremumGetters, yExtremumGetters, seriesFormatters, colorProcessors } = + usePluginsMerge(plugins); useReducedMotion(); // a11y reduce motion (see: https://react-spring.dev/docs/utilities/use-reduced-motion) return ( <DrawingProvider width={width} height={height} margin={margin} svgRef={svgRef}> - <SeriesContextProvider series={series} colors={colors} dataset={dataset}> - <CartesianContextProvider xAxis={xAxis} yAxis={yAxis} dataset={dataset}> - <InteractionProvider> - <HighlightProvider> - <ChartsSurface - width={width} - height={height} - ref={handleRef} - sx={sx} - title={title} - desc={desc} - disableAxisListener={disableAxisListener} + <ColorProvider colorProcessors={colorProcessors}> + <SeriesContextProvider + series={series} + colors={colors} + dataset={dataset} + seriesFormatters={seriesFormatters} + > + <CartesianContextProvider + xAxis={xAxis} + yAxis={yAxis} + dataset={dataset} + xExtremumGetters={xExtremumGetters} + yExtremumGetters={yExtremumGetters} + > + <InteractionProvider> + <HighlightedProvider + highlightedItem={highlightedItem} + onHighlightChange={onHighlightChange} > - <ChartsAxesGradients /> - {children} - </ChartsSurface> - </HighlightProvider> - </InteractionProvider> - </CartesianContextProvider> - </SeriesContextProvider> + <ChartsSurface + width={width} + height={height} + ref={handleRef} + sx={sx} + title={title} + desc={desc} + disableAxisListener={disableAxisListener} + > + <ChartsAxesGradients /> + {children} + </ChartsSurface> + </HighlightedProvider> + </InteractionProvider> + </CartesianContextProvider> + </SeriesContextProvider> + </ColorProvider> </DrawingProvider> ); }); @@ -76,7 +107,7 @@ const ChartContainer = React.forwardRef(function ChartContainer(props: ChartCont ChartContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, className: PropTypes.string, @@ -100,6 +131,13 @@ ChartContainer.propTypes = { * The height of the chart in px. */ height: PropTypes.number.isRequired, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), /** * The margin between the SVG and the drawing area. * It's used for leaving some space for extra information such as the x- and y-axis or legend. @@ -112,6 +150,17 @@ ChartContainer.propTypes = { right: PropTypes.number, top: PropTypes.number, }), + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, + /** + * An array of plugins defining how to preprocess data. + * If not provided, the container supports line, bar, scatter and pie charts. + */ + plugins: PropTypes.arrayOf(PropTypes.object), /** * The array of series to display. * Each type of series has its own specificity. @@ -182,7 +231,7 @@ ChartContainer.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['bottom', 'top']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, @@ -253,7 +302,7 @@ ChartContainer.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['left', 'right']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, diff --git a/packages/x-charts/src/ChartContainer/defaultPlugins.ts b/packages/x-charts/src/ChartContainer/defaultPlugins.ts new file mode 100644 index 000000000000..c14585c0d6b5 --- /dev/null +++ b/packages/x-charts/src/ChartContainer/defaultPlugins.ts @@ -0,0 +1,12 @@ +import { plugin as barPlugin } from '../BarChart/plugin'; +import { plugin as scatterPlugin } from '../ScatterChart/plugin'; +import { plugin as linePlugin } from '../LineChart/plugin'; +import { plugin as piePlugin } from '../PieChart/plugin'; +import { ChartsPluginType } from '../models'; + +export const defaultPlugins: ChartsPluginType<'bar' | 'scatter' | 'line' | 'pie'>[] = [ + barPlugin, + scatterPlugin, + linePlugin, + piePlugin, +]; diff --git a/packages/x-charts/src/ChartContainer/usePluginsMerge.ts b/packages/x-charts/src/ChartContainer/usePluginsMerge.ts new file mode 100644 index 000000000000..ee1043e918f9 --- /dev/null +++ b/packages/x-charts/src/ChartContainer/usePluginsMerge.ts @@ -0,0 +1,41 @@ +import * as React from 'react'; +import { ChartsPluginType, ColorProcessorsConfig } from '../models'; +import { ChartSeriesType } from '../models/seriesType/config'; +import { ExtremumGettersConfig } from '../context/CartesianContextProvider'; +import { SeriesFormatterConfig } from '../context/SeriesContextProvider'; +import { defaultPlugins } from './defaultPlugins'; + +export function usePluginsMerge<T extends ChartSeriesType>(plugins?: ChartsPluginType<T>[]) { + const defaultizedPlugins = plugins ?? defaultPlugins; + + return React.useMemo(() => { + const seriesFormatters: SeriesFormatterConfig<ChartSeriesType> = {}; + const colorProcessors: ColorProcessorsConfig<ChartSeriesType> = {}; + const xExtremumGetters: ExtremumGettersConfig<ChartSeriesType> = {}; + const yExtremumGetters: ExtremumGettersConfig<ChartSeriesType> = {}; + + for (let i = 0; i < defaultizedPlugins.length; i += 1) { + const plugin = defaultizedPlugins[i]; + + // To remove those any we will need to solve this union discrimination issue: + // https://www.typescriptlang.org/play/?#code/FDAuE8AcFMAIDkCuBbARtATgYQPYDsAzASwHNYBeWAb2FlgGsi8ATALlgHI8V0MOBuWrBwwMAQ1A4M7ABQAPdtzSYAlBQB8sJb0EBfEBBiwAyqAxMSuQqQrUhjFuw4BnMxYFCRmCVNkLYruZ4JGrkmoEWeiAAxviuWqhWxCTsSMrY+Mm2VAxMbLAARNqYBQA0wqI+0rByGrAATLAAVDWw+rF48YFJpOymQZaZNpQ5DvkFEcFlFd6S1bVhsAAG9S0AJFRyukttMXGgsB3JzrYA2niJQyTl3VcAugZQcADylXPOALJikJAW2ULFDAAflSPEwPRIpw4XnEcw4d1KQkmJBBJjcwQhUJhVXhiN0gmAHXi2LmXx+FnYr1mUk+31+wWy+JABCksBkABtoAcjjYcARDldnGoaCA6AB6MWwADqUnoJxw9FgRH5AHc4L9ooroGJogALQ5iZxwPJEABuRGYiDE7PASJVRFAerZPJIADoxsKhHRooa4FwwXxWF66DNYVIyfTIS73Xk7rZoySpIIQyHUBhtfRkyGfUbOMiOEGU3RExgIxZTtGxnHKAm3kng8xoAQxIh2aBC0W0xms-pvftqLkWOUS2141chBLYABJDimuB4HBKxtiWBiVA4RAHXU4FWwSSwTkHAAqxlgiBYmFcYhYAusbrGq5vtepGFX6YPTHo0GYnjrpbp5ZVrYJZ6EAA + seriesFormatters[plugin.seriesType] = plugin.seriesFormatter as any; + + colorProcessors[plugin.seriesType] = plugin.colorProcessor as any; + + if (plugin.xExtremumGetter) { + xExtremumGetters[plugin.seriesType] = plugin.xExtremumGetter as any; + } + + if (plugin.yExtremumGetter) { + yExtremumGetters[plugin.seriesType] = plugin.yExtremumGetter as any; + } + } + return { + seriesFormatters, + colorProcessors, + xExtremumGetters, + yExtremumGetters, + }; + }, [defaultizedPlugins]); +} diff --git a/packages/x-charts/src/ChartsAxis/ChartsAxis.tsx b/packages/x-charts/src/ChartsAxis/ChartsAxis.tsx index 0b6e7ce9c3e9..db42c36c7cb7 100644 --- a/packages/x-charts/src/ChartsAxis/ChartsAxis.tsx +++ b/packages/x-charts/src/ChartsAxis/ChartsAxis.tsx @@ -146,7 +146,7 @@ function ChartsAxis(props: ChartsAxisProps) { ChartsAxis.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Indicate which axis to display the bottom of the charts. diff --git a/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx b/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx index cbdc63729710..d72082da7b8d 100644 --- a/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx +++ b/packages/x-charts/src/ChartsAxisHighlight/ChartsAxisHighlight.tsx @@ -132,7 +132,7 @@ function ChartsAxisHighlight(props: ChartsAxisHighlightProps) { ChartsAxisHighlight.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- x: PropTypes.oneOf(['band', 'line', 'none']), y: PropTypes.oneOf(['band', 'line', 'none']), diff --git a/packages/x-charts/src/ChartsClipPath/ChartsClipPath.tsx b/packages/x-charts/src/ChartsClipPath/ChartsClipPath.tsx index cce380818f1d..c3dfef172bb9 100644 --- a/packages/x-charts/src/ChartsClipPath/ChartsClipPath.tsx +++ b/packages/x-charts/src/ChartsClipPath/ChartsClipPath.tsx @@ -32,7 +32,7 @@ function ChartsClipPath(props: ChartsClipPathProps) { ChartsClipPath.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- id: PropTypes.string.isRequired, offset: PropTypes.shape({ diff --git a/packages/x-charts/src/ChartsGrid/ChartsGrid.tsx b/packages/x-charts/src/ChartsGrid/ChartsGrid.tsx index e91f34ced8f4..01b2539a4ce9 100644 --- a/packages/x-charts/src/ChartsGrid/ChartsGrid.tsx +++ b/packages/x-charts/src/ChartsGrid/ChartsGrid.tsx @@ -122,7 +122,7 @@ function ChartsGrid(props: ChartsGridProps) { ChartsGrid.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-charts/src/ChartsLegend/ChartsLegend.tsx b/packages/x-charts/src/ChartsLegend/ChartsLegend.tsx index 854bf0db8935..9be1635a6b77 100644 --- a/packages/x-charts/src/ChartsLegend/ChartsLegend.tsx +++ b/packages/x-charts/src/ChartsLegend/ChartsLegend.tsx @@ -4,11 +4,11 @@ import { useSlotProps } from '@mui/base/utils'; import { unstable_composeClasses as composeClasses } from '@mui/utils'; import { useThemeProps, useTheme, Theme } from '@mui/material/styles'; import { AnchorPosition, Direction, getSeriesToDisplay } from './utils'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { ChartsLegendClasses, getLegendUtilityClass } from './chartsLegendClasses'; import { DefaultizedProps } from '../models/helpers'; import { DefaultChartsLegend, LegendRendererProps } from './DefaultChartsLegend'; import { useDrawingArea } from '../hooks'; +import { useSeries } from '../hooks/useSeries'; export interface ChartsLegendSlots { /** @@ -83,7 +83,7 @@ function ChartsLegend(inProps: ChartsLegendProps) { const classes = useUtilityClasses({ ...props, theme }); const drawingArea = useDrawingArea(); - const series = React.useContext(SeriesContext); + const series = useSeries(); const seriesToDisplay = getSeriesToDisplay(series); @@ -109,7 +109,7 @@ function ChartsLegend(inProps: ChartsLegendProps) { ChartsLegend.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-charts/src/ChartsLegend/DefaultChartsLegend.tsx b/packages/x-charts/src/ChartsLegend/DefaultChartsLegend.tsx index 1fcd0e418283..8ef3c9f2dbba 100644 --- a/packages/x-charts/src/ChartsLegend/DefaultChartsLegend.tsx +++ b/packages/x-charts/src/ChartsLegend/DefaultChartsLegend.tsx @@ -296,7 +296,7 @@ function DefaultChartsLegend(props: LegendRendererProps) { DefaultChartsLegend.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-charts/src/ChartsLegend/utils.ts b/packages/x-charts/src/ChartsLegend/utils.ts index a5da75c6985b..8f57e1077219 100644 --- a/packages/x-charts/src/ChartsLegend/utils.ts +++ b/packages/x-charts/src/ChartsLegend/utils.ts @@ -12,7 +12,7 @@ export type AnchorPosition = { horizontal: AnchorX; vertical: AnchorY }; export type Direction = 'row' | 'column'; -const legendGetter: { [T in ChartSeriesType]: LegendGetter<T> } = { +const legendGetter: { [T in ChartSeriesType]?: LegendGetter<T> } = { bar: getBarLegend, scatter: getScatterLegend, line: getLineLegend, @@ -21,7 +21,9 @@ const legendGetter: { [T in ChartSeriesType]: LegendGetter<T> } = { export function getSeriesToDisplay(series: FormattedSeries) { return (Object.keys(series) as ChartSeriesType[]).flatMap( - <T extends ChartSeriesType>(seriesType: T) => - legendGetter[seriesType as T](series[seriesType as T]!), + <T extends ChartSeriesType>(seriesType: T) => { + const getter = legendGetter[seriesType as T]; + return getter === undefined ? [] : getter(series[seriesType as T]!); + }, ); } diff --git a/packages/x-charts/src/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.tsx b/packages/x-charts/src/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.tsx index 16a0c5330b15..f134b0b2f599 100644 --- a/packages/x-charts/src/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.tsx +++ b/packages/x-charts/src/ChartsOnAxisClickHandler/ChartsOnAxisClickHandler.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { SvgContext } from '../context/DrawingProvider'; import { InteractionContext } from '../context/InteractionProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; -import { SeriesContext } from '../context/SeriesContextProvider'; +import { useSeries } from '../hooks/useSeries'; +import { useSvgRef } from '../hooks'; type AxisData = { dataIndex: number; @@ -24,8 +24,8 @@ export interface ChartsOnAxisClickHandlerProps { function ChartsOnAxisClickHandler(props: ChartsOnAxisClickHandlerProps) { const { onAxisClick } = props; - const svgRef = React.useContext(SvgContext); - const series = React.useContext(SeriesContext); + const svgRef = useSvgRef(); + const series = useSeries(); const { axis } = React.useContext(InteractionContext); const { xAxisIds, xAxis, yAxisIds, yAxis } = React.useContext(CartesianContext); @@ -76,7 +76,7 @@ function ChartsOnAxisClickHandler(props: ChartsOnAxisClickHandlerProps) { ChartsOnAxisClickHandler.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The function called for onClick events. diff --git a/packages/x-charts/src/ChartsReferenceLine/ChartsReferenceLine.tsx b/packages/x-charts/src/ChartsReferenceLine/ChartsReferenceLine.tsx index 2050086fee21..2417b345099b 100644 --- a/packages/x-charts/src/ChartsReferenceLine/ChartsReferenceLine.tsx +++ b/packages/x-charts/src/ChartsReferenceLine/ChartsReferenceLine.tsx @@ -32,7 +32,7 @@ function ChartsReferenceLine(props: ChartsReferenceLineProps) { ChartsReferenceLine.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The id of the axis used for the reference value. diff --git a/packages/x-charts/src/ChartsSurface.tsx b/packages/x-charts/src/ChartsSurface.tsx index 3cbcac24ebf0..3203bddeb010 100644 --- a/packages/x-charts/src/ChartsSurface.tsx +++ b/packages/x-charts/src/ChartsSurface.tsx @@ -74,7 +74,7 @@ const ChartsSurface = React.forwardRef<SVGSVGElement, ChartsSurfaceProps>(functi ChartsSurface.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, className: PropTypes.string, diff --git a/packages/x-charts/src/ChartsText/ChartsText.tsx b/packages/x-charts/src/ChartsText/ChartsText.tsx index 687f7955e17a..31c7a7a5a473 100644 --- a/packages/x-charts/src/ChartsText/ChartsText.tsx +++ b/packages/x-charts/src/ChartsText/ChartsText.tsx @@ -41,7 +41,7 @@ function ChartsText(props: ChartsTextProps) { break; } - const transforms = []; + const transforms: string[] = []; // if (scaleToFit) { // const lineWidth = wordsByLines[0].width; // transforms.push(`scale(${(isNumber(width as number) ? (width as number) / lineWidth : 1) / lineWidth})`); @@ -79,7 +79,7 @@ function ChartsText(props: ChartsTextProps) { ChartsText.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Height of a text line (in `em`). diff --git a/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx b/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx index 29c4d26e8835..08f59b0ec6f2 100644 --- a/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx +++ b/packages/x-charts/src/ChartsTooltip/ChartsAxisTooltipContent.tsx @@ -3,15 +3,15 @@ import PropTypes from 'prop-types'; import { SxProps, Theme } from '@mui/material/styles'; import { useSlotProps } from '@mui/base/utils'; import { AxisInteractionData } from '../context/InteractionProvider'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; import { ChartSeriesDefaultized, ChartSeriesType } from '../models/seriesType/config'; import { AxisDefaultized } from '../models/axis'; import { ChartsTooltipClasses } from './chartsTooltipClasses'; import { DefaultChartsAxisTooltipContent } from './DefaultChartsAxisTooltipContent'; -import { isCartesianSeriesType } from './utils'; -import colorGetter from '../internals/colorGetter'; +import { isCartesianSeriesType } from '../internals/isCartesian'; +import { useColorProcessor } from '../hooks/useColor'; import { ZAxisContext } from '../context/ZAxisContextProvider'; +import { useSeries } from '../hooks/useSeries'; type ChartSeriesDefaultizedWithColorGetter = ChartSeriesDefaultized<ChartSeriesType> & { getColor: (dataIndex: number) => string; @@ -61,7 +61,9 @@ function ChartsAxisTooltipContent(props: { const { xAxisIds, xAxis, yAxisIds, yAxis } = React.useContext(CartesianContext); const { zAxisIds, zAxis } = React.useContext(ZAxisContext); - const series = React.useContext(SeriesContext); + const series = useSeries(); + + const colorProcessors = useColorProcessor(); const USED_AXIS_ID = isXaxis ? xAxisIds[0] : yAxisIds[0]; @@ -76,31 +78,33 @@ function ChartsAxisTooltipContent(props: { if (axisKey === undefined || axisKey === USED_AXIS_ID) { const seriesToAdd = series[seriesType]!.series[seriesId]; - let getColor: (index: number) => string; - switch (seriesToAdd.type) { - case 'scatter': - getColor = colorGetter( - seriesToAdd, - xAxis[seriesToAdd.xAxisKey ?? xAxisIds[0]], - yAxis[seriesToAdd.yAxisKey ?? yAxisIds[0]], - zAxis[seriesToAdd.zAxisKey ?? zAxisIds[0]], - ); - break; - default: - getColor = colorGetter( - seriesToAdd, - xAxis[seriesToAdd.xAxisKey ?? xAxisIds[0]], - yAxis[seriesToAdd.yAxisKey ?? yAxisIds[0]], - ); - break; - } + const zAxisKey = (seriesToAdd as any).zAxisKey ?? zAxisIds[0]; + + const getColor = + colorProcessors[seriesType]?.( + seriesToAdd as any, + xAxis[seriesToAdd.xAxisKey ?? xAxisIds[0]], + yAxis[seriesToAdd.yAxisKey ?? yAxisIds[0]], + zAxisKey && zAxis[zAxisKey], + ) ?? (() => ''); rep.push({ ...seriesToAdd, getColor }); } }); }); return rep; - }, [USED_AXIS_ID, isXaxis, series, xAxis, xAxisIds, yAxis, yAxisIds, zAxis, zAxisIds]); + }, [ + USED_AXIS_ID, + colorProcessors, + isXaxis, + series, + xAxis, + xAxisIds, + yAxis, + yAxisIds, + zAxis, + zAxisIds, + ]); const relevantAxis = React.useMemo(() => { return isXaxis ? xAxis[USED_AXIS_ID] : yAxis[USED_AXIS_ID]; @@ -127,7 +131,7 @@ function ChartsAxisTooltipContent(props: { ChartsAxisTooltipContent.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- axisData: PropTypes.shape({ x: PropTypes.shape({ diff --git a/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx b/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx index a61a08294ebc..ea0951a2d1a4 100644 --- a/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx +++ b/packages/x-charts/src/ChartsTooltip/ChartsItemTooltipContent.tsx @@ -3,13 +3,13 @@ import PropTypes from 'prop-types'; import { SxProps, Theme } from '@mui/material/styles'; import { useSlotProps } from '@mui/base/utils'; import { ItemInteractionData } from '../context/InteractionProvider'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { ChartSeriesDefaultized, ChartSeriesType } from '../models/seriesType/config'; import { ChartsTooltipClasses } from './chartsTooltipClasses'; import { DefaultChartsItemTooltipContent } from './DefaultChartsItemTooltipContent'; import { CartesianContext } from '../context/CartesianContextProvider'; -import colorGetter from '../internals/colorGetter'; import { ZAxisContext } from '../context/ZAxisContextProvider'; +import { useColorProcessor } from '../hooks/useColor'; +import { useSeries } from '../hooks/useSeries'; export type ChartsItemContentProps<T extends ChartSeriesType = ChartSeriesType> = { /** @@ -42,38 +42,23 @@ function ChartsItemTooltipContent<T extends ChartSeriesType>(props: { }) { const { content, itemData, sx, classes, contentProps } = props; - const series = React.useContext(SeriesContext)[itemData.type]!.series[ - itemData.seriesId - ] as ChartSeriesDefaultized<T>; + const series = useSeries()[itemData.type]!.series[itemData.seriesId] as ChartSeriesDefaultized<T>; const { xAxis, yAxis, xAxisIds, yAxisIds } = React.useContext(CartesianContext); const { zAxis, zAxisIds } = React.useContext(ZAxisContext); + const colorProcessors = useColorProcessor(); - const defaultXAxisId = xAxisIds[0]; - const defaultYAxisId = yAxisIds[0]; - const defaultZAxisId = zAxisIds[0]; + const xAxisKey = (series as any).xAxisKey ?? xAxisIds[0]; + const yAxisKey = (series as any).yAxisKey ?? yAxisIds[0]; + const zAxisKey = (series as any).zAxisKey ?? zAxisIds[0]; - let getColor: (index: number) => string; - switch (series.type) { - case 'pie': - getColor = colorGetter(series); - break; - case 'scatter': - getColor = colorGetter( - series, - xAxis[series.xAxisKey ?? defaultXAxisId], - yAxis[series.yAxisKey ?? defaultYAxisId], - zAxis[series.zAxisKey ?? defaultZAxisId], - ); - break; - default: - getColor = colorGetter( - series, - xAxis[series.xAxisKey ?? defaultXAxisId], - yAxis[series.yAxisKey ?? defaultYAxisId], - ); - break; - } + const getColor = + colorProcessors[series.type]?.( + series as any, + xAxisKey && xAxis[xAxisKey], + yAxisKey && yAxis[yAxisKey], + zAxisKey && zAxis[zAxisKey], + ) ?? (() => ''); const Content = content ?? DefaultChartsItemTooltipContent; const chartTooltipContentProps = useSlotProps({ @@ -94,7 +79,7 @@ function ChartsItemTooltipContent<T extends ChartSeriesType>(props: { ChartsItemTooltipContent.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object.isRequired, content: PropTypes.elementType, diff --git a/packages/x-charts/src/ChartsTooltip/ChartsTooltip.tsx b/packages/x-charts/src/ChartsTooltip/ChartsTooltip.tsx index 3f8f0f6f0335..1b321df5522d 100644 --- a/packages/x-charts/src/ChartsTooltip/ChartsTooltip.tsx +++ b/packages/x-charts/src/ChartsTooltip/ChartsTooltip.tsx @@ -186,7 +186,7 @@ function ChartsTooltip(props: ChartsTooltipProps) { ChartsTooltip.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Component to override the tooltip content when trigger is set to 'axis'. diff --git a/packages/x-charts/src/ChartsTooltip/DefaultChartsAxisTooltipContent.tsx b/packages/x-charts/src/ChartsTooltip/DefaultChartsAxisTooltipContent.tsx index 626c8c9702e3..5f76ce4edd6c 100644 --- a/packages/x-charts/src/ChartsTooltip/DefaultChartsAxisTooltipContent.tsx +++ b/packages/x-charts/src/ChartsTooltip/DefaultChartsAxisTooltipContent.tsx @@ -10,8 +10,9 @@ import { ChartsTooltipRow, } from './ChartsTooltipTable'; import type { ChartsAxisContentProps } from './ChartsAxisTooltipContent'; -import { isCartesianSeries, utcFormatter } from './utils'; +import { utcFormatter } from './utils'; import { getLabel } from '../internals/getLabel'; +import { isCartesianSeries } from '../internals/isCartesian'; function DefaultChartsAxisTooltipContent(props: ChartsAxisContentProps) { const { series, axis, dataIndex, axisValue, sx, classes } = props; @@ -39,32 +40,28 @@ function DefaultChartsAxisTooltipContent(props: ChartsAxisContentProps) { )} <tbody> - {series - .filter(isCartesianSeries) - .map(({ color, id, label, valueFormatter, data, getColor }) => { - // @ts-ignore - const formattedValue = valueFormatter(data[dataIndex] ?? null, { dataIndex }); - if (formattedValue == null) { - return null; - } - const formattedLabel = getLabel(label, 'tooltip'); - return ( - <ChartsTooltipRow key={id} className={classes.row}> - <ChartsTooltipCell className={clsx(classes.markCell, classes.cell)}> - <ChartsTooltipMark - color={getColor(dataIndex) ?? color} - className={classes.mark} - /> - </ChartsTooltipCell> - <ChartsTooltipCell className={clsx(classes.labelCell, classes.cell)}> - {formattedLabel ? <Typography>{formattedLabel}</Typography> : null} - </ChartsTooltipCell> - <ChartsTooltipCell className={clsx(classes.valueCell, classes.cell)}> - <Typography>{formattedValue}</Typography> - </ChartsTooltipCell> - </ChartsTooltipRow> - ); - })} + {series.filter(isCartesianSeries).map(({ id, label, valueFormatter, data, getColor }) => { + // @ts-ignore + const formattedValue = valueFormatter(data[dataIndex] ?? null, { dataIndex }); + if (formattedValue == null) { + return null; + } + const formattedLabel = getLabel(label, 'tooltip'); + const color = getColor(dataIndex); + return ( + <ChartsTooltipRow key={id} className={classes.row}> + <ChartsTooltipCell className={clsx(classes.markCell, classes.cell)}> + {color && <ChartsTooltipMark color={color} className={classes.mark} />} + </ChartsTooltipCell> + <ChartsTooltipCell className={clsx(classes.labelCell, classes.cell)}> + {formattedLabel ? <Typography>{formattedLabel}</Typography> : null} + </ChartsTooltipCell> + <ChartsTooltipCell className={clsx(classes.valueCell, classes.cell)}> + <Typography>{formattedValue}</Typography> + </ChartsTooltipCell> + </ChartsTooltipRow> + ); + })} </tbody> </ChartsTooltipTable> </ChartsTooltipPaper> @@ -74,7 +71,7 @@ function DefaultChartsAxisTooltipContent(props: ChartsAxisContentProps) { DefaultChartsAxisTooltipContent.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The properties of the triggered axis. diff --git a/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx b/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx index bfa2db35fbde..29fb6f74338b 100644 --- a/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx +++ b/packages/x-charts/src/ChartsTooltip/DefaultChartsItemTooltipContent.tsx @@ -28,7 +28,7 @@ function DefaultChartsItemTooltipContent<T extends ChartSeriesType = ChartSeries displayedLabel: getLabel(series.data[itemData.dataIndex].label, 'tooltip'), } : { - color: getColor(itemData.dataIndex) ?? series.color, + color: getColor(itemData.dataIndex), displayedLabel: getLabel(series.label, 'tooltip'), }; @@ -66,7 +66,7 @@ function DefaultChartsItemTooltipContent<T extends ChartSeriesType = ChartSeries DefaultChartsItemTooltipContent.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-charts/src/ChartsTooltip/utils.tsx b/packages/x-charts/src/ChartsTooltip/utils.tsx index 8d465635c61f..95e2d849abbb 100644 --- a/packages/x-charts/src/ChartsTooltip/utils.tsx +++ b/packages/x-charts/src/ChartsTooltip/utils.tsx @@ -1,11 +1,7 @@ import * as React from 'react'; import { AxisInteractionData, ItemInteractionData } from '../context/InteractionProvider'; -import { SvgContext } from '../context/DrawingProvider'; -import { - CartesianChartSeriesType, - ChartSeriesDefaultized, - ChartSeriesType, -} from '../models/seriesType/config'; +import { ChartSeriesType } from '../models/seriesType/config'; +import { useSvgRef } from '../hooks'; export function generateVirtualElement(mousePosition: { x: number; y: number } | null) { if (mousePosition === null) { @@ -41,7 +37,7 @@ export function generateVirtualElement(mousePosition: { x: number; y: number } | } export function useMouseTracker() { - const svgRef = React.useContext(SvgContext); + const svgRef = useSvgRef(); // Use a ref to avoid rerendering on every mousemove event. const [mousePosition, setMousePosition] = React.useState<null | { x: number; y: number }>(null); @@ -95,21 +91,6 @@ export function getTooltipHasData( return hasAxisXData || hasAxisYData; } -export function isCartesianSeriesType(seriesType: string): seriesType is CartesianChartSeriesType { - return ['bar', 'line', 'scatter'].includes(seriesType); -} - -export function isCartesianSeries( - series: ChartSeriesDefaultized<ChartSeriesType> & { getColor: (dataIndex: number) => string }, -): series is ChartSeriesDefaultized<CartesianChartSeriesType> & { - getColor: (dataIndex: number) => string; -}; -export function isCartesianSeries( - series: ChartSeriesDefaultized<ChartSeriesType>, -): series is ChartSeriesDefaultized<CartesianChartSeriesType> { - return isCartesianSeriesType(series.type); -} - export function utcFormatter(v: string | number | Date): string { if (v instanceof Date) { return v.toUTCString(); diff --git a/packages/x-charts/src/ChartsVoronoiHandler/ChartsVoronoiHandler.tsx b/packages/x-charts/src/ChartsVoronoiHandler/ChartsVoronoiHandler.tsx index 48f0fec8417d..170c4a71e112 100644 --- a/packages/x-charts/src/ChartsVoronoiHandler/ChartsVoronoiHandler.tsx +++ b/packages/x-charts/src/ChartsVoronoiHandler/ChartsVoronoiHandler.tsx @@ -4,12 +4,13 @@ import { Delaunay } from 'd3-delaunay'; import useEnhancedEffect from '@mui/utils/useEnhancedEffect'; import { InteractionContext } from '../context/InteractionProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { getValueToPositionMapper } from '../hooks/useScale'; import { getSVGPoint } from '../internals/utils'; import { ScatterItemIdentifier } from '../models'; import { SeriesId } from '../models/seriesType/common'; import { useDrawingArea, useSvgRef } from '../hooks'; +import { useHighlighted } from '../context'; +import { useScatterSeries } from '../hooks/useSeries'; export type ChartsVoronoiHandlerProps = { /** @@ -34,10 +35,12 @@ function ChartsVoronoiHandler(props: ChartsVoronoiHandlerProps) { const { xAxis, yAxis, xAxisIds, yAxisIds } = React.useContext(CartesianContext); const { dispatch } = React.useContext(InteractionContext); - const { series, seriesOrder } = React.useContext(SeriesContext).scatter ?? {}; + const { series, seriesOrder } = useScatterSeries() ?? {}; const voronoiRef = React.useRef<Record<string, VoronoiSeries>>({}); const delauneyRef = React.useRef<Delaunay<any> | undefined>(undefined); + const { setHighlighted, clearHighlighted } = useHighlighted(); + const defaultXAxisId = xAxisIds[0]; const defaultYAxisId = yAxisIds[0]; @@ -136,6 +139,7 @@ function ChartsVoronoiHandler(props: ChartsVoronoiHandlerProps) { const handleMouseOut = () => { dispatch({ type: 'exitChart' }); + clearHighlighted(); }; const handleMouseMove = (event: MouseEvent) => { @@ -143,16 +147,22 @@ function ChartsVoronoiHandler(props: ChartsVoronoiHandlerProps) { if (closestPoint === 'outside-chart') { dispatch({ type: 'exitChart' }); + clearHighlighted(); return; } if (closestPoint === 'outside-voronoi-max-radius' || closestPoint === 'no-point-found') { dispatch({ type: 'leaveItem', data: { type: 'scatter' } }); + clearHighlighted(); return; } const { seriesId, dataIndex } = closestPoint; dispatch({ type: 'enterItem', data: { type: 'scatter', seriesId, dataIndex } }); + setHighlighted({ + seriesId, + dataIndex, + }); }; const handleMouseClick = (event: MouseEvent) => { @@ -178,7 +188,20 @@ function ChartsVoronoiHandler(props: ChartsVoronoiHandlerProps) { element.removeEventListener('mousemove', handleMouseMove); element.removeEventListener('click', handleMouseClick); }; - }, [svgRef, dispatch, left, width, top, height, yAxis, xAxis, voronoiMaxRadius, onItemClick]); + }, [ + svgRef, + dispatch, + left, + width, + top, + height, + yAxis, + xAxis, + voronoiMaxRadius, + onItemClick, + setHighlighted, + clearHighlighted, + ]); // eslint-disable-next-line react/jsx-no-useless-fragment return <React.Fragment />; @@ -187,7 +210,7 @@ function ChartsVoronoiHandler(props: ChartsVoronoiHandlerProps) { ChartsVoronoiHandler.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Callback fired when clicking on a scatter item. diff --git a/packages/x-charts/src/ChartsXAxis/ChartsXAxis.tsx b/packages/x-charts/src/ChartsXAxis/ChartsXAxis.tsx index aada4ca7aeb3..98146ac637d4 100644 --- a/packages/x-charts/src/ChartsXAxis/ChartsXAxis.tsx +++ b/packages/x-charts/src/ChartsXAxis/ChartsXAxis.tsx @@ -98,17 +98,18 @@ const defaultProps = { * - [ChartsXAxis API](https://mui.com/x/api/charts/charts-x-axis/) */ function ChartsXAxis(inProps: ChartsXAxisProps) { - const props = useThemeProps({ props: { ...defaultProps, ...inProps }, name: 'MuiChartsXAxis' }); - const { xAxisIds } = React.useContext(CartesianContext); - const { - xAxis: { - [props.axisId ?? xAxisIds[0]]: { scale: xScale, tickNumber, reverse, ...settings }, - }, - } = React.useContext(CartesianContext); + const { xAxisIds, xAxis } = React.useContext(CartesianContext); + const { scale: xScale, tickNumber, reverse, ...settings } = xAxis[inProps.axisId ?? xAxisIds[0]]; const isMounted = useMounted(); - const defaultizedProps = { ...defaultProps, ...settings, ...props }; + const themedProps = useThemeProps({ props: { ...settings, ...inProps }, name: 'MuiChartsXAxis' }); + + const defaultizedProps = { + ...defaultProps, + ...themedProps, + }; + const { position, disableLine, @@ -249,7 +250,7 @@ function ChartsXAxis(inProps: ChartsXAxisProps) { ChartsXAxis.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The id of the axis to render. @@ -315,10 +316,12 @@ ChartsXAxis.propTypes = { */ tickFontSize: PropTypes.number, /** - * Defines which ticks are displayed. Its value can be: + * Defines which ticks are displayed. + * Its value can be: * - 'auto' In such case the ticks are computed based on axis scale and other parameters. - * - a filtering function of the form `(value, index) => boolean` which is available only if the axis has a data property. + * - a filtering function of the form `(value, index) => boolean` which is available only if the axis has "point" scale. * - an array containing the values where ticks should be displayed. + * @see See {@link https://mui.com/x/react-charts/axis/#fixed-tick-positions} * @default 'auto' */ tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]), diff --git a/packages/x-charts/src/ChartsYAxis/ChartsYAxis.tsx b/packages/x-charts/src/ChartsYAxis/ChartsYAxis.tsx index 00b00c9d59b8..784ed2640ca0 100644 --- a/packages/x-charts/src/ChartsYAxis/ChartsYAxis.tsx +++ b/packages/x-charts/src/ChartsYAxis/ChartsYAxis.tsx @@ -44,15 +44,16 @@ const defaultProps = { * - [ChartsYAxis API](https://mui.com/x/api/charts/charts-y-axis/) */ function ChartsYAxis(inProps: ChartsYAxisProps) { - const props = useThemeProps({ props: { ...defaultProps, ...inProps }, name: 'MuiChartsYAxis' }); - const { yAxisIds } = React.useContext(CartesianContext); - const { - yAxis: { - [props.axisId ?? yAxisIds[0]]: { scale: yScale, tickNumber, ...settings }, - }, - } = React.useContext(CartesianContext); + const { yAxisIds, yAxis } = React.useContext(CartesianContext); + const { scale: yScale, tickNumber, ...settings } = yAxis[inProps.axisId ?? yAxisIds[0]]; + + const themedProps = useThemeProps({ props: { ...settings, ...inProps }, name: 'MuiChartsYAxis' }); + + const defaultizedProps = { + ...defaultProps, + ...themedProps, + }; - const defaultizedProps = { ...defaultProps, ...settings, ...props }; const { position, disableLine, @@ -189,7 +190,7 @@ function ChartsYAxis(inProps: ChartsYAxisProps) { ChartsYAxis.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The id of the axis to render. @@ -255,10 +256,12 @@ ChartsYAxis.propTypes = { */ tickFontSize: PropTypes.number, /** - * Defines which ticks are displayed. Its value can be: + * Defines which ticks are displayed. + * Its value can be: * - 'auto' In such case the ticks are computed based on axis scale and other parameters. - * - a filtering function of the form `(value, index) => boolean` which is available only if the axis has a data property. + * - a filtering function of the form `(value, index) => boolean` which is available only if the axis has "point" scale. * - an array containing the values where ticks should be displayed. + * @see See {@link https://mui.com/x/react-charts/axis/#fixed-tick-positions} * @default 'auto' */ tickInterval: PropTypes.oneOfType([PropTypes.oneOf(['auto']), PropTypes.array, PropTypes.func]), diff --git a/packages/x-charts/src/Gauge/Gauge.tsx b/packages/x-charts/src/Gauge/Gauge.tsx index 6f165afe9023..14b04b897d80 100644 --- a/packages/x-charts/src/Gauge/Gauge.tsx +++ b/packages/x-charts/src/Gauge/Gauge.tsx @@ -41,7 +41,7 @@ function Gauge(props: GaugeProps) { Gauge.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, classes: PropTypes.object, diff --git a/packages/x-charts/src/Gauge/GaugeContainer.tsx b/packages/x-charts/src/Gauge/GaugeContainer.tsx index ca7679a86dd5..5c803ee68a2b 100644 --- a/packages/x-charts/src/Gauge/GaugeContainer.tsx +++ b/packages/x-charts/src/Gauge/GaugeContainer.tsx @@ -119,7 +119,7 @@ const GaugeContainer = React.forwardRef(function GaugeContainer(props: GaugeCont GaugeContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, className: PropTypes.string, diff --git a/packages/x-charts/src/Gauge/GaugeValueText.tsx b/packages/x-charts/src/Gauge/GaugeValueText.tsx index a7c054eae2d3..77928698e00d 100644 --- a/packages/x-charts/src/Gauge/GaugeValueText.tsx +++ b/packages/x-charts/src/Gauge/GaugeValueText.tsx @@ -43,7 +43,7 @@ function GaugeValueText(props: GaugeValueTextProps) { GaugeValueText.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Height of a text line (in `em`). diff --git a/packages/x-charts/src/LineChart/AnimatedArea.tsx b/packages/x-charts/src/LineChart/AnimatedArea.tsx index bdff63b7dfd5..35c5ff8dddbe 100644 --- a/packages/x-charts/src/LineChart/AnimatedArea.tsx +++ b/packages/x-charts/src/LineChart/AnimatedArea.tsx @@ -72,7 +72,7 @@ function AnimatedArea(props: AnimatedAreaProps) { AnimatedArea.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- d: PropTypes.string.isRequired, ownerState: PropTypes.shape({ diff --git a/packages/x-charts/src/LineChart/AnimatedLine.tsx b/packages/x-charts/src/LineChart/AnimatedLine.tsx index ceb5fc9456c3..7bdbf35b7437 100644 --- a/packages/x-charts/src/LineChart/AnimatedLine.tsx +++ b/packages/x-charts/src/LineChart/AnimatedLine.tsx @@ -75,7 +75,7 @@ function AnimatedLine(props: AnimatedLineProps) { AnimatedLine.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- d: PropTypes.string.isRequired, ownerState: PropTypes.shape({ diff --git a/packages/x-charts/src/LineChart/AreaElement.tsx b/packages/x-charts/src/LineChart/AreaElement.tsx index 2de356fbbcdb..813e8e2ba8af 100644 --- a/packages/x-charts/src/LineChart/AreaElement.tsx +++ b/packages/x-charts/src/LineChart/AreaElement.tsx @@ -4,15 +4,10 @@ import composeClasses from '@mui/utils/composeClasses'; import { useSlotProps } from '@mui/base/utils'; import generateUtilityClass from '@mui/utils/generateUtilityClass'; import generateUtilityClasses from '@mui/utils/generateUtilityClasses'; -import { - getIsFaded, - getIsHighlighted, - useInteractionItemProps, -} from '../hooks/useInteractionItemProps'; -import { InteractionContext } from '../context/InteractionProvider'; -import { HighlightScope } from '../context/HighlightProvider'; +import { useInteractionItemProps } from '../hooks/useInteractionItemProps'; import { AnimatedArea, AnimatedAreaProps } from './AnimatedArea'; import { SeriesId } from '../models/seriesType/common'; +import { useItemHighlighted } from '../context'; export interface AreaElementClasses { /** Styles applied to the root element. */ @@ -70,7 +65,6 @@ export interface AreaElementProps Pick<AnimatedAreaProps, 'skipAnimation'>, Omit<React.SVGProps<SVGPathElement>, 'ref' | 'color' | 'id'> { d: string; - highlightScope?: Partial<HighlightScope>; /** * The props used for each component slot. * @default {} @@ -99,20 +93,16 @@ function AreaElement(props: AreaElementProps) { classes: innerClasses, color, gradientId, - highlightScope, slots, slotProps, onClick, ...other } = props; - const getInteractionItemProps = useInteractionItemProps(highlightScope); - - const { item } = React.useContext(InteractionContext); - - const isHighlighted = getIsHighlighted(item, { type: 'line', seriesId: id }, highlightScope); - const isFaded = - !isHighlighted && getIsFaded(item, { type: 'line', seriesId: id }, highlightScope); + const getInteractionItemProps = useInteractionItemProps(); + const { isFaded, isHighlighted } = useItemHighlighted({ + seriesId: id, + }); const ownerState = { id, @@ -143,16 +133,12 @@ function AreaElement(props: AreaElementProps) { AreaElement.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object, color: PropTypes.string.isRequired, d: PropTypes.string.isRequired, gradientId: PropTypes.string, - highlightScope: PropTypes.shape({ - faded: PropTypes.oneOf(['global', 'none', 'series']), - highlighted: PropTypes.oneOf(['item', 'none', 'series']), - }), id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, /** * If `true`, animations are skipped. diff --git a/packages/x-charts/src/LineChart/AreaPlot.tsx b/packages/x-charts/src/LineChart/AreaPlot.tsx index 18659010a585..51a62066c83a 100644 --- a/packages/x-charts/src/LineChart/AreaPlot.tsx +++ b/packages/x-charts/src/LineChart/AreaPlot.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import { area as d3Area } from 'd3-shape'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; import { AreaElement, @@ -14,6 +13,7 @@ import getCurveFactory from '../internals/getCurve'; import { DEFAULT_X_AXIS_KEY } from '../constants'; import { LineItemIdentifier } from '../models/seriesType/line'; import { useChartGradient } from '../internals/components/ChartsAxesGradients'; +import { useLineSeries } from '../hooks/useSeries'; export interface AreaPlotSlots extends AreaElementSlots {} @@ -34,7 +34,7 @@ export interface AreaPlotProps } const useAggregatedData = () => { - const seriesData = React.useContext(SeriesContext).line; + const seriesData = useLineSeries(); const axisData = React.useContext(CartesianContext); if (seriesData === undefined) { @@ -130,7 +130,7 @@ function AreaPlot(props: AreaPlotProps) { return ( <g {...other}> {completedData.map( - ({ d, seriesId, color, highlightScope, area, gradientUsed }) => + ({ d, seriesId, color, area, gradientUsed }) => !!area && ( <AreaElement key={seriesId} @@ -138,7 +138,6 @@ function AreaPlot(props: AreaPlotProps) { d={d} color={color} gradientId={gradientUsed && getGradientId(...gradientUsed)} - highlightScope={highlightScope} slots={slots} slotProps={slotProps} onClick={onItemClick && ((event) => onItemClick(event, { type: 'line', seriesId }))} @@ -153,7 +152,7 @@ function AreaPlot(props: AreaPlotProps) { AreaPlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Callback fired when a line area item is clicked. diff --git a/packages/x-charts/src/LineChart/LineChart.tsx b/packages/x-charts/src/LineChart/LineChart.tsx index 9e896da5b79d..98a15f16debd 100644 --- a/packages/x-charts/src/LineChart/LineChart.tsx +++ b/packages/x-charts/src/LineChart/LineChart.tsx @@ -64,7 +64,7 @@ export interface LineChartSlotProps ChartsOverlaySlotProps {} export interface LineChartProps - extends Omit<ResponsiveChartContainerProps, 'series'>, + extends Omit<ResponsiveChartContainerProps, 'series' | 'plugins'>, Omit<ChartsAxisProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'>, ChartsOnAxisClickHandlerProps { @@ -165,6 +165,8 @@ const LineChart = React.forwardRef(function LineChart(props: LineChartProps, ref slotProps, skipAnimation, loading, + highlightedItem, + onHighlightChange, } = props; const id = useId(); @@ -203,6 +205,8 @@ const LineChart = React.forwardRef(function LineChart(props: LineChartProps, ref axisHighlight?.y === 'none' && !onAxisClick } + highlightedItem={highlightedItem} + onHighlightChange={onHighlightChange} > {onAxisClick && <ChartsOnAxisClickHandler onAxisClick={onAxisClick} />} {grid && <ChartsGrid vertical={grid.vertical} horizontal={grid.horizontal} />} @@ -248,7 +252,7 @@ const LineChart = React.forwardRef(function LineChart(props: LineChartProps, ref LineChart.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The configuration of axes highlight. @@ -298,6 +302,13 @@ LineChart.propTypes = { * The height of the chart in px. If not defined, it takes the height of the parent element. */ height: PropTypes.number, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), /** * Indicate which axis to display the left of the charts. * Can be a string (the id of the axis) or an object `ChartsYAxisProps`. @@ -346,6 +357,12 @@ LineChart.propTypes = { * @param {null | AxisData} data The data about the clicked axis and items associated with it. */ onAxisClick: PropTypes.func, + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, /** * Callback fired when a line element is clicked. */ @@ -463,7 +480,7 @@ LineChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['bottom', 'top']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, @@ -534,7 +551,7 @@ LineChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['left', 'right']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, diff --git a/packages/x-charts/src/LineChart/LineElement.tsx b/packages/x-charts/src/LineChart/LineElement.tsx index d06a45b0e88a..aa626b0d6698 100644 --- a/packages/x-charts/src/LineChart/LineElement.tsx +++ b/packages/x-charts/src/LineChart/LineElement.tsx @@ -4,15 +4,10 @@ import composeClasses from '@mui/utils/composeClasses'; import { useSlotProps } from '@mui/base/utils'; import generateUtilityClass from '@mui/utils/generateUtilityClass'; import generateUtilityClasses from '@mui/utils/generateUtilityClasses'; -import { InteractionContext } from '../context/InteractionProvider'; -import { - getIsFaded, - getIsHighlighted, - useInteractionItemProps, -} from '../hooks/useInteractionItemProps'; -import { HighlightScope } from '../context/HighlightProvider'; +import { useInteractionItemProps } from '../hooks/useInteractionItemProps'; import { AnimatedLine, AnimatedLineProps } from './AnimatedLine'; import { SeriesId } from '../models/seriesType/common'; +import { useItemHighlighted } from '../context'; export interface LineElementClasses { /** Styles applied to the root element. */ @@ -70,7 +65,6 @@ export interface LineElementProps Pick<AnimatedLineProps, 'skipAnimation'>, Omit<React.SVGProps<SVGPathElement>, 'ref' | 'color' | 'id'> { d: string; - highlightScope?: Partial<HighlightScope>; /** * The props used for each component slot. * @default {} @@ -99,19 +93,15 @@ function LineElement(props: LineElementProps) { classes: innerClasses, color, gradientId, - highlightScope, slots, slotProps, onClick, ...other } = props; - const getInteractionItemProps = useInteractionItemProps(highlightScope); - - const { item } = React.useContext(InteractionContext); - - const isHighlighted = getIsHighlighted(item, { type: 'line', seriesId: id }, highlightScope); - const isFaded = - !isHighlighted && getIsFaded(item, { type: 'line', seriesId: id }, highlightScope); + const getInteractionItemProps = useInteractionItemProps(); + const { isFaded, isHighlighted } = useItemHighlighted({ + seriesId: id, + }); const ownerState = { id, @@ -142,16 +132,12 @@ function LineElement(props: LineElementProps) { LineElement.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object, color: PropTypes.string.isRequired, d: PropTypes.string.isRequired, gradientId: PropTypes.string, - highlightScope: PropTypes.shape({ - faded: PropTypes.oneOf(['global', 'none', 'series']), - highlighted: PropTypes.oneOf(['item', 'none', 'series']), - }), id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, /** * If `true`, animations are skipped. diff --git a/packages/x-charts/src/LineChart/LineHighlightElement.tsx b/packages/x-charts/src/LineChart/LineHighlightElement.tsx index edfa9258ab79..4bb282b55f60 100644 --- a/packages/x-charts/src/LineChart/LineHighlightElement.tsx +++ b/packages/x-charts/src/LineChart/LineHighlightElement.tsx @@ -90,7 +90,7 @@ function LineHighlightElement(props: LineHighlightElementProps) { LineHighlightElement.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object, id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, diff --git a/packages/x-charts/src/LineChart/LineHighlightPlot.tsx b/packages/x-charts/src/LineChart/LineHighlightPlot.tsx index 6dd72d93d680..25343dd4c129 100644 --- a/packages/x-charts/src/LineChart/LineHighlightPlot.tsx +++ b/packages/x-charts/src/LineChart/LineHighlightPlot.tsx @@ -1,12 +1,12 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; import { LineHighlightElement, LineHighlightElementProps } from './LineHighlightElement'; import { getValueToPositionMapper } from '../hooks/useScale'; import { InteractionContext } from '../context/InteractionProvider'; import { DEFAULT_X_AXIS_KEY } from '../constants'; import getColor from './getColor'; +import { useLineSeries } from '../hooks/useSeries'; export interface LineHighlightPlotSlots { lineHighlight?: React.JSXElementConstructor<LineHighlightElementProps>; @@ -42,7 +42,7 @@ export interface LineHighlightPlotProps extends React.SVGAttributes<SVGSVGElemen function LineHighlightPlot(props: LineHighlightPlotProps) { const { slots, slotProps, ...other } = props; - const seriesData = React.useContext(SeriesContext).line; + const seriesData = useLineSeries(); const axisData = React.useContext(CartesianContext); const { axis } = React.useContext(InteractionContext); @@ -113,7 +113,7 @@ function LineHighlightPlot(props: LineHighlightPlotProps) { LineHighlightPlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The props used for each component slot. diff --git a/packages/x-charts/src/LineChart/LinePlot.tsx b/packages/x-charts/src/LineChart/LinePlot.tsx index 919ee625504c..7e09416d2f96 100644 --- a/packages/x-charts/src/LineChart/LinePlot.tsx +++ b/packages/x-charts/src/LineChart/LinePlot.tsx @@ -1,7 +1,6 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import { line as d3Line } from 'd3-shape'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; import { LineElement, @@ -14,6 +13,7 @@ import getCurveFactory from '../internals/getCurve'; import { DEFAULT_X_AXIS_KEY } from '../constants'; import { LineItemIdentifier } from '../models/seriesType/line'; import { useChartGradient } from '../internals/components/ChartsAxesGradients'; +import { useLineSeries } from '../hooks/useSeries'; export interface LinePlotSlots extends LineElementSlots {} @@ -34,7 +34,7 @@ export interface LinePlotProps } const useAggregatedData = () => { - const seriesData = React.useContext(SeriesContext).line; + const seriesData = useLineSeries(); const axisData = React.useContext(CartesianContext); if (seriesData === undefined) { @@ -121,7 +121,7 @@ function LinePlot(props: LinePlotProps) { const completedData = useAggregatedData(); return ( <g {...other}> - {completedData.map(({ d, seriesId, color, highlightScope, gradientUsed }) => { + {completedData.map(({ d, seriesId, color, gradientUsed }) => { return ( <LineElement key={seriesId} @@ -129,7 +129,6 @@ function LinePlot(props: LinePlotProps) { d={d} color={color} gradientId={gradientUsed && getGradientId(...gradientUsed)} - highlightScope={highlightScope} skipAnimation={skipAnimation} slots={slots} slotProps={slotProps} @@ -144,7 +143,7 @@ function LinePlot(props: LinePlotProps) { LinePlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Callback fired when a line item is clicked. diff --git a/packages/x-charts/src/LineChart/MarkElement.tsx b/packages/x-charts/src/LineChart/MarkElement.tsx index 70bcb3903ad9..74000b2d6433 100644 --- a/packages/x-charts/src/LineChart/MarkElement.tsx +++ b/packages/x-charts/src/LineChart/MarkElement.tsx @@ -8,13 +8,9 @@ import { symbol as d3Symbol, symbolsFill as d3SymbolsFill } from 'd3-shape'; import { animated, to, useSpring } from '@react-spring/web'; import { getSymbol } from '../internals/utils'; import { InteractionContext } from '../context/InteractionProvider'; -import { HighlightScope } from '../context/HighlightProvider'; -import { - getIsFaded, - getIsHighlighted, - useInteractionItemProps, -} from '../hooks/useInteractionItemProps'; +import { useInteractionItemProps } from '../hooks/useInteractionItemProps'; import { SeriesId } from '../models/seriesType/common'; +import { useItemHighlighted } from '../context'; export interface MarkElementClasses { /** Styles applied to the root element. */ @@ -64,26 +60,6 @@ const MarkElementPath = styled(animated.path, { strokeWidth: 2, })); -MarkElementPath.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - as: PropTypes.elementType, - ownerState: PropTypes.shape({ - classes: PropTypes.object, - color: PropTypes.string.isRequired, - id: PropTypes.string.isRequired, - isFaded: PropTypes.bool.isRequired, - isHighlighted: PropTypes.bool.isRequired, - }).isRequired, - sx: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), - PropTypes.func, - PropTypes.object, - ]), -} as any; - export type MarkElementProps = Omit<MarkElementOwnerState, 'isFaded' | 'isHighlighted'> & Omit<React.SVGProps<SVGPathElement>, 'ref' | 'id'> & { /** @@ -99,7 +75,6 @@ export type MarkElementProps = Omit<MarkElementOwnerState, 'isFaded' | 'isHighli * The index to the element in the series' data array. */ dataIndex: number; - highlightScope?: Partial<HighlightScope>; }; /** @@ -121,27 +96,22 @@ function MarkElement(props: MarkElementProps) { color, shape, dataIndex, - highlightScope, onClick, skipAnimation, ...other } = props; - const getInteractionItemProps = useInteractionItemProps(highlightScope); - - const { item, axis } = React.useContext(InteractionContext); - - const isHighlighted = - axis.x?.index === dataIndex || - getIsHighlighted(item, { type: 'line', seriesId: id }, highlightScope); - const isFaded = - !isHighlighted && getIsFaded(item, { type: 'line', seriesId: id }, highlightScope); + const getInteractionItemProps = useInteractionItemProps(); + const { isFaded, isHighlighted } = useItemHighlighted({ + seriesId: id, + }); + const { axis } = React.useContext(InteractionContext); const position = useSpring({ x, y, immediate: skipAnimation }); const ownerState = { id, classes: innerClasses, - isHighlighted, + isHighlighted: axis.x?.index === dataIndex || isHighlighted, isFaded, color, }; @@ -167,17 +137,13 @@ function MarkElement(props: MarkElementProps) { MarkElement.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object, /** * The index to the element in the series' data array. */ dataIndex: PropTypes.number.isRequired, - highlightScope: PropTypes.shape({ - faded: PropTypes.oneOf(['global', 'none', 'series']), - highlighted: PropTypes.oneOf(['item', 'none', 'series']), - }), id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, /** * The shape of the marker. diff --git a/packages/x-charts/src/LineChart/MarkPlot.tsx b/packages/x-charts/src/LineChart/MarkPlot.tsx index 7b52797c3bf2..23c7695f443e 100644 --- a/packages/x-charts/src/LineChart/MarkPlot.tsx +++ b/packages/x-charts/src/LineChart/MarkPlot.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; import { MarkElement, MarkElementProps } from './MarkElement'; import { getValueToPositionMapper } from '../hooks/useScale'; @@ -9,6 +8,7 @@ import { DEFAULT_X_AXIS_KEY } from '../constants'; import { LineItemIdentifier } from '../models/seriesType/line'; import { cleanId } from '../internals/utils'; import getColor from './getColor'; +import { useLineSeries } from '../hooks/useSeries'; export interface MarkPlotSlots { mark?: React.JSXElementConstructor<MarkElementProps>; @@ -55,7 +55,7 @@ export interface MarkPlotProps function MarkPlot(props: MarkPlotProps) { const { slots, slotProps, skipAnimation, onItemClick, ...other } = props; - const seriesData = React.useContext(SeriesContext).line; + const seriesData = useLineSeries(); const axisData = React.useContext(CartesianContext); const chartId = useChartId(); @@ -159,7 +159,6 @@ function MarkPlot(props: MarkPlotProps) { color={colorGetter(index)} x={x} y={y!} // Don't know why TS doesn't get from the filter that y can't be null - highlightScope={series[seriesId].highlightScope} skipAnimation={skipAnimation} onClick={ onItemClick && @@ -181,7 +180,7 @@ function MarkPlot(props: MarkPlotProps) { MarkPlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Callback fired when a line mark item is clicked. diff --git a/packages/x-charts/src/LineChart/formatter.ts b/packages/x-charts/src/LineChart/formatter.ts index 8a7cb0f64589..95a2af39db27 100644 --- a/packages/x-charts/src/LineChart/formatter.ts +++ b/packages/x-charts/src/LineChart/formatter.ts @@ -6,7 +6,7 @@ import { DatasetType, Formatter, } from '../models/seriesType/config'; -import defaultizeValueFormatter from '../internals/defaultizeValueFormatter'; +import { defaultizeValueFormatter } from '../internals/defaultizeValueFormatter'; import { DefaultizedProps } from '../models/helpers'; import { SeriesId } from '../models/seriesType/common'; diff --git a/packages/x-charts/src/LineChart/getColor.ts b/packages/x-charts/src/LineChart/getColor.ts index af924c4fc574..07207a177cf9 100644 --- a/packages/x-charts/src/LineChart/getColor.ts +++ b/packages/x-charts/src/LineChart/getColor.ts @@ -3,11 +3,11 @@ import { DefaultizedLineSeriesType } from '../models/seriesType/line'; export default function getColor( series: DefaultizedLineSeriesType, - xAxis: AxisDefaultized, - yAxis: AxisDefaultized, + xAxis?: AxisDefaultized, + yAxis?: AxisDefaultized, ) { - const yColorScale = yAxis.colorScale; - const xColorScale = xAxis.colorScale; + const yColorScale = yAxis?.colorScale; + const xColorScale = xAxis?.colorScale; if (yColorScale) { return (dataIndex: number) => { diff --git a/packages/x-charts/src/LineChart/plugin.ts b/packages/x-charts/src/LineChart/plugin.ts new file mode 100644 index 000000000000..bc799c54b1ec --- /dev/null +++ b/packages/x-charts/src/LineChart/plugin.ts @@ -0,0 +1,12 @@ +import { ChartsPluginType } from '../models/plugin'; +import { getExtremumX, getExtremumY } from './extremums'; +import formatter from './formatter'; +import getColor from './getColor'; + +export const plugin: ChartsPluginType<'line'> = { + seriesType: 'line', + colorProcessor: getColor, + seriesFormatter: formatter, + xExtremumGetter: getExtremumX, + yExtremumGetter: getExtremumY, +}; diff --git a/packages/x-charts/src/PieChart/PieArc.tsx b/packages/x-charts/src/PieChart/PieArc.tsx index 608961efc652..1cc8bc50a128 100644 --- a/packages/x-charts/src/PieChart/PieArc.tsx +++ b/packages/x-charts/src/PieChart/PieArc.tsx @@ -6,9 +6,9 @@ import composeClasses from '@mui/utils/composeClasses'; import generateUtilityClass from '@mui/utils/generateUtilityClass'; import { styled } from '@mui/material/styles'; import generateUtilityClasses from '@mui/utils/generateUtilityClasses'; -import { HighlightScope } from '../context/HighlightProvider'; import { useInteractionItemProps } from '../hooks/useInteractionItemProps'; import { PieItemId } from '../models'; +import { HighlightScope } from '../context'; export interface PieArcClasses { /** Styles applied to the root element. */ @@ -63,6 +63,9 @@ export type PieArcProps = Omit<React.SVGProps<SVGPathElement>, 'ref' | 'id'> & PieArcOwnerState & { cornerRadius: SpringValue<number>; endAngle: SpringValue<number>; + /** + * @deprecated Use the `isFaded` or `isHighlighted` props instead. + */ highlightScope?: Partial<HighlightScope>; innerRadius: SpringValue<number>; onClick?: (event: React.MouseEvent<SVGPathElement, MouseEvent>) => void; @@ -78,7 +81,6 @@ function PieArc(props: PieArcProps) { cornerRadius, dataIndex, endAngle, - highlightScope, id, innerRadius, isFaded, @@ -87,6 +89,7 @@ function PieArc(props: PieArcProps) { outerRadius, paddingAngle, startAngle, + highlightScope, ...other } = props; @@ -100,7 +103,7 @@ function PieArc(props: PieArcProps) { }; const classes = useUtilityClasses(ownerState); - const getInteractionItemProps = useInteractionItemProps(highlightScope); + const getInteractionItemProps = useInteractionItemProps(); return ( <PieArcRoot @@ -128,12 +131,17 @@ function PieArc(props: PieArcProps) { PieArc.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object, dataIndex: PropTypes.number.isRequired, + /** + * @deprecated Use the `isFaded` or `isHighlighted` props instead. + */ highlightScope: PropTypes.shape({ + fade: PropTypes.oneOf(['global', 'none', 'series']), faded: PropTypes.oneOf(['global', 'none', 'series']), + highlight: PropTypes.oneOf(['item', 'none', 'series']), highlighted: PropTypes.oneOf(['item', 'none', 'series']), }), id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, diff --git a/packages/x-charts/src/PieChart/PieArcLabel.tsx b/packages/x-charts/src/PieChart/PieArcLabel.tsx index 525492f30c5f..90164f32dbc2 100644 --- a/packages/x-charts/src/PieChart/PieArcLabel.tsx +++ b/packages/x-charts/src/PieChart/PieArcLabel.tsx @@ -151,7 +151,7 @@ function PieArcLabel(props: PieArcLabelProps) { PieArcLabel.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- classes: PropTypes.object, color: PropTypes.string.isRequired, diff --git a/packages/x-charts/src/PieChart/PieArcLabelPlot.tsx b/packages/x-charts/src/PieChart/PieArcLabelPlot.tsx index 16245495aadc..93708b7dfa18 100644 --- a/packages/x-charts/src/PieChart/PieArcLabelPlot.tsx +++ b/packages/x-charts/src/PieChart/PieArcLabelPlot.tsx @@ -65,7 +65,6 @@ export interface PieArcLabelPlotProps | 'arcLabel' | 'arcLabelMinAngle' | 'id' - | 'highlightScope' >, ComputedPieRadius { /** @@ -99,7 +98,6 @@ function PieArcLabelPlot(props: PieArcLabelPlotProps) { data, faded = { additionalRadius: -5 }, highlighted, - highlightScope, id, innerRadius, outerRadius, @@ -117,7 +115,6 @@ function PieArcLabelPlot(props: PieArcLabelPlotProps) { cornerRadius, paddingAngle, id, - highlightScope, highlighted, faded, data, @@ -176,7 +173,7 @@ function PieArcLabelPlot(props: PieArcLabelPlotProps) { PieArcLabelPlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The label displayed into the arc. @@ -238,10 +235,6 @@ PieArcLabelPlot.propTypes = { outerRadius: PropTypes.number, paddingAngle: PropTypes.number, }), - highlightScope: PropTypes.shape({ - faded: PropTypes.oneOf(['global', 'none', 'series']), - highlighted: PropTypes.oneOf(['item', 'none', 'series']), - }), id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, /** * The radius between circle center and the beginning of the arc. diff --git a/packages/x-charts/src/PieChart/PieArcPlot.tsx b/packages/x-charts/src/PieChart/PieArcPlot.tsx index f01a7adb2fd3..f81c18acdf86 100644 --- a/packages/x-charts/src/PieChart/PieArcPlot.tsx +++ b/packages/x-charts/src/PieChart/PieArcPlot.tsx @@ -14,6 +14,7 @@ import { ValueWithHighlight, useTransformData, } from './dataTransform/useTransformData'; +import { useHighlighted } from '../context'; export interface PieArcPlotSlots { pieArc?: React.JSXElementConstructor<PieArcProps>; @@ -26,7 +27,7 @@ export interface PieArcPlotSlotProps { export interface PieArcPlotProps extends Pick< DefaultizedPieSeriesType, - 'data' | 'faded' | 'highlighted' | 'cornerRadius' | 'paddingAngle' | 'id' | 'highlightScope' + 'data' | 'faded' | 'highlighted' | 'cornerRadius' | 'paddingAngle' | 'id' >, ComputedPieRadius { /** @@ -71,7 +72,6 @@ function PieArcPlot(props: PieArcPlotProps) { cornerRadius = 0, paddingAngle = 0, id, - highlightScope, highlighted, faded = { additionalRadius: -5 }, data, @@ -86,7 +86,6 @@ function PieArcPlot(props: PieArcPlotProps) { cornerRadius, paddingAngle, id, - highlightScope, highlighted, faded, data, @@ -95,6 +94,7 @@ function PieArcPlot(props: PieArcPlotProps) { ...defaultTransitionConfig, immediate: skipAnimation, }); + const { highlightScope } = useHighlighted(); if (data.length === 0) { return null; @@ -153,7 +153,7 @@ function PieArcPlot(props: PieArcPlotProps) { PieArcPlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The radius between circle center and the arc label in px. @@ -203,10 +203,6 @@ PieArcPlot.propTypes = { outerRadius: PropTypes.number, paddingAngle: PropTypes.number, }), - highlightScope: PropTypes.shape({ - faded: PropTypes.oneOf(['global', 'none', 'series']), - highlighted: PropTypes.oneOf(['item', 'none', 'series']), - }), id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, /** * The radius between circle center and the beginning of the arc. diff --git a/packages/x-charts/src/PieChart/PieChart.tsx b/packages/x-charts/src/PieChart/PieChart.tsx index 39b51c7d4025..9c3e1b776972 100644 --- a/packages/x-charts/src/PieChart/PieChart.tsx +++ b/packages/x-charts/src/PieChart/PieChart.tsx @@ -52,7 +52,7 @@ export interface PieChartSlotProps ChartsOverlaySlotProps {} export interface PieChartProps - extends Omit<ResponsiveChartContainerProps, 'series' | 'leftAxis' | 'bottomAxis'>, + extends Omit<ResponsiveChartContainerProps, 'series' | 'leftAxis' | 'bottomAxis' | 'plugins'>, Omit<ChartsAxisProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'>, Pick<PiePlotProps, 'skipAnimation'> { @@ -143,6 +143,8 @@ function PieChart(props: PieChartProps) { slotProps, onItemClick, loading, + highlightedItem, + onHighlightChange, } = props; const isRTL = useIsRTL(); @@ -176,6 +178,8 @@ function PieChart(props: PieChartProps) { disableAxisListener={ tooltip?.trigger !== 'axis' && axisHighlight?.x === 'none' && axisHighlight?.y === 'none' } + highlightedItem={highlightedItem} + onHighlightChange={onHighlightChange} > <ChartsAxis topAxis={topAxis} @@ -203,7 +207,7 @@ function PieChart(props: PieChartProps) { PieChart.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The configuration of axes highlight. @@ -242,6 +246,13 @@ PieChart.propTypes = { * The height of the chart in px. If not defined, it takes the height of the parent element. */ height: PropTypes.number, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), /** * Indicate which axis to display the left of the charts. * Can be a string (the id of the axis) or an object `ChartsYAxisProps`. @@ -281,6 +292,12 @@ PieChart.propTypes = { right: PropTypes.number, top: PropTypes.number, }), + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, /** * Callback fired when a pie arc is clicked. */ @@ -394,7 +411,7 @@ PieChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['bottom', 'top']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, @@ -465,7 +482,7 @@ PieChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['left', 'right']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, diff --git a/packages/x-charts/src/PieChart/PiePlot.tsx b/packages/x-charts/src/PieChart/PiePlot.tsx index 5ed37cb0fcec..dcd0e62fe9f4 100644 --- a/packages/x-charts/src/PieChart/PiePlot.tsx +++ b/packages/x-charts/src/PieChart/PiePlot.tsx @@ -1,11 +1,11 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { DrawingContext } from '../context/DrawingProvider'; import { PieArcPlot, PieArcPlotProps, PieArcPlotSlotProps, PieArcPlotSlots } from './PieArcPlot'; import { PieArcLabelPlotSlots, PieArcLabelPlotSlotProps, PieArcLabelPlot } from './PieArcLabelPlot'; import { getPercentageValue } from '../internals/utils'; import { getPieCoordinates } from './getPieCoordinates'; +import { usePieSeries } from '../hooks/useSeries'; export interface PiePlotSlots extends PieArcPlotSlots, PieArcLabelPlotSlots {} @@ -36,7 +36,7 @@ export interface PiePlotProps extends Pick<PieArcPlotProps, 'skipAnimation' | 'o */ function PiePlot(props: PiePlotProps) { const { skipAnimation, slots, slotProps, onItemClick } = props; - const seriesData = React.useContext(SeriesContext).pie; + const seriesData = usePieSeries(); const { left, top, width, height } = React.useContext(DrawingContext); if (seriesData === undefined) { @@ -58,7 +58,6 @@ function PiePlot(props: PiePlotProps) { cy: cyParam, highlighted, faded, - highlightScope, } = series[seriesId]; const { cx, cy, availableRadius } = getPieCoordinates( @@ -81,7 +80,6 @@ function PiePlot(props: PiePlotProps) { id={seriesId} data={data} skipAnimation={skipAnimation} - highlightScope={highlightScope} highlighted={highlighted} faded={faded} onItemClick={onItemClick} @@ -103,7 +101,6 @@ function PiePlot(props: PiePlotProps) { data, cx: cxParam, cy: cyParam, - highlightScope, } = series[seriesId]; const { cx, cy, availableRadius } = getPieCoordinates( @@ -135,7 +132,6 @@ function PiePlot(props: PiePlotProps) { skipAnimation={skipAnimation} arcLabel={arcLabel} arcLabelMinAngle={arcLabelMinAngle} - highlightScope={highlightScope} slots={slots} slotProps={slotProps} /> @@ -149,7 +145,7 @@ function PiePlot(props: PiePlotProps) { PiePlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Callback fired when a pie item is clicked. diff --git a/packages/x-charts/src/PieChart/dataTransform/useTransformData.ts b/packages/x-charts/src/PieChart/dataTransform/useTransformData.ts index 900092ba66fd..5ddf07df4275 100644 --- a/packages/x-charts/src/PieChart/dataTransform/useTransformData.ts +++ b/packages/x-charts/src/PieChart/dataTransform/useTransformData.ts @@ -1,11 +1,10 @@ import * as React from 'react'; -import { InteractionContext } from '../../context/InteractionProvider'; import { ComputedPieRadius, DefaultizedPieSeriesType, DefaultizedPieValueType, } from '../../models/seriesType/pie'; -import { getIsHighlighted, getIsFaded } from '../../hooks/useInteractionItemProps'; +import { useHighlighted } from '../../context'; export interface AnimatedObject { innerRadius: number; @@ -25,13 +24,12 @@ export interface ValueWithHighlight extends DefaultizedPieValueType, AnimatedObj export function useTransformData( series: Pick< DefaultizedPieSeriesType, - 'cornerRadius' | 'paddingAngle' | 'id' | 'highlightScope' | 'highlighted' | 'faded' | 'data' + 'cornerRadius' | 'paddingAngle' | 'id' | 'highlighted' | 'faded' | 'data' > & ComputedPieRadius, ) { const { id: seriesId, - highlightScope, data, faded, highlighted, @@ -42,28 +40,17 @@ export function useTransformData( cornerRadius: baseCornerRadius = 0, } = series; - const { item: highlightedItem } = React.useContext(InteractionContext); - - const getHighlightStatus = React.useCallback( - (dataIndex: number) => { - const isHighlighted = getIsHighlighted( - highlightedItem, - { type: 'pie', seriesId, dataIndex }, - highlightScope, - ); - const isFaded = - !isHighlighted && - getIsFaded(highlightedItem, { type: 'pie', seriesId, dataIndex }, highlightScope); - - return { isHighlighted, isFaded }; - }, - [highlightScope, highlightedItem, seriesId], - ); + const { isFaded: isItemFaded, isHighlighted: isItemHighlighted } = useHighlighted(); const dataWithHighlight: ValueWithHighlight[] = React.useMemo( () => data.map((item, itemIndex) => { - const { isHighlighted, isFaded } = getHighlightStatus(itemIndex); + const currentItem = { + seriesId, + dataIndex: itemIndex, + }; + const isHighlighted = isItemHighlighted(currentItem); + const isFaded = !isHighlighted && isItemFaded(currentItem); const attributesOverride = { additionalRadius: 0, @@ -106,8 +93,10 @@ export function useTransformData( baseArcLabelRadius, data, faded, - getHighlightStatus, highlighted, + isItemFaded, + isItemHighlighted, + seriesId, ], ); diff --git a/packages/x-charts/src/PieChart/plugin.ts b/packages/x-charts/src/PieChart/plugin.ts new file mode 100644 index 000000000000..53962ded6764 --- /dev/null +++ b/packages/x-charts/src/PieChart/plugin.ts @@ -0,0 +1,9 @@ +import { ChartsPluginType } from '../models/plugin'; +import formatter from './formatter'; +import getColor from './getColor'; + +export const plugin: ChartsPluginType<'pie'> = { + seriesType: 'pie', + colorProcessor: getColor, + seriesFormatter: formatter, +}; diff --git a/packages/x-charts/src/ResponsiveChartContainer/ResponsiveChartContainer.tsx b/packages/x-charts/src/ResponsiveChartContainer/ResponsiveChartContainer.tsx index 75cfff6d21db..d58ef1b33fad 100644 --- a/packages/x-charts/src/ResponsiveChartContainer/ResponsiveChartContainer.tsx +++ b/packages/x-charts/src/ResponsiveChartContainer/ResponsiveChartContainer.tsx @@ -54,7 +54,7 @@ const ResponsiveChartContainer = React.forwardRef(function ResponsiveChartContai ResponsiveChartContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, className: PropTypes.string, @@ -78,6 +78,13 @@ ResponsiveChartContainer.propTypes = { * The height of the chart in px. If not defined, it takes the height of the parent element. */ height: PropTypes.number, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), /** * The margin between the SVG and the drawing area. * It's used for leaving some space for extra information such as the x- and y-axis or legend. @@ -90,6 +97,17 @@ ResponsiveChartContainer.propTypes = { right: PropTypes.number, top: PropTypes.number, }), + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, + /** + * An array of plugins defining how to preprocess data. + * If not provided, the container supports line, bar, scatter and pie charts. + */ + plugins: PropTypes.arrayOf(PropTypes.object), /** * The array of series to display. * Each type of series has its own specificity. @@ -160,7 +178,7 @@ ResponsiveChartContainer.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['bottom', 'top']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, @@ -231,7 +249,7 @@ ResponsiveChartContainer.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['left', 'right']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, diff --git a/packages/x-charts/src/ScatterChart/Scatter.tsx b/packages/x-charts/src/ScatterChart/Scatter.tsx index e5884bccaf3e..782c58ef531e 100644 --- a/packages/x-charts/src/ScatterChart/Scatter.tsx +++ b/packages/x-charts/src/ScatterChart/Scatter.tsx @@ -6,14 +6,10 @@ import { ScatterValueType, } from '../models/seriesType/scatter'; import { getValueToPositionMapper } from '../hooks/useScale'; -import { - getIsFaded, - getIsHighlighted, - useInteractionItemProps, -} from '../hooks/useInteractionItemProps'; +import { useInteractionItemProps } from '../hooks/useInteractionItemProps'; import { InteractionContext } from '../context/InteractionProvider'; import { D3Scale } from '../models/axis'; -import { HighlightScope } from '../context'; +import { useHighlighted } from '../context'; export interface ScatterProps { series: DefaultizedScatterSeriesType; @@ -46,15 +42,11 @@ export interface ScatterProps { function Scatter(props: ScatterProps) { const { series, xScale, yScale, color, colorGetter, markerSize, onItemClick } = props; - const highlightScope: HighlightScope = React.useMemo( - () => ({ highlighted: 'item', faded: 'global', ...series.highlightScope }), - [series.highlightScope], - ); - - const { item, useVoronoiInteraction } = React.useContext(InteractionContext); + const { useVoronoiInteraction } = React.useContext(InteractionContext); const skipInteractionHandlers = useVoronoiInteraction || series.disableHover; - const getInteractionItemProps = useInteractionItemProps(highlightScope, skipInteractionHandlers); + const getInteractionItemProps = useInteractionItemProps(skipInteractionHandlers); + const { isFaded, isHighlighted } = useHighlighted(); const cleanData = React.useMemo(() => { const getXPosition = getValueToPositionMapper(xScale); @@ -86,12 +78,16 @@ function Scatter(props: ScatterProps) { const pointCtx = { type: 'scatter' as const, seriesId: series.id, dataIndex: i }; if (isInRange) { - const isHighlighted = getIsHighlighted(item, pointCtx, highlightScope); + const currentItem = { + seriesId: pointCtx.seriesId, + dataIndex: pointCtx.dataIndex, + }; + const isItemHighlighted = isHighlighted(currentItem); temp.push({ x, y, - isHighlighted, - isFaded: !isHighlighted && getIsFaded(item, pointCtx, highlightScope), + isHighlighted: isItemHighlighted, + isFaded: !isItemHighlighted && isFaded(currentItem), interactionProps: getInteractionItemProps(pointCtx), id: scatterPoint.id, dataIndex: i, @@ -106,11 +102,11 @@ function Scatter(props: ScatterProps) { yScale, series.data, series.id, - item, - highlightScope, getInteractionItemProps, color, colorGetter, + isFaded, + isHighlighted, ]); return ( @@ -144,7 +140,7 @@ function Scatter(props: ScatterProps) { Scatter.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- color: PropTypes.string.isRequired, colorGetter: PropTypes.func, diff --git a/packages/x-charts/src/ScatterChart/ScatterChart.tsx b/packages/x-charts/src/ScatterChart/ScatterChart.tsx index 818a43cba528..3548f83c9977 100644 --- a/packages/x-charts/src/ScatterChart/ScatterChart.tsx +++ b/packages/x-charts/src/ScatterChart/ScatterChart.tsx @@ -54,7 +54,7 @@ export interface ScatterChartSlotProps ChartsOverlaySlotProps {} export interface ScatterChartProps - extends Omit<ResponsiveChartContainerProps, 'series'>, + extends Omit<ResponsiveChartContainerProps, 'series' | 'plugins'>, Omit<ZAxisContextProviderProps, 'children' | 'dataset'>, Omit<ChartsAxisProps, 'slots' | 'slotProps'>, Omit<ChartsOverlayProps, 'slots' | 'slotProps'>, @@ -143,6 +143,8 @@ const ScatterChart = React.forwardRef(function ScatterChart(props: ScatterChartP slots, slotProps, loading, + highlightedItem, + onHighlightChange, } = props; return ( <ResponsiveChartContainer @@ -155,6 +157,8 @@ const ScatterChart = React.forwardRef(function ScatterChart(props: ScatterChartP xAxis={xAxis} yAxis={yAxis} sx={sx} + highlightedItem={highlightedItem} + onHighlightChange={onHighlightChange} > <ZAxisContextProvider zAxis={zAxis}> {!disableVoronoi && ( @@ -193,7 +197,7 @@ const ScatterChart = React.forwardRef(function ScatterChart(props: ScatterChartP ScatterChart.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The configuration of axes highlight. @@ -244,6 +248,13 @@ ScatterChart.propTypes = { * The height of the chart in px. If not defined, it takes the height of the parent element. */ height: PropTypes.number, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), /** * Indicate which axis to display the left of the charts. * Can be a string (the id of the axis) or an object `ChartsYAxisProps`. @@ -281,6 +292,12 @@ ScatterChart.propTypes = { right: PropTypes.number, top: PropTypes.number, }), + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, /** * Callback fired when clicking on a scatter item. * @param {MouseEvent} event The mouse event recorded on the `<svg/>` element if using Voronoi cells. Or the Mouse event from the scatter element, when `disableVoronoi=true`. @@ -396,7 +413,7 @@ ScatterChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['bottom', 'top']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, @@ -467,7 +484,7 @@ ScatterChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['left', 'right']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, diff --git a/packages/x-charts/src/ScatterChart/ScatterPlot.tsx b/packages/x-charts/src/ScatterChart/ScatterPlot.tsx index f714d8fb513a..9b4129a1fa0c 100644 --- a/packages/x-charts/src/ScatterChart/ScatterPlot.tsx +++ b/packages/x-charts/src/ScatterChart/ScatterPlot.tsx @@ -1,10 +1,10 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import { Scatter, ScatterProps } from './Scatter'; -import { SeriesContext } from '../context/SeriesContextProvider'; import { CartesianContext } from '../context/CartesianContextProvider'; import getColor from './getColor'; import { ZAxisContext } from '../context/ZAxisContextProvider'; +import { useScatterSeries } from '../hooks/useSeries'; export interface ScatterPlotSlots { scatter?: React.JSXElementConstructor<ScatterProps>; @@ -39,7 +39,7 @@ export interface ScatterPlotProps extends Pick<ScatterProps, 'onItemClick'> { */ function ScatterPlot(props: ScatterPlotProps) { const { slots, slotProps, onItemClick } = props; - const seriesData = React.useContext(SeriesContext).scatter; + const seriesData = useScatterSeries(); const axisData = React.useContext(CartesianContext); const { zAxis, zAxisIds } = React.useContext(ZAxisContext); @@ -89,7 +89,7 @@ function ScatterPlot(props: ScatterPlotProps) { ScatterPlot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Callback fired when clicking on a scatter item. diff --git a/packages/x-charts/src/ScatterChart/formatter.ts b/packages/x-charts/src/ScatterChart/formatter.ts index d0db1a6ad0a5..4f212f9afa8e 100644 --- a/packages/x-charts/src/ScatterChart/formatter.ts +++ b/packages/x-charts/src/ScatterChart/formatter.ts @@ -1,4 +1,4 @@ -import defaultizeValueFormatter from '../internals/defaultizeValueFormatter'; +import { defaultizeValueFormatter } from '../internals/defaultizeValueFormatter'; import { Formatter } from '../models/seriesType/config'; const formatter: Formatter<'scatter'> = ({ series, seriesOrder }) => { diff --git a/packages/x-charts/src/ScatterChart/getColor.ts b/packages/x-charts/src/ScatterChart/getColor.ts index 79166556b143..273a8b37c704 100644 --- a/packages/x-charts/src/ScatterChart/getColor.ts +++ b/packages/x-charts/src/ScatterChart/getColor.ts @@ -4,13 +4,13 @@ import { DefaultizedScatterSeriesType } from '../models/seriesType/scatter'; export default function getColor( series: DefaultizedScatterSeriesType, - xAxis: AxisDefaultized, - yAxis: AxisDefaultized, + xAxis?: AxisDefaultized, + yAxis?: AxisDefaultized, zAxis?: ZAxisDefaultized, ) { const zColorScale = zAxis?.colorScale; - const yColorScale = yAxis.colorScale; - const xColorScale = xAxis.colorScale; + const yColorScale = yAxis?.colorScale; + const xColorScale = xAxis?.colorScale; if (zColorScale) { return (dataIndex: number) => { diff --git a/packages/x-charts/src/ScatterChart/plugin.ts b/packages/x-charts/src/ScatterChart/plugin.ts new file mode 100644 index 000000000000..ca77573981a1 --- /dev/null +++ b/packages/x-charts/src/ScatterChart/plugin.ts @@ -0,0 +1,12 @@ +import { ChartsPluginType } from '../models/plugin'; +import { getExtremumX, getExtremumY } from './extremums'; +import formatter from './formatter'; +import getColor from './getColor'; + +export const plugin: ChartsPluginType<'scatter'> = { + seriesType: 'scatter', + seriesFormatter: formatter, + colorProcessor: getColor, + xExtremumGetter: getExtremumX, + yExtremumGetter: getExtremumY, +}; diff --git a/packages/x-charts/src/SparkLineChart/SparkLineChart.tsx b/packages/x-charts/src/SparkLineChart/SparkLineChart.tsx index 42b997163a56..d95141a27acd 100644 --- a/packages/x-charts/src/SparkLineChart/SparkLineChart.tsx +++ b/packages/x-charts/src/SparkLineChart/SparkLineChart.tsx @@ -14,7 +14,7 @@ import { ChartsTooltipSlots, } from '../ChartsTooltip'; import { ChartsAxisHighlight, ChartsAxisHighlightProps } from '../ChartsAxisHighlight'; -import { AxisConfig } from '../models/axis'; +import { AxisConfig, ChartsXAxisProps, ScaleName } from '../models/axis'; import { MakeOptional } from '../models/helpers'; import { LineSeriesType } from '../models/seriesType/line'; import { CardinalDirections } from '../models/layout'; @@ -29,7 +29,7 @@ export interface SparkLineChartSlots LinePlotSlots, MarkPlotSlots, LineHighlightPlotSlots, - BarPlotSlots, + Omit<BarPlotSlots, 'barLabel'>, ChartsTooltipSlots {} export interface SparkLineChartSlotProps extends AreaPlotSlotProps, @@ -40,12 +40,12 @@ export interface SparkLineChartSlotProps ChartsTooltipSlotProps {} export interface SparkLineChartProps - extends Omit<ResponsiveChartContainerProps, 'series' | 'xAxis' | 'yAxis' | 'margin'> { + extends Omit<ResponsiveChartContainerProps, 'series' | 'xAxis' | 'yAxis' | 'margin' | 'plugins'> { /** * The xAxis configuration. * Notice it is a single configuration object, not an array of configuration. */ - xAxis?: MakeOptional<AxisConfig, 'id'>; + xAxis?: MakeOptional<AxisConfig<ScaleName, any, ChartsXAxisProps>, 'id'>; tooltip?: ChartsTooltipProps; axisHighlight?: ChartsAxisHighlightProps; /** @@ -214,7 +214,7 @@ const SparkLineChart = React.forwardRef(function SparkLineChart(props: SparkLine SparkLineChart.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Set to `true` to fill spark line area. @@ -265,6 +265,13 @@ SparkLineChart.propTypes = { * The height of the chart in px. If not defined, it takes the height of the parent element. */ height: PropTypes.number, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), /** * The margin between the SVG and the drawing area. * It's used for leaving some space for extra information such as the x- and y-axis or legend. @@ -282,6 +289,12 @@ SparkLineChart.propTypes = { right: PropTypes.number, top: PropTypes.number, }), + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, /** * Type of plot used. * @default 'line' @@ -384,7 +397,7 @@ SparkLineChart.propTypes = { labelStyle: PropTypes.object, max: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), min: PropTypes.oneOfType([PropTypes.instanceOf(Date), PropTypes.number]), - position: PropTypes.oneOf(['bottom', 'left', 'right', 'top']), + position: PropTypes.oneOf(['bottom', 'top']), reverse: PropTypes.bool, scaleType: PropTypes.oneOf(['band', 'linear', 'log', 'point', 'pow', 'sqrt', 'time', 'utc']), slotProps: PropTypes.object, diff --git a/packages/x-charts/src/context/CartesianContextProvider.tsx b/packages/x-charts/src/context/CartesianContextProvider.tsx index a6eaeb90f9aa..9a97fbd6e807 100644 --- a/packages/x-charts/src/context/CartesianContextProvider.tsx +++ b/packages/x-charts/src/context/CartesianContextProvider.tsx @@ -1,23 +1,19 @@ import * as React from 'react'; import { scaleBand, scalePoint } from 'd3-scale'; import { - getExtremumX as getBarExtremumX, - getExtremumY as getBarExtremumY, -} from '../BarChart/extremums'; -import { - getExtremumX as getScatterExtremumX, - getExtremumY as getScatterExtremumY, -} from '../ScatterChart/extremums'; -import { - getExtremumX as getLineExtremumX, - getExtremumY as getLineExtremumY, -} from '../LineChart/extremums'; -import { AxisConfig, AxisDefaultized, isBandScaleConfig, isPointScaleConfig } from '../models/axis'; + AxisConfig, + AxisDefaultized, + ChartsXAxisProps, + ChartsYAxisProps, + ScaleName, + isBandScaleConfig, + isPointScaleConfig, +} from '../models/axis'; import { getScale } from '../internals/getScale'; -import { SeriesContext } from './SeriesContextProvider'; import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants'; import { CartesianChartSeriesType, + ChartSeriesType, ChartSeries, DatasetType, ExtremumGetter, @@ -28,6 +24,11 @@ import { getTickNumber } from '../hooks/useTicks'; import { useDrawingArea } from '../hooks/useDrawingArea'; import { SeriesId } from '../models/seriesType/common'; import { getColorScale, getOrdinalColorScale } from '../internals/colorScale'; +import { useSeries } from '../hooks/useSeries'; + +export type ExtremumGettersConfig<T extends ChartSeriesType = CartesianChartSeriesType> = { + [K in T]?: ExtremumGetter<K>; +}; export type CartesianContextProviderProps = { /** @@ -35,38 +36,33 @@ export type CartesianContextProviderProps = { * If not provided, a default axis config is used. * An array of [[AxisConfig]] objects. */ - xAxis?: MakeOptional<AxisConfig, 'id'>[]; + xAxis?: MakeOptional<AxisConfig<ScaleName, any, ChartsXAxisProps>, 'id'>[]; /** * The configuration of the y-axes. * If not provided, a default axis config is used. * An array of [[AxisConfig]] objects. */ - yAxis?: MakeOptional<AxisConfig, 'id'>[]; + yAxis?: MakeOptional<AxisConfig<ScaleName, any, ChartsYAxisProps>, 'id'>[]; /** * An array of objects that can be used to populate series and axes data using their `dataKey` property. */ dataset?: DatasetType; + /** + * An object with x-axis extremum getters per series type. + */ + xExtremumGetters: ExtremumGettersConfig; + /** + * An object with y-axis extremum getters per series type. + */ + yExtremumGetters: ExtremumGettersConfig; children: React.ReactNode; }; const DEFAULT_CATEGORY_GAP_RATIO = 0.2; const DEFAULT_BAR_GAP_RATIO = 0.1; -// TODO: those might be better placed in a distinct file -const xExtremumGetters: { [T in CartesianChartSeriesType]: ExtremumGetter<T> } = { - bar: getBarExtremumX, - scatter: getScatterExtremumX, - line: getLineExtremumX, -}; - -const yExtremumGetters: { [T in CartesianChartSeriesType]: ExtremumGetter<T> } = { - bar: getBarExtremumY, - scatter: getScatterExtremumY, - line: getLineExtremumY, -}; - -type DefaultizedAxisConfig = { - [axisKey: string]: AxisDefaultized; +type DefaultizedAxisConfig<AxisProps> = { + [axisKey: string]: AxisDefaultized<ScaleName, any, AxisProps>; }; export const CartesianContext = React.createContext<{ @@ -74,14 +70,14 @@ export const CartesianContext = React.createContext<{ * Mapping from x-axis key to scaling configuration. */ xAxis: { - DEFAULT_X_AXIS_KEY: AxisDefaultized; - } & DefaultizedAxisConfig; + DEFAULT_X_AXIS_KEY: AxisDefaultized<ScaleName, any, ChartsXAxisProps>; + } & DefaultizedAxisConfig<ChartsXAxisProps>; /** * Mapping from y-axis key to scaling configuration. */ yAxis: { - DEFAULT_X_AXIS_KEY: AxisDefaultized; - } & DefaultizedAxisConfig; + DEFAULT_X_AXIS_KEY: AxisDefaultized<ScaleName, any, ChartsYAxisProps>; + } & DefaultizedAxisConfig<ChartsYAxisProps>; /** * The x-axes IDs sorted by order they got provided. */ @@ -98,8 +94,15 @@ if (process.env.NODE_ENV !== 'production') { } function CartesianContextProvider(props: CartesianContextProviderProps) { - const { xAxis: inXAxis, yAxis: inYAxis, dataset, children } = props; - const formattedSeries = React.useContext(SeriesContext); + const { + xAxis: inXAxis, + yAxis: inYAxis, + dataset, + xExtremumGetters, + yExtremumGetters, + children, + } = props; + const formattedSeries = useSeries(); const drawingArea = useDrawingArea(); const xAxis = React.useMemo( @@ -143,17 +146,17 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { acc: ExtremumGetterResult, chartType: T, axis: AxisConfig, - getters: { [T2 in CartesianChartSeriesType]: ExtremumGetter<T2> }, + getters: { [T2 in CartesianChartSeriesType]?: ExtremumGetter<T2> }, isDefaultAxis: boolean, ): ExtremumGetterResult => { const getter = getters[chartType]; const series = (formattedSeries[chartType]?.series as Record<SeriesId, ChartSeries<T>>) ?? {}; - const [minChartTypeData, maxChartTypeData] = getter({ + const [minChartTypeData, maxChartTypeData] = getter?.({ series, axis, isDefaultAxis, - }); + }) ?? [null, null]; const [minData, maxData] = acc; @@ -170,7 +173,7 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { const getAxisExtremum = ( axis: AxisConfig, - getters: { [T in CartesianChartSeriesType]: ExtremumGetter<T> }, + getters: { [T in CartesianChartSeriesType]?: ExtremumGetter<T> }, isDefaultAxis: boolean, ) => { const charTypes = Object.keys(getters) as CartesianChartSeriesType[]; @@ -181,15 +184,21 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { ); }; - const allXAxis: AxisConfig[] = [ + const allXAxis = [ ...(xAxis?.map((axis, index) => ({ id: `defaultized-x-axis-${index}`, ...axis })) ?? []), // Allows to specify an axis with id=DEFAULT_X_AXIS_KEY ...(xAxis === undefined || xAxis.findIndex(({ id }) => id === DEFAULT_X_AXIS_KEY) === -1 - ? [{ id: DEFAULT_X_AXIS_KEY, scaleType: 'linear' } as AxisConfig] + ? [ + { id: DEFAULT_X_AXIS_KEY, scaleType: 'linear' } as AxisConfig< + ScaleName, + any, + ChartsXAxisProps + >, + ] : []), ]; - const completedXAxis: DefaultizedAxisConfig = {}; + const completedXAxis: DefaultizedAxisConfig<ChartsXAxisProps> = {}; allXAxis.forEach((axis, axisIndex) => { const isDefaultAxis = axisIndex === 0; const [minData, maxData] = getAxisExtremum(axis, xExtremumGetters, isDefaultAxis); @@ -248,17 +257,23 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { scale: niceScale.domain(domain), tickNumber, colorScale: axis.colorMap && getColorScale(axis.colorMap), - } as AxisDefaultized<typeof scaleType>; + } as AxisDefaultized<typeof scaleType, any, ChartsXAxisProps>; }); - const allYAxis: AxisConfig[] = [ + const allYAxis = [ ...(yAxis?.map((axis, index) => ({ id: `defaultized-y-axis-${index}`, ...axis })) ?? []), ...(yAxis === undefined || yAxis.findIndex(({ id }) => id === DEFAULT_Y_AXIS_KEY) === -1 - ? [{ id: DEFAULT_Y_AXIS_KEY, scaleType: 'linear' } as AxisConfig] + ? [ + { id: DEFAULT_Y_AXIS_KEY, scaleType: 'linear' } as AxisConfig< + ScaleName, + any, + ChartsYAxisProps + >, + ] : []), ]; - const completedYAxis: DefaultizedAxisConfig = {}; + const completedYAxis: DefaultizedAxisConfig<ChartsYAxisProps> = {}; allYAxis.forEach((axis, axisIndex) => { const isDefaultAxis = axisIndex === 0; const [minData, maxData] = getAxisExtremum(axis, yExtremumGetters, isDefaultAxis); @@ -315,7 +330,7 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { scale: niceScale.domain(domain), tickNumber, colorScale: axis.colorMap && getColorScale(axis.colorMap), - } as AxisDefaultized<typeof scaleType>; + } as AxisDefaultized<typeof scaleType, any, ChartsYAxisProps>; }); return { @@ -331,7 +346,9 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { drawingArea.width, formattedSeries, xAxis, + xExtremumGetters, yAxis, + yExtremumGetters, ]); // @ts-ignore diff --git a/packages/x-charts/src/context/ColorProvider.tsx b/packages/x-charts/src/context/ColorProvider.tsx new file mode 100644 index 000000000000..46faebddded3 --- /dev/null +++ b/packages/x-charts/src/context/ColorProvider.tsx @@ -0,0 +1,22 @@ +import * as React from 'react'; +import { ColorProcessorsConfig } from '../models'; +import { ChartSeriesType } from '../internals'; + +export interface ColorProviderProps { + children: React.ReactNode; + /** + * A mapping defining for each series type how to get item colors. + */ + colorProcessors: ColorProcessorsConfig<ChartSeriesType>; +} +export const ColorContext = React.createContext<ColorProviderProps['colorProcessors']>({}); + +if (process.env.NODE_ENV !== 'production') { + ColorContext.displayName = 'ColorContext'; +} + +export function ColorProvider(props: ColorProviderProps) { + const { colorProcessors, children } = props; + + return <ColorContext.Provider value={colorProcessors}>{children}</ColorContext.Provider>; +} diff --git a/packages/x-charts/src/context/DrawingProvider.tsx b/packages/x-charts/src/context/DrawingProvider.tsx index 6f418dd8f57e..6e7a5ceb6111 100644 --- a/packages/x-charts/src/context/DrawingProvider.tsx +++ b/packages/x-charts/src/context/DrawingProvider.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import useId from '@mui/utils/useId'; import useChartDimensions from '../hooks/useChartDimensions'; import { LayoutConfig } from '../models/layout'; +import { Initializable } from './context.types'; export interface DrawingProviderProps extends LayoutConfig { children: React.ReactNode; @@ -59,7 +60,12 @@ if (process.env.NODE_ENV !== 'production') { DrawingContext.displayName = 'DrawingContext'; } -export const SvgContext = React.createContext<React.RefObject<SVGSVGElement>>({ current: null }); +export type SvgContextState = React.RefObject<SVGSVGElement>; + +export const SvgContext = React.createContext<Initializable<SvgContextState>>({ + isInitialized: false, + data: { current: null }, +}); if (process.env.NODE_ENV !== 'production') { SvgContext.displayName = 'SvgContext'; @@ -75,8 +81,10 @@ export function DrawingProvider(props: DrawingProviderProps) { [chartId, drawingArea], ); + const refValue = React.useMemo(() => ({ isInitialized: true, data: svgRef }), [svgRef]); + return ( - <SvgContext.Provider value={svgRef}> + <SvgContext.Provider value={refValue}> <DrawingContext.Provider value={value}>{children}</DrawingContext.Provider> </SvgContext.Provider> ); diff --git a/packages/x-charts/src/context/HighlightProvider.tsx b/packages/x-charts/src/context/HighlightProvider.tsx deleted file mode 100644 index 2a0d8080afac..000000000000 --- a/packages/x-charts/src/context/HighlightProvider.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import * as React from 'react'; -import { ChartItemIdentifier, ChartSeriesType } from '../models/seriesType/config'; - -export interface HighlightProviderProps { - children: React.ReactNode; -} - -export type ItemHighlighData<T extends ChartSeriesType> = ChartItemIdentifier<T>; - -export type HighlightOptions = 'none' | 'item' | 'series'; -export type FadeOptions = 'none' | 'series' | 'global'; - -export type HighlightScope = { - /** - * The scope of highlighted elements. - * - 'none': no highlight. - * - 'item': only highlight the item. - * - 'series': highlight all elements of the same series. - * @default 'none' - */ - highlighted: HighlightOptions; - /** - * The scope of faded elements. - * - 'none': no fading. - * - 'series': only fade element of the same series. - * - 'global': fade all elements that are not highlighted. - * @default 'none' - */ - faded: FadeOptions; -}; -type HighlighActions<T extends ChartSeriesType = ChartSeriesType> = - | { - type: 'enterItem'; - item: ItemHighlighData<T>; - scope?: Partial<HighlightScope>; - } - | { - type: 'leaveItem'; - item: ItemHighlighData<T>; - }; - -type HighlighState = { - /** - * The item that triggers the highlight state. - */ - item: null | ItemHighlighData<ChartSeriesType>; - scope: HighlightScope; - dispatch: React.Dispatch<HighlighActions>; -}; - -const defaultScope: HighlightScope = { highlighted: 'none', faded: 'none' }; - -export const HighlighContext = React.createContext<HighlighState>({ - item: null, - scope: defaultScope, - dispatch: () => null, -}); - -if (process.env.NODE_ENV !== 'production') { - HighlighContext.displayName = 'HighlighContext'; -} - -const dataReducer: React.Reducer<Omit<HighlighState, 'dispatch'>, HighlighActions> = ( - prevState, - action, -) => { - switch (action.type) { - case 'enterItem': - return { - ...prevState, - item: action.item, - scope: { ...defaultScope, ...action.scope }, - }; - - case 'leaveItem': - if ( - prevState.item === null || - (Object.keys(action.item) as (keyof ItemHighlighData<ChartSeriesType>)[]).some( - (key) => action.item[key] !== prevState.item![key], - ) - ) { - // The item is already something else - return prevState; - } - return { ...prevState, item: null }; - - default: - return prevState; - } -}; - -function HighlightProvider(props: HighlightProviderProps) { - const { children } = props; - const [data, dispatch] = React.useReducer(dataReducer, { - item: null, - scope: defaultScope, - }); - - const value = React.useMemo( - () => ({ - ...data, - dispatch, - }), - [data], - ); - - return <HighlighContext.Provider value={value}>{children}</HighlighContext.Provider>; -} - -export { HighlightProvider }; diff --git a/packages/x-charts/src/context/HighlightedProvider/HighlightedContext.ts b/packages/x-charts/src/context/HighlightedProvider/HighlightedContext.ts new file mode 100644 index 000000000000..335b8ba59223 --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/HighlightedContext.ts @@ -0,0 +1,85 @@ +import * as React from 'react'; +import { SeriesId } from '../../models/seriesType/common'; +import { Initializable } from '../context.types'; + +/** + * The data of the highlighted item. + * To highlight an item, you need to provide the series id and the item id. + * If targeting the whole series, you can omit the item id. + * To clear the highlight, set the value to an empty object. + * + * @example + * // Highlight the item with the series id 'london' and the item id 0. + * { seriesId: 'london', dataIndex: 0 } + * + * // Highlight the whole series with the series id 'london'. + * { seriesId: 'london' } + * + * // Clear the highlight. + * {} + */ +export type HighlightItemData = { + /** + * The series id of the highlighted item. + */ + seriesId?: SeriesId; + /** + * The index of the item in series data. + */ + dataIndex?: number; +}; + +export type HighlightOptions = 'none' | 'item' | 'series'; + +export type FadeOptions = 'none' | 'series' | 'global'; + +export type HighlightScope = { + /** + * @deprecated Use `highlight` instead. + */ + highlighted?: HighlightOptions; + /** + * The scope of highlighted elements. + * - 'none': no highlight. + * - 'item': only highlight the item. + * - 'series': highlight all elements of the same series. + * @default 'none' + */ + highlight?: HighlightOptions; + /** + * @deprecated Use `fade` instead. + */ + faded?: FadeOptions; + /** + * The scope of faded elements. + * - 'none': no fading. + * - 'series': only fade element of the same series. + * - 'global': fade all elements that are not highlighted. + * @default 'none' + */ + fade?: FadeOptions; +}; + +export type HighlightedState = { + highlightScope?: Partial<HighlightScope>; + highlightedItem: HighlightItemData | null; + setHighlighted: (item: HighlightItemData) => void; + clearHighlighted: () => void; + isHighlighted: (input: HighlightItemData) => boolean; + isFaded: (input: HighlightItemData) => boolean; +}; + +export const HighlightedContext = React.createContext<Initializable<HighlightedState>>({ + isInitialized: false, + data: { + highlightedItem: null, + setHighlighted: () => {}, + clearHighlighted: () => {}, + isHighlighted: () => false, + isFaded: () => false, + }, +}); + +if (process.env.NODE_ENV !== 'production') { + HighlightedContext.displayName = 'HighlightedContext'; +} diff --git a/packages/x-charts/src/context/HighlightedProvider/HighlightedProvider.tsx b/packages/x-charts/src/context/HighlightedProvider/HighlightedProvider.tsx new file mode 100644 index 000000000000..d9922f67bf9d --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/HighlightedProvider.tsx @@ -0,0 +1,117 @@ +import * as React from 'react'; +import PropTypes from 'prop-types'; +import useControlled from '@mui/utils/useControlled'; +import { + HighlightItemData, + HighlightedContext, + HighlightScope, + HighlightedState, +} from './HighlightedContext'; +import { createIsFaded } from './createIsFaded'; +import { createIsHighlighted } from './createIsHighlighted'; +import { useSeries } from '../../hooks/useSeries'; +import { ChartSeriesType } from '../../models/seriesType/config'; +import { SeriesId } from '../../models/seriesType/common'; +import { Initializable } from '../context.types'; + +export type HighlightedProviderProps = { + children: React.ReactNode; + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem?: HighlightItemData | null; + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange?: (highlightedItem: HighlightItemData | null) => void; +}; + +const mergeDeprecatedOptions = (options?: Partial<HighlightScope>): HighlightScope => { + const { highlighted, faded, ...rest } = options ?? {}; + return { + highlight: highlighted, + fade: faded, + ...rest, + }; +}; + +function HighlightedProvider({ + children, + highlightedItem: highlightedItemProps, + onHighlightChange, +}: HighlightedProviderProps) { + const [highlightedItem, setHighlightedItem] = useControlled({ + controlled: highlightedItemProps, + default: null, + name: 'HighlightedProvider', + state: 'highlightedItem', + }); + + const series = useSeries(); + const seriesById = React.useMemo(() => { + const map: Map<SeriesId, Partial<HighlightScope> | undefined> = new Map(); + + Object.keys(series).forEach((seriesType) => { + const seriesData = series[seriesType as ChartSeriesType]; + Object.keys(seriesData?.series ?? {}).forEach((seriesId) => { + const seriesItem = seriesData?.series[seriesId]; + map.set(seriesId, mergeDeprecatedOptions(seriesItem?.highlightScope)); + }); + }); + return map; + }, [series]); + + const highlightScope = + highlightedItem && highlightedItem.seriesId + ? seriesById.get(highlightedItem.seriesId) ?? undefined + : undefined; + + const providerValue = React.useMemo<Initializable<HighlightedState>>(() => { + return { + isInitialized: true, + data: { + highlightScope, + highlightedItem, + setHighlighted: (itemData) => { + setHighlightedItem(itemData); + onHighlightChange?.(itemData); + }, + clearHighlighted: () => { + setHighlightedItem(null); + onHighlightChange?.(null); + }, + isHighlighted: createIsHighlighted(highlightScope, highlightedItem), + isFaded: createIsFaded(highlightScope, highlightedItem), + }, + }; + }, [highlightedItem, highlightScope, setHighlightedItem, onHighlightChange]); + + return ( + <HighlightedContext.Provider value={providerValue}>{children}</HighlightedContext.Provider> + ); +} + +HighlightedProvider.propTypes = { + // ----------------------------- Warning -------------------------------- + // | These PropTypes are generated from the TypeScript type definitions | + // | To update them edit the TypeScript types and run "pnpm proptypes" | + // ---------------------------------------------------------------------- + children: PropTypes.node, + /** + * The item currently highlighted. Turns highlighting into a controlled prop. + */ + highlightedItem: PropTypes.shape({ + dataIndex: PropTypes.number, + seriesId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + }), + /** + * The callback fired when the highlighted item changes. + * + * @param {HighlightItemData | null} highlightedItem The newly highlighted item. + */ + onHighlightChange: PropTypes.func, +} as any; + +export { HighlightedProvider }; diff --git a/packages/x-charts/src/context/HighlightedProvider/createIsFaded.test.ts b/packages/x-charts/src/context/HighlightedProvider/createIsFaded.test.ts new file mode 100644 index 000000000000..b333d9444280 --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/createIsFaded.test.ts @@ -0,0 +1,50 @@ +import { expect } from 'chai'; +import { createIsFaded } from './createIsFaded'; + +const itemData = { + seriesId: '1s', + dataIndex: 1, + value: '1v', +}; + +describe('createIsFaded', () => { + it('should return false when no options are set', () => { + expect(createIsFaded(null, null)(itemData)).to.equal(false); + }); + + describe('faded=series', () => { + const isFadedSameSeries = createIsFaded({ fade: 'series' }, itemData); + + it('should return true when input series is same as highlighted', () => { + expect(isFadedSameSeries({ ...itemData, dataIndex: 2 })).to.equal(true); + }); + + it('should return false when input series is different than highlighted', () => { + expect(isFadedSameSeries({ ...itemData, seriesId: '2' })).to.equal(false); + }); + }); + + describe('faded=global', () => { + const isFadedGlobal = createIsFaded({ fade: 'global' }, itemData); + + it('should return false when item is same as highlighted', () => { + expect(isFadedGlobal(itemData)).to.equal(false); + }); + + it('should return true when item is different than highlighted', () => { + expect(isFadedGlobal({ ...itemData, dataIndex: 2 })).to.equal(true); + }); + + it('should return true when series is different than highlighted', () => { + expect(isFadedGlobal({ ...itemData, seriesId: '2' })).to.equal(true); + }); + }); + + describe('faded=none', () => { + const isFadedNone = createIsFaded({ fade: 'none' }, itemData); + + it('should return false when item is same as highlighted', () => { + expect(isFadedNone(itemData)).to.equal(false); + }); + }); +}); diff --git a/packages/x-charts/src/context/HighlightedProvider/createIsFaded.ts b/packages/x-charts/src/context/HighlightedProvider/createIsFaded.ts new file mode 100644 index 000000000000..8ec92655fcac --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/createIsFaded.ts @@ -0,0 +1,25 @@ +import { HighlightItemData, HighlightScope } from './HighlightedContext'; + +export const createIsFaded = + (highlightScope: HighlightScope | null | undefined, highlightedItem: HighlightItemData | null) => + (input: HighlightItemData): boolean => { + if (!highlightScope) { + return false; + } + + if (highlightScope.fade === 'series') { + return ( + input.seriesId === highlightedItem?.seriesId && + input.dataIndex !== highlightedItem?.dataIndex + ); + } + + if (highlightScope.fade === 'global') { + return ( + input.seriesId !== highlightedItem?.seriesId || + input.dataIndex !== highlightedItem?.dataIndex + ); + } + + return false; + }; diff --git a/packages/x-charts/src/context/HighlightedProvider/createIsHighlighted.test.ts b/packages/x-charts/src/context/HighlightedProvider/createIsHighlighted.test.ts new file mode 100644 index 000000000000..3670226150a8 --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/createIsHighlighted.test.ts @@ -0,0 +1,54 @@ +import { expect } from 'chai'; +import { createIsHighlighted } from './createIsHighlighted'; + +const itemData = { + seriesId: '1s', + dataIndex: 1, + value: '1v', +}; + +describe('createIsHighlighted', () => { + it('should return false when no options are set', () => { + expect(createIsHighlighted(null, null)(itemData)).to.equal(false); + }); + + describe('highlighted=series', () => { + const isHighlightedSameSeries = createIsHighlighted({ highlight: 'series' }, itemData); + + it('should return true when input series is same as highlighted', () => { + expect(isHighlightedSameSeries(itemData)).to.equal(true); + }); + + it('should return false when input series is different than highlighted', () => { + expect(isHighlightedSameSeries({ ...itemData, seriesId: '2' })).to.equal(false); + }); + + it('should return true when input item is different than highlighted', () => { + expect(isHighlightedSameSeries({ ...itemData, dataIndex: 2 })).to.equal(true); + }); + }); + + describe('highlighted=item', () => { + const isHighlightedItem = createIsHighlighted({ highlight: 'item' }, itemData); + + it('should return true when input item is same as highlighted', () => { + expect(isHighlightedItem(itemData)).to.equal(true); + }); + + it('should return false when input item is different than highlighted', () => { + expect(isHighlightedItem({ ...itemData, dataIndex: 2 })).to.equal(false); + }); + + it('should return false when input series is different than highlighted', () => { + expect(isHighlightedItem({ ...itemData, seriesId: '2' })).to.equal(false); + }); + }); + + describe('highlighted=none', () => { + const isHighlightedNone = createIsHighlighted({ highlight: 'none' }, itemData); + + it('should return false', () => { + expect(isHighlightedNone(itemData)).to.equal(false); + }); + }); +}); diff --git a/packages/x-charts/src/context/HighlightedProvider/createIsHighlighted.ts b/packages/x-charts/src/context/HighlightedProvider/createIsHighlighted.ts new file mode 100644 index 000000000000..3d94cd023f6f --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/createIsHighlighted.ts @@ -0,0 +1,22 @@ +import { HighlightItemData, HighlightScope } from './HighlightedContext'; + +export const createIsHighlighted = + (highlightScope: HighlightScope | null | undefined, highlightedItem: HighlightItemData | null) => + (input: HighlightItemData): boolean => { + if (!highlightScope) { + return false; + } + + if (highlightScope.highlight === 'series') { + return input.seriesId === highlightedItem?.seriesId; + } + + if (highlightScope.highlight === 'item') { + return ( + input.dataIndex === highlightedItem?.dataIndex && + input.seriesId === highlightedItem?.seriesId + ); + } + + return false; + }; diff --git a/packages/x-charts/src/context/HighlightedProvider/index.ts b/packages/x-charts/src/context/HighlightedProvider/index.ts new file mode 100644 index 000000000000..c1186b1179d2 --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/index.ts @@ -0,0 +1,4 @@ +export * from './HighlightedProvider'; +export * from './HighlightedContext'; +export * from './useHighlighted'; +export * from './useItemHighlighted'; diff --git a/packages/x-charts/src/context/HighlightedProvider/useHighlighted.test.tsx b/packages/x-charts/src/context/HighlightedProvider/useHighlighted.test.tsx new file mode 100644 index 000000000000..1ed200662456 --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/useHighlighted.test.tsx @@ -0,0 +1,54 @@ +import * as React from 'react'; +import { expect } from 'chai'; +import { ErrorBoundary, createRenderer } from '@mui/internal-test-utils'; +import { useHighlighted } from './useHighlighted'; +import { HighlightedProvider } from './HighlightedProvider'; +import { SeriesContextProvider } from '../SeriesContextProvider'; + +function UseHighlighted() { + const { highlightedItem } = useHighlighted(); + return <div>{highlightedItem?.seriesId}</div>; +} + +describe('useHighlighted', () => { + const { render } = createRenderer(); + + it('should throw an error when parent context not present', function test() { + if (!/jsdom/.test(window.navigator.userAgent)) { + // can't catch render errors in the browser for unknown reason + // tried try-catch + error boundary + window onError preventDefault + this.skip(); + } + + const errorRef = React.createRef<any>(); + + expect(() => + render( + <ErrorBoundary ref={errorRef}> + <UseHighlighted /> + </ErrorBoundary>, + ), + ).toErrorDev([ + 'MUI X: Could not find the highlighted ref context.', + 'It looks like you rendered your component outside of a ChartsContainer parent component.', + 'The above error occurred in the <UseHighlighted> component:', + ]); + + expect((errorRef.current as any).errors).to.have.length(1); + expect((errorRef.current as any).errors[0].toString()).to.include( + 'MUI X: Could not find the highlighted ref context.', + ); + }); + + it('should not throw an error when parent context is present', () => { + const { getByText } = render( + <SeriesContextProvider series={[]} seriesFormatters={{}}> + <HighlightedProvider highlightedItem={{ seriesId: 'test-id' }}> + <UseHighlighted /> + </HighlightedProvider> + </SeriesContextProvider>, + ); + + expect(getByText('test-id')).toBeVisible(); + }); +}); diff --git a/packages/x-charts/src/context/HighlightedProvider/useHighlighted.ts b/packages/x-charts/src/context/HighlightedProvider/useHighlighted.ts new file mode 100644 index 000000000000..59e0c8b9ac27 --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/useHighlighted.ts @@ -0,0 +1,24 @@ +import * as React from 'react'; +import { HighlightedContext, HighlightedState } from './HighlightedContext'; + +/** + * A hook to get the highlighted state of the chart. + * + * Please consider using the `useItemHighlighted` hook if you need to check the state of a specific item. + * + * @returns {HighlightedState} the state of the chart + */ +export function useHighlighted(): HighlightedState { + const { isInitialized, data } = React.useContext(HighlightedContext); + + if (!isInitialized) { + throw new Error( + [ + 'MUI X: Could not find the highlighted ref context.', + 'It looks like you rendered your component outside of a ChartsContainer parent component.', + ].join('\n'), + ); + } + + return data; +} diff --git a/packages/x-charts/src/context/HighlightedProvider/useItemHighlighted.ts b/packages/x-charts/src/context/HighlightedProvider/useItemHighlighted.ts new file mode 100644 index 000000000000..c6465231cf19 --- /dev/null +++ b/packages/x-charts/src/context/HighlightedProvider/useItemHighlighted.ts @@ -0,0 +1,38 @@ +import { HighlightItemData } from './HighlightedContext'; +import { useHighlighted } from './useHighlighted'; + +export type ItemHighlightedState = { + /** + * Whether the item is highlighted. + */ + isHighlighted: boolean; + /** + * Whether the item is faded. + */ + isFaded: boolean; +}; + +/** + * A hook to check the highlighted state of the item. + * This function already calculates that an item is not faded if it is highlighted. + * + * If you need fine control over the state, use the `useHighlighted` hook instead. + * + * @param {HighlightItemData} item is the item to check + * @returns {ItemHighlightedState} the state of the item + */ +export function useItemHighlighted(item: HighlightItemData | null): ItemHighlightedState { + const highlighted = useHighlighted(); + + if (!item) { + return { + isHighlighted: false, + isFaded: false, + }; + } + + const isHighlighted = highlighted.isHighlighted(item); + const isFaded = !isHighlighted && highlighted.isFaded(item); + + return { isHighlighted, isFaded }; +} diff --git a/packages/x-charts/src/context/SeriesContextProvider.tsx b/packages/x-charts/src/context/SeriesContextProvider.tsx index e39746611bd4..05ee76e3bf28 100644 --- a/packages/x-charts/src/context/SeriesContextProvider.tsx +++ b/packages/x-charts/src/context/SeriesContextProvider.tsx @@ -1,9 +1,5 @@ import * as React from 'react'; import { useTheme } from '@mui/material/styles'; -import barSeriesFormatter from '../BarChart/formatter'; -import scatterSeriesFormatter from '../ScatterChart/formatter'; -import lineSeriesFormatter from '../LineChart/formatter'; -import pieSeriesFormatter from '../PieChart/formatter'; import { AllSeriesType } from '../models/seriesType'; import { defaultizeColor } from '../internals/defaultizeColor'; import { @@ -13,38 +9,48 @@ import { FormatterResult, } from '../models/seriesType/config'; import { ChartsColorPalette, blueberryTwilightPalette } from '../colorPalettes'; +import { Initializable } from './context.types'; -export type SeriesContextProviderProps = { +export type SeriesFormatterType<T extends ChartSeriesType> = ( + series: AllSeriesType<T>[], + colors: string[], + dataset?: DatasetType, +) => { [type in T]?: FormatterResult<type> }; + +export type SeriesContextProviderProps<T extends ChartSeriesType = ChartSeriesType> = { dataset?: DatasetType; /** * The array of series to display. * Each type of series has its own specificity. * Please refer to the appropriate docs page to learn more about it. */ - series: AllSeriesType[]; + series: AllSeriesType<T>[]; /** * Color palette used to colorize multiple series. * @default blueberryTwilightPalette */ colors?: ChartsColorPalette; + /** + * Preprocessors for each series types. + */ + seriesFormatters: SeriesFormatterConfig<T>; children: React.ReactNode; }; export type FormattedSeries = { [type in ChartSeriesType]?: FormatterResult<type> }; -export const SeriesContext = React.createContext<FormattedSeries>({}); +export const SeriesContext = React.createContext<Initializable<FormattedSeries>>({ + isInitialized: false, + data: {}, +}); if (process.env.NODE_ENV !== 'production') { SeriesContext.displayName = 'SeriesContext'; } -const seriesTypeFormatter: { - [type in ChartSeriesType]?: (series: any, dataset?: DatasetType) => any; -} = { - bar: barSeriesFormatter, - scatter: scatterSeriesFormatter, - line: lineSeriesFormatter, - pie: pieSeriesFormatter, +export type SeriesFormatterConfig<T extends ChartSeriesType = ChartSeriesType> = { + // TODO replace the function type by Formatter<K> + [K in T]?: (series: FormatterParams<K>, dataset?: DatasetType) => any; }; /** @@ -55,7 +61,12 @@ const seriesTypeFormatter: { * @param colors The color palette used to defaultize series colors * @returns An object structuring all the series by type. */ -const formatSeries = (series: AllSeriesType[], colors: string[], dataset?: DatasetType) => { +const preprocessSeries = <T extends ChartSeriesType>( + series: AllSeriesType<T>[], + colors: string[], + seriesFormatters: SeriesFormatterConfig<T>, + dataset?: DatasetType, +) => { // Group series by type const seriesGroups: { [type in ChartSeriesType]?: FormatterParams<type> } = {}; series.forEach((seriesData, seriesIndex: number) => { @@ -77,29 +88,32 @@ const formatSeries = (series: AllSeriesType[], colors: string[], dataset?: Datas const formattedSeries: FormattedSeries = {}; // Apply formatter on a type group - (Object.keys(seriesTypeFormatter) as ChartSeriesType[]).forEach((type) => { - if (seriesGroups[type] !== undefined) { - formattedSeries[type] = - seriesTypeFormatter[type]?.(seriesGroups[type], dataset) ?? seriesGroups[type]; + (Object.keys(seriesFormatters) as T[]).forEach((type) => { + const group = seriesGroups[type]; + if (group !== undefined) { + formattedSeries[type] = seriesFormatters[type]?.(group, dataset) ?? seriesGroups[type]; } }); return formattedSeries; }; -function SeriesContextProvider(props: SeriesContextProviderProps) { - const { series, dataset, colors = blueberryTwilightPalette, children } = props; +function SeriesContextProvider<T extends ChartSeriesType>(props: SeriesContextProviderProps<T>) { + const { series, dataset, colors = blueberryTwilightPalette, seriesFormatters, children } = props; const theme = useTheme(); const formattedSeries = React.useMemo( - () => - formatSeries( + () => ({ + isInitialized: true, + data: preprocessSeries( series, typeof colors === 'function' ? colors(theme.palette.mode) : colors, + seriesFormatters, dataset as DatasetType<number>, ), - [series, colors, theme.palette.mode, dataset], + }), + [series, colors, theme.palette.mode, seriesFormatters, dataset], ); return <SeriesContext.Provider value={formattedSeries}>{children}</SeriesContext.Provider>; diff --git a/packages/x-charts/src/context/ZAxisContextProvider.tsx b/packages/x-charts/src/context/ZAxisContextProvider.tsx index 7edd82affe06..fa24fd59a979 100644 --- a/packages/x-charts/src/context/ZAxisContextProvider.tsx +++ b/packages/x-charts/src/context/ZAxisContextProvider.tsx @@ -85,7 +85,7 @@ function ZAxisContextProvider(props: ZAxisContextProviderProps) { ZAxisContextProvider.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, /** diff --git a/packages/x-charts/src/context/context.types.ts b/packages/x-charts/src/context/context.types.ts new file mode 100644 index 000000000000..16af92f28381 --- /dev/null +++ b/packages/x-charts/src/context/context.types.ts @@ -0,0 +1,4 @@ +export type Initializable<T> = { + isInitialized: boolean; + data: T; +}; diff --git a/packages/x-charts/src/context/index.ts b/packages/x-charts/src/context/index.ts index b2c53e2bb04f..a5cb93cdb90d 100644 --- a/packages/x-charts/src/context/index.ts +++ b/packages/x-charts/src/context/index.ts @@ -1,3 +1,3 @@ -export type { HighlightOptions, FadeOptions, HighlightScope } from './HighlightProvider'; +export * from './HighlightedProvider'; export { ZAxisContextProvider } from './ZAxisContextProvider'; export type { ZAxisContextProviderProps } from './ZAxisContextProvider'; diff --git a/packages/x-charts/src/hooks/index.ts b/packages/x-charts/src/hooks/index.ts index c052b357e379..148bf66d030b 100644 --- a/packages/x-charts/src/hooks/index.ts +++ b/packages/x-charts/src/hooks/index.ts @@ -1,6 +1,7 @@ export * from './useDrawingArea'; export * from './useChartId'; export * from './useScale'; +export * from './useColorScale'; export * from './useSvgRef'; export { useSeries as unstable_useSeries, diff --git a/packages/x-charts/src/hooks/useColor.ts b/packages/x-charts/src/hooks/useColor.ts new file mode 100644 index 000000000000..c124c75cd796 --- /dev/null +++ b/packages/x-charts/src/hooks/useColor.ts @@ -0,0 +1,18 @@ +import * as React from 'react'; +import { ChartSeriesType } from '../internals'; +import { ColorContext } from '../context/ColorProvider'; +import { ColorProcessorsConfig } from '../models/plugin'; + +export function useColorProcessor<T extends ChartSeriesType>( + seriesType: T, +): ColorProcessorsConfig<ChartSeriesType>; +export function useColorProcessor(): ColorProcessorsConfig<ChartSeriesType>; +export function useColorProcessor(seriesType?: ChartSeriesType) { + const colorProcessors = React.useContext(ColorContext); + + if (!seriesType) { + return colorProcessors; + } + + return colorProcessors[seriesType]; +} diff --git a/packages/x-charts/src/hooks/useColorScale.ts b/packages/x-charts/src/hooks/useColorScale.ts new file mode 100644 index 000000000000..947d2acbd6de --- /dev/null +++ b/packages/x-charts/src/hooks/useColorScale.ts @@ -0,0 +1,34 @@ +import * as React from 'react'; +import { CartesianContext } from '../context/CartesianContextProvider'; +import { AxisScaleComputedConfig, ScaleName } from '../models/axis'; +import { ZAxisContext } from '../context/ZAxisContextProvider'; + +export function useXColorScale<S extends ScaleName>( + identifier?: number | string, +): AxisScaleComputedConfig[S]['colorScale'] | undefined { + const { xAxis, xAxisIds } = React.useContext(CartesianContext); + + const id = typeof identifier === 'string' ? identifier : xAxisIds[identifier ?? 0]; + + return xAxis[id].colorScale; +} + +export function useYColorScale<S extends ScaleName>( + identifier?: number | string, +): AxisScaleComputedConfig[S]['colorScale'] | undefined { + const { yAxis, yAxisIds } = React.useContext(CartesianContext); + + const id = typeof identifier === 'string' ? identifier : yAxisIds[identifier ?? 0]; + + return yAxis[id].colorScale; +} + +export function useZColorScale<S extends ScaleName>( + identifier?: number | string, +): AxisScaleComputedConfig[S]['colorScale'] | undefined { + const { zAxis, zAxisIds } = React.useContext(ZAxisContext); + + const id = typeof identifier === 'string' ? identifier : zAxisIds[identifier ?? 0]; + + return zAxis[id]?.colorScale; +} diff --git a/packages/x-charts/src/hooks/useInteractionItemProps.ts b/packages/x-charts/src/hooks/useInteractionItemProps.ts index 0799a82c42e8..07d9dc7dccbd 100644 --- a/packages/x-charts/src/hooks/useInteractionItemProps.ts +++ b/packages/x-charts/src/hooks/useInteractionItemProps.ts @@ -1,11 +1,11 @@ import * as React from 'react'; import { InteractionContext } from '../context/InteractionProvider'; -import { HighlighContext, HighlightScope } from '../context/HighlightProvider'; import { SeriesItemIdentifier } from '../models'; +import { useHighlighted } from '../context'; -export const useInteractionItemProps = (scope?: Partial<HighlightScope>, skip?: boolean) => { +export const useInteractionItemProps = (skip?: boolean) => { const { dispatch: dispatchInteraction } = React.useContext(InteractionContext); - const { dispatch: dispatchHighlight } = React.useContext(HighlighContext); + const { setHighlighted, clearHighlighted } = useHighlighted(); if (skip) { return () => ({}); @@ -16,19 +16,14 @@ export const useInteractionItemProps = (scope?: Partial<HighlightScope>, skip?: type: 'enterItem', data, }); - dispatchHighlight({ - type: 'enterItem', - item: data, - scope, + setHighlighted({ + seriesId: data.seriesId, + dataIndex: data.dataIndex, }); }; const onMouseLeave = () => { dispatchInteraction({ type: 'leaveItem', data }); - - dispatchHighlight({ - type: 'leaveItem', - item: data, - }); + clearHighlighted(); }; return { onMouseEnter, @@ -37,54 +32,3 @@ export const useInteractionItemProps = (scope?: Partial<HighlightScope>, skip?: }; return getInteractionItemProps; }; - -export const getIsHighlighted = ( - selectedItem: SeriesItemIdentifier | null, - currentItem: SeriesItemIdentifier, - highlightScope?: Partial<HighlightScope>, -) => { - if ( - !highlightScope?.highlighted || - highlightScope.highlighted === 'none' || - selectedItem === null - ) { - return false; - } - - const isSeriesSelected = - selectedItem.type === currentItem.type && selectedItem.seriesId === currentItem.seriesId; - - if (!isSeriesSelected) { - return false; - } - - if (highlightScope.highlighted === 'series') { - return isSeriesSelected; - } - - return selectedItem.dataIndex !== undefined && selectedItem.dataIndex === currentItem.dataIndex; -}; - -export const getIsFaded = ( - selectedItem: SeriesItemIdentifier | null, - currentItem: SeriesItemIdentifier, - highlightScope?: Partial<HighlightScope>, -) => { - if (!highlightScope?.faded || highlightScope.faded === 'none' || selectedItem === null) { - return false; - } - - const isSeriesSelected = - selectedItem.type === currentItem.type && selectedItem.seriesId === currentItem.seriesId; - - if (highlightScope.faded === 'series') { - return isSeriesSelected && selectedItem.dataIndex !== currentItem.dataIndex; - } - if (highlightScope.faded === 'global') { - if (!isSeriesSelected) { - return true; - } - return selectedItem.dataIndex !== undefined && selectedItem.dataIndex !== currentItem.dataIndex; - } - return false; -}; diff --git a/packages/x-charts/src/hooks/useSeries.test.tsx b/packages/x-charts/src/hooks/useSeries.test.tsx new file mode 100644 index 000000000000..0e2d247a0b40 --- /dev/null +++ b/packages/x-charts/src/hooks/useSeries.test.tsx @@ -0,0 +1,55 @@ +import * as React from 'react'; +import { expect } from 'chai'; +import { ErrorBoundary, createRenderer } from '@mui/internal-test-utils'; +import { useSeries } from './useSeries'; +import barFormatter from '../BarChart/formatter'; +import { SeriesContextProvider } from '../context/SeriesContextProvider'; + +function UseSeries() { + const { bar } = useSeries(); + return <div>{bar?.series['test-id']?.id}</div>; +} + +describe('useSeries', () => { + const { render } = createRenderer(); + + it('should throw an error when parent context not present', function test() { + if (!/jsdom/.test(window.navigator.userAgent)) { + // can't catch render errors in the browser for unknown reason + // tried try-catch + error boundary + window onError preventDefault + this.skip(); + } + + const errorRef = React.createRef<any>(); + + expect(() => + render( + <ErrorBoundary ref={errorRef}> + <UseSeries /> + </ErrorBoundary>, + ), + ).toErrorDev([ + 'MUI X: Could not find the series ref context.', + 'It looks like you rendered your component outside of a ChartsContainer parent component.', + 'The above error occurred in the <UseSeries> component:', + ]); + + expect((errorRef.current as any).errors).to.have.length(1); + expect((errorRef.current as any).errors[0].toString()).to.include( + 'MUI X: Could not find the series ref context.', + ); + }); + + it('should not throw an error when parent context is present', () => { + const { getByText } = render( + <SeriesContextProvider + series={[{ type: 'bar', id: 'test-id', data: [1, 2] }]} + seriesFormatters={{ bar: barFormatter }} + > + <UseSeries /> + </SeriesContextProvider>, + ); + + expect(getByText('test-id')).toBeVisible(); + }); +}); diff --git a/packages/x-charts/src/hooks/useSeries.ts b/packages/x-charts/src/hooks/useSeries.ts index 12817cb944eb..4b4d7fa6e079 100644 --- a/packages/x-charts/src/hooks/useSeries.ts +++ b/packages/x-charts/src/hooks/useSeries.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { SeriesContext } from '../context/SeriesContextProvider'; +import { FormattedSeries, SeriesContext } from '../context/SeriesContextProvider'; /** * Get access to the internal state of series. @@ -7,10 +7,10 @@ import { SeriesContext } from '../context/SeriesContextProvider'; * { seriesType?: { series: { id1: precessedValue, ... }, seriesOrder: [id1, ...] } } * @returns FormattedSeries series */ -export function useSeries() { - const series = React.useContext(SeriesContext); +export function useSeries(): FormattedSeries { + const { isInitialized, data } = React.useContext(SeriesContext); - if (series === undefined) { + if (!isInitialized) { throw new Error( [ 'MUI X: Could not find the series ref context.', @@ -19,7 +19,7 @@ export function useSeries() { ); } - return series; + return data; } /** @@ -29,7 +29,7 @@ export function useSeries() { * - seriesOrder: the array of series ids. * @returns { series: Record<SeriesId, DefaultizedPieSeriesType>; seriesOrder: SeriesId[]; } | undefined pieSeries */ -export function usePieSeries() { +export function usePieSeries(): FormattedSeries['pie'] { const series = useSeries(); return React.useMemo(() => series.pie, [series.pie]); @@ -42,7 +42,7 @@ export function usePieSeries() { * - seriesOrder: the array of series ids. * @returns { series: Record<SeriesId, DefaultizedLineSeriesType>; seriesOrder: SeriesId[]; } | undefined lineSeries */ -export function useLineSeries() { +export function useLineSeries(): FormattedSeries['line'] { const series = useSeries(); return React.useMemo(() => series.line, [series.line]); @@ -55,7 +55,7 @@ export function useLineSeries() { * - seriesOrder: the array of series ids. * @returns { series: Record<SeriesId, DefaultizedBarSeriesType>; seriesOrder: SeriesId[]; } | undefined barSeries */ -export function useBarSeries() { +export function useBarSeries(): FormattedSeries['bar'] { const series = useSeries(); return React.useMemo(() => series.bar, [series.bar]); @@ -68,7 +68,7 @@ export function useBarSeries() { * - seriesOrder: the array of series ids. * @returns { series: Record<SeriesId, DefaultizedScatterSeriesType>; seriesOrder: SeriesId[]; } | undefined scatterSeries */ -export function useScatterSeries() { +export function useScatterSeries(): FormattedSeries['scatter'] { const series = useSeries(); return React.useMemo(() => series.scatter, [series.scatter]); diff --git a/packages/x-charts/src/hooks/useSvgRef.test.tsx b/packages/x-charts/src/hooks/useSvgRef.test.tsx new file mode 100644 index 000000000000..a61113fa1e8d --- /dev/null +++ b/packages/x-charts/src/hooks/useSvgRef.test.tsx @@ -0,0 +1,62 @@ +import * as React from 'react'; +import { expect } from 'chai'; +import { ErrorBoundary, createRenderer } from '@mui/internal-test-utils'; +import { useSvgRef } from './useSvgRef'; +import { DrawingProvider } from '../context/DrawingProvider'; + +function UseSvgRef() { + const ref = useSvgRef(); + return <div>{ref.current?.id}</div>; +} + +describe('useSvgRef', () => { + const { render } = createRenderer(); + + it('should throw an error when parent context not present', function test() { + if (!/jsdom/.test(window.navigator.userAgent)) { + // can't catch render errors in the browser for unknown reason + // tried try-catch + error boundary + window onError preventDefault + this.skip(); + } + + const errorRef = React.createRef<any>(); + + expect(() => + render( + <ErrorBoundary ref={errorRef}> + <UseSvgRef /> + </ErrorBoundary>, + ), + ).toErrorDev([ + 'MUI X: Could not find the svg ref context.', + 'It looks like you rendered your component outside of a ChartsContainer parent component.', + 'The above error occurred in the <UseSvgRef> component:', + ]); + + expect((errorRef.current as any).errors).to.have.length(1); + expect((errorRef.current as any).errors[0].toString()).to.include( + 'MUI X: Could not find the svg ref context.', + ); + }); + + it('should not throw an error when parent context is present', async () => { + function RenderDrawingProvider() { + const ref = React.useRef<SVGSVGElement | null>(null); + + return ( + <svg ref={ref} id="test-id"> + <DrawingProvider svgRef={ref} width={1} height={1}> + <UseSvgRef /> + </DrawingProvider> + </svg> + ); + } + + const { findByText, forceUpdate } = render(<RenderDrawingProvider />); + + // Ref is not available on first render. + forceUpdate(); + + expect(await findByText('test-id')).toBeVisible(); + }); +}); diff --git a/packages/x-charts/src/hooks/useSvgRef.ts b/packages/x-charts/src/hooks/useSvgRef.ts index 268222985047..d2540807afa6 100644 --- a/packages/x-charts/src/hooks/useSvgRef.ts +++ b/packages/x-charts/src/hooks/useSvgRef.ts @@ -2,9 +2,9 @@ import * as React from 'react'; import { SvgContext } from '../context/DrawingProvider'; export function useSvgRef(): React.MutableRefObject<SVGSVGElement> { - const svgRef = React.useContext(SvgContext); + const { isInitialized, data } = React.useContext(SvgContext); - if (svgRef === undefined) { + if (!isInitialized) { throw new Error( [ 'MUI X: Could not find the svg ref context.', @@ -13,5 +13,5 @@ export function useSvgRef(): React.MutableRefObject<SVGSVGElement> { ); } - return svgRef as React.MutableRefObject<SVGSVGElement>; + return data as React.MutableRefObject<SVGSVGElement>; } diff --git a/packages/x-charts/src/hooks/useTicks.ts b/packages/x-charts/src/hooks/useTicks.ts index 2e861a33c88e..8049ebe780d1 100644 --- a/packages/x-charts/src/hooks/useTicks.ts +++ b/packages/x-charts/src/hooks/useTicks.ts @@ -21,10 +21,12 @@ export interface TickParams { */ tickNumber?: number; /** - * Defines which ticks are displayed. Its value can be: + * Defines which ticks are displayed. + * Its value can be: * - 'auto' In such case the ticks are computed based on axis scale and other parameters. - * - a filtering function of the form `(value, index) => boolean` which is available only if the axis has a data property. + * - a filtering function of the form `(value, index) => boolean` which is available only if the axis has "point" scale. * - an array containing the values where ticks should be displayed. + * @see See {@link https://mui.com/x/react-charts/axis/#fixed-tick-positions} * @default 'auto' */ tickInterval?: 'auto' | ((value: any, index: number) => boolean) | any[]; diff --git a/packages/x-charts/src/internals/colorGetter.ts b/packages/x-charts/src/internals/colorGetter.ts deleted file mode 100644 index 0b022ff91e25..000000000000 --- a/packages/x-charts/src/internals/colorGetter.ts +++ /dev/null @@ -1,58 +0,0 @@ -import getBarColor from '../BarChart/getColor'; -import getLineColor from '../LineChart/getColor'; -import getScatterColor from '../ScatterChart/getColor'; -import getPieColor from '../PieChart/getColor'; -import { - DefaultizedBarSeriesType, - DefaultizedLineSeriesType, - DefaultizedPieSeriesType, - DefaultizedScatterSeriesType, -} from '../models'; -import { AxisDefaultized } from '../models/axis'; -import { ZAxisDefaultized } from '../models/z-axis'; - -function getColor(series: DefaultizedPieSeriesType): (dataIndex: number) => string; -function getColor( - series: DefaultizedBarSeriesType | DefaultizedLineSeriesType, - xAxis: AxisDefaultized, - yAxis: AxisDefaultized, -): (dataIndex: number) => string; -function getColor( - series: DefaultizedScatterSeriesType, - xAxis: AxisDefaultized, - yAxis: AxisDefaultized, - zAxis?: ZAxisDefaultized, -): (dataIndex: number) => string; -function getColor( - series: - | DefaultizedBarSeriesType - | DefaultizedLineSeriesType - | DefaultizedScatterSeriesType - | DefaultizedPieSeriesType, - xAxis?: AxisDefaultized, - yAxis?: AxisDefaultized, - zAxis?: ZAxisDefaultized, -): (dataIndex: number) => string { - if (xAxis !== undefined && yAxis !== undefined) { - if (series.type === 'bar') { - return getBarColor(series, xAxis, yAxis); - } - - if (series.type === 'line') { - return getLineColor(series, xAxis, yAxis); - } - - if (series.type === 'scatter') { - return getScatterColor(series, xAxis, yAxis, zAxis); - } - } - if (series.type === 'pie') { - return getPieColor(series); - } - - throw Error( - `MUI X Charts: getColor called with unexpected arguments for series with id "${series.id}"`, - ); -} - -export default getColor; diff --git a/packages/x-charts/src/internals/configInit.ts b/packages/x-charts/src/internals/configInit.ts new file mode 100644 index 000000000000..228d641b73d6 --- /dev/null +++ b/packages/x-charts/src/internals/configInit.ts @@ -0,0 +1,28 @@ +import { ChartSeriesType } from '../models/seriesType/config'; + +let instance: undefined | Set<ChartSeriesType>; + +class CartesianSeriesTypes { + types: Set<ChartSeriesType> = new Set(); + + constructor() { + if (instance) { + throw new Error('You can only create one instance!'); + } + instance = this.types; + } + + addType(value: ChartSeriesType) { + this.types.add(value); + } + + getTypes() { + return this.types; + } +} + +export const cartesianSeriesTypes = new CartesianSeriesTypes(); + +cartesianSeriesTypes.addType('bar'); +cartesianSeriesTypes.addType('line'); +cartesianSeriesTypes.addType('scatter'); diff --git a/packages/x-charts/src/internals/defaultizeValueFormatter.ts b/packages/x-charts/src/internals/defaultizeValueFormatter.ts index b9fa91ba8810..22b7040e0f1c 100644 --- a/packages/x-charts/src/internals/defaultizeValueFormatter.ts +++ b/packages/x-charts/src/internals/defaultizeValueFormatter.ts @@ -1,6 +1,6 @@ import { SeriesId, SeriesValueFormatter } from '../models/seriesType/common'; -function defaultizeValueFormatter< +export function defaultizeValueFormatter< TValue, ISeries extends { valueFormatter?: SeriesValueFormatter<TValue> }, >( @@ -19,5 +19,3 @@ function defaultizeValueFormatter< }); return defaultizedSeries; } - -export default defaultizeValueFormatter; diff --git a/packages/x-charts/src/internals/index.ts b/packages/x-charts/src/internals/index.ts new file mode 100644 index 000000000000..65de6514097d --- /dev/null +++ b/packages/x-charts/src/internals/index.ts @@ -0,0 +1,26 @@ +// Components +export * from './components/ChartsAxesGradients'; + +// hooks +export { useReducedMotion } from '../hooks/useReducedMotion'; +export { useSeries } from '../hooks/useSeries'; + +// utils +export * from './defaultizeValueFormatter'; +export * from './configInit'; + +// contexts + +export * from '../context/CartesianContextProvider'; +export * from '../context/DrawingProvider'; +export * from '../context/InteractionProvider'; +export * from '../context/SeriesContextProvider'; +export * from '../context/ZAxisContextProvider'; + +// series configuration +export * from '../models/seriesType/config'; +export * from '../models/seriesType/common'; + +export * from '../models/helpers'; +export * from '../models/z-axis'; +export * from '../models/axis'; diff --git a/packages/x-charts/src/internals/isCartesian.ts b/packages/x-charts/src/internals/isCartesian.ts new file mode 100644 index 000000000000..1b3fb9f19e1c --- /dev/null +++ b/packages/x-charts/src/internals/isCartesian.ts @@ -0,0 +1,21 @@ +import { + ChartSeriesType, + CartesianChartSeriesType, + ChartSeriesDefaultized, +} from '../models/seriesType/config'; +import { cartesianSeriesTypes } from './configInit'; + +export function isCartesianSeriesType(seriesType: string): seriesType is CartesianChartSeriesType { + return cartesianSeriesTypes.getTypes().has(seriesType as ChartSeriesType); +} + +export function isCartesianSeries( + series: ChartSeriesDefaultized<ChartSeriesType> & { getColor: (dataIndex: number) => string }, +): series is ChartSeriesDefaultized<CartesianChartSeriesType> & { + getColor: (dataIndex: number) => string; +}; +export function isCartesianSeries( + series: ChartSeriesDefaultized<ChartSeriesType>, +): series is ChartSeriesDefaultized<CartesianChartSeriesType> { + return isCartesianSeriesType(series.type); +} diff --git a/packages/x-charts/src/models/axis.ts b/packages/x-charts/src/models/axis.ts index cb6b11300956..2ca13a4836ff 100644 --- a/packages/x-charts/src/models/axis.ts +++ b/packages/x-charts/src/models/axis.ts @@ -214,7 +214,7 @@ export interface AxisScaleConfig { }; } -interface AxisScaleComputedConfig { +export interface AxisScaleComputedConfig { band: { colorScale?: | ScaleOrdinal<string | number | Date, string, string | null> @@ -261,7 +261,11 @@ export type AxisValueFormatterContext = { location: 'tick' | 'tooltip'; }; -export type AxisConfig<S extends ScaleName = ScaleName, V = any> = { +export type AxisConfig< + S extends ScaleName = ScaleName, + V = any, + AxisProps = ChartsXAxisProps | ChartsYAxisProps, +> = { /** * Id used to identify the axis. */ @@ -299,14 +303,15 @@ export type AxisConfig<S extends ScaleName = ScaleName, V = any> = { * If `true`, Reverse the axis scaleBand. */ reverse?: boolean; -} & Partial<ChartsXAxisProps | ChartsYAxisProps> & +} & Partial<AxisProps> & Partial<Omit<AxisScaleConfig[S], 'scale'>> & TickParams; -export type AxisDefaultized<S extends ScaleName = ScaleName, V = any> = Omit< - AxisConfig<S, V>, - 'scaleType' -> & +export type AxisDefaultized< + S extends ScaleName = ScaleName, + V = any, + AxisProps = ChartsXAxisProps | ChartsYAxisProps, +> = Omit<AxisConfig<S, V, AxisProps>, 'scaleType'> & AxisScaleConfig[S] & AxisScaleComputedConfig[S] & { /** diff --git a/packages/x-charts/src/models/index.ts b/packages/x-charts/src/models/index.ts index abb5d36002f6..9f82bffa3f6a 100644 --- a/packages/x-charts/src/models/index.ts +++ b/packages/x-charts/src/models/index.ts @@ -1,6 +1,7 @@ export * from './seriesType'; export * from './layout'; export * from './stacking'; +export * from './plugin'; export type { AxisConfig, ChartsYAxisProps, diff --git a/packages/x-charts/src/models/plugin.ts b/packages/x-charts/src/models/plugin.ts new file mode 100644 index 000000000000..a8b4dd5287e5 --- /dev/null +++ b/packages/x-charts/src/models/plugin.ts @@ -0,0 +1,25 @@ +import { ChartSeriesType, ExtremumGetter, Formatter } from './seriesType/config'; +import { AxisDefaultized } from './axis'; +import { DefaultizedSeriesType } from './seriesType'; +import { ZAxisDefaultized } from './z-axis'; + +type ColorProcessor<T extends ChartSeriesType> = ( + series: DefaultizedSeriesType<T>, + xAxis?: AxisDefaultized, + yAxis?: AxisDefaultized, + zAxis?: ZAxisDefaultized, +) => (dataIndex: number) => string; + +export type ColorProcessorsConfig<T extends ChartSeriesType> = { + [Key in T]?: ColorProcessor<Key>; +}; + +export type ChartsPluginType<T> = T extends ChartSeriesType + ? { + seriesType: T; + seriesFormatter: Formatter<T>; + colorProcessor: ColorProcessor<T>; + xExtremumGetter?: ExtremumGetter<T>; + yExtremumGetter?: ExtremumGetter<T>; + } + : never; diff --git a/packages/x-charts/src/models/seriesType/common.ts b/packages/x-charts/src/models/seriesType/common.ts index 830d3e7add0c..d9c4212fe56f 100644 --- a/packages/x-charts/src/models/seriesType/common.ts +++ b/packages/x-charts/src/models/seriesType/common.ts @@ -1,4 +1,4 @@ -import type { HighlightScope } from '../../context/HighlightProvider'; +import type { HighlightScope } from '../../context'; import type { StackOffsetType, StackOrderType } from '../stacking'; export type SeriesId = number | string; @@ -25,6 +25,9 @@ export type CommonSeriesType<TValue> = { * @returns {string} The string to display. */ valueFormatter?: SeriesValueFormatter<TValue>; + /** + * The scope to apply when the series is highlighted. + */ highlightScope?: Partial<HighlightScope>; }; diff --git a/packages/x-charts/src/models/seriesType/config.ts b/packages/x-charts/src/models/seriesType/config.ts index 608962f6af70..6ae2346499c8 100644 --- a/packages/x-charts/src/models/seriesType/config.ts +++ b/packages/x-charts/src/models/seriesType/config.ts @@ -7,35 +7,64 @@ import { DefaultizedProps, MakeOptional } from '../helpers'; import { StackingGroupsType } from '../../internals/stackSeries'; import { SeriesId } from './common'; -interface ChartsSeriesConfig { +export interface ChartsSeriesConfig { bar: { + /** + * Series type when passed to the formatter (some ids are given default values to simplify the DX) + */ seriesInput: DefaultizedProps<BarSeriesType, 'id'> & { color: string }; + /** + * Series type when stored in the context (with all the preprocessing added)) + */ series: DefaultizedBarSeriesType; - canBeStacked: true; + /** + * Series typing such that the one user need to provide + */ + seriesProp: BarSeriesType; itemIdentifier: BarItemIdentifier; + canBeStacked: true; + cartesian: true; }; line: { seriesInput: DefaultizedProps<LineSeriesType, 'id'> & { color: string }; series: DefaultizedLineSeriesType; - canBeStacked: true; + seriesProp: LineSeriesType; itemIdentifier: LineItemIdentifier; + canBeStacked: true; + cartesian: true; }; scatter: { seriesInput: DefaultizedProps<ScatterSeriesType, 'id'> & { color: string }; series: DefaultizedScatterSeriesType; + seriesProp: ScatterSeriesType; itemIdentifier: ScatterItemIdentifier; + cartesian: true; }; pie: { seriesInput: Omit<DefaultizedProps<PieSeriesType, 'id'>, 'data'> & { data: (MakeOptional<PieValueType, 'id'> & { color: string })[]; }; series: DefaultizedPieSeriesType; + seriesProp: PieSeriesType<MakeOptional<PieValueType, 'id'>>; itemIdentifier: PieItemIdentifier; }; } -export type CartesianChartSeriesType = 'bar' | 'line' | 'scatter'; -export type ChartSeriesType = 'bar' | 'line' | 'scatter' | 'pie'; +export type ChartSeriesType = keyof ChartsSeriesConfig; + +export type CartesianChartSeriesType = keyof Pick< + ChartsSeriesConfig, + { + [Key in ChartSeriesType]: ChartsSeriesConfig[Key] extends { cartesian: true } ? Key : never; + }[ChartSeriesType] +>; + +export type StackableChartSeriesType = keyof Pick< + ChartsSeriesConfig, + { + [Key in ChartSeriesType]: ChartsSeriesConfig[Key] extends { canBeStacked: true } ? Key : never; + }[ChartSeriesType] +>; export type ChartSeries<T extends ChartSeriesType> = ChartsSeriesConfig[T] extends { canBeStacked: true; diff --git a/packages/x-charts/src/models/seriesType/index.ts b/packages/x-charts/src/models/seriesType/index.ts index c6c848eb9165..70dbfedf195a 100644 --- a/packages/x-charts/src/models/seriesType/index.ts +++ b/packages/x-charts/src/models/seriesType/index.ts @@ -1,31 +1,29 @@ -import { BarItemIdentifier, BarSeriesType, DefaultizedBarSeriesType } from './bar'; -import { DefaultizedLineSeriesType, LineItemIdentifier, LineSeriesType } from './line'; -import { DefaultizedScatterSeriesType, ScatterItemIdentifier, ScatterSeriesType } from './scatter'; -import { DefaultizedPieSeriesType, PieSeriesType, PieItemIdentifier, PieValueType } from './pie'; -import { MakeOptional } from '../helpers'; +import { BarSeriesType, DefaultizedBarSeriesType } from './bar'; +import { + CartesianChartSeriesType, + ChartSeriesType, + ChartsSeriesConfig, + StackableChartSeriesType, +} from './config'; -type AllSeriesType = - | BarSeriesType - | LineSeriesType - | ScatterSeriesType - | PieSeriesType<MakeOptional<PieValueType, 'id'>>; +// Series definition -type CartesianSeriesType = BarSeriesType | LineSeriesType | ScatterSeriesType; +type AllSeriesType<T extends ChartSeriesType = ChartSeriesType> = + ChartsSeriesConfig[T]['seriesProp']; -type DefaultizedCartesianSeriesType = - | DefaultizedBarSeriesType - | DefaultizedLineSeriesType - | DefaultizedScatterSeriesType; +type CartesianSeriesType = AllSeriesType<CartesianChartSeriesType>; -type DefaultizedSeriesType = DefaultizedCartesianSeriesType | DefaultizedPieSeriesType; +type DefaultizedSeriesType<T extends ChartSeriesType = ChartSeriesType> = + ChartsSeriesConfig[T]['series']; -type StackableSeriesType = DefaultizedBarSeriesType | DefaultizedLineSeriesType; +type DefaultizedCartesianSeriesType = DefaultizedSeriesType<CartesianChartSeriesType>; -export type SeriesItemIdentifier = - | BarItemIdentifier - | LineItemIdentifier - | ScatterItemIdentifier - | PieItemIdentifier; +type StackableSeriesType = DefaultizedSeriesType<StackableChartSeriesType>; + +// item identifier + +export type SeriesItemIdentifier<T extends ChartSeriesType = ChartSeriesType> = + ChartsSeriesConfig[T]['itemIdentifier']; export * from './line'; export * from './bar'; @@ -39,6 +37,8 @@ export type { StackableSeriesType, }; +// Helpers + export function isDefaultizedBarSeries( series: DefaultizedSeriesType, ): series is DefaultizedBarSeriesType { diff --git a/packages/x-charts/src/themeAugmentation/components.d.ts b/packages/x-charts/src/themeAugmentation/components.d.ts index 60862604ce60..c9cc3dd4f2fa 100644 --- a/packages/x-charts/src/themeAugmentation/components.d.ts +++ b/packages/x-charts/src/themeAugmentation/components.d.ts @@ -40,6 +40,10 @@ export interface ChartsComponents { defaultProps?: ComponentsProps['MuiBarElement']; styleOverrides?: ComponentsOverrides['MuiBarElement']; }; + MuiBarLabel?: { + defaultProps?: ComponentsProps['MuiBarLabel']; + styleOverrides?: ComponentsOverrides['MuiBarLabel']; + }; MuiLineChart?: { defaultProps?: ComponentsProps['MuiLineChart']; }; diff --git a/packages/x-charts/src/themeAugmentation/index.js b/packages/x-charts/src/themeAugmentation/index.js index 9eb356e20e39..cf3f797ea6e6 100644 --- a/packages/x-charts/src/themeAugmentation/index.js +++ b/packages/x-charts/src/themeAugmentation/index.js @@ -1 +1 @@ -// Prefer to use `import type {} from '@mui/x-date-pickers/themeAugmentation';` instead to avoid importing an empty file. +// Prefer to use `import type {} from '@mui/x-charts/themeAugmentation';` instead to avoid importing an empty file. diff --git a/packages/x-charts/src/themeAugmentation/overrides.d.ts b/packages/x-charts/src/themeAugmentation/overrides.d.ts index 3a1dc5e2891a..c2699e9f67d0 100644 --- a/packages/x-charts/src/themeAugmentation/overrides.d.ts +++ b/packages/x-charts/src/themeAugmentation/overrides.d.ts @@ -1,3 +1,4 @@ +import { BarLabelClassKey } from '../BarChart'; import { BarElementClassKey } from '../BarChart/BarElement'; import { ChartsAxisClassKey } from '../ChartsAxis'; import { ChartsAxisHighlightClassKey } from '../ChartsAxisHighlight'; @@ -16,6 +17,8 @@ export interface PickersComponentNameToClassKey { // BarChart components MuiBarElement: BarElementClassKey; + MuiBarLabel: BarLabelClassKey; + // LineChart components MuiAreaElement: AreaElementClassKey; diff --git a/packages/x-charts/src/themeAugmentation/props.d.ts b/packages/x-charts/src/themeAugmentation/props.d.ts index 207d4f9d69ca..0189a5b19e67 100644 --- a/packages/x-charts/src/themeAugmentation/props.d.ts +++ b/packages/x-charts/src/themeAugmentation/props.d.ts @@ -1,3 +1,4 @@ +import { BarLabelProps } from '../BarChart/BarLabel'; import { BarChartProps } from '../BarChart/BarChart'; import { BarElementProps } from '../BarChart/BarElement'; import { ChartsAxisProps } from '../ChartsAxis'; @@ -27,6 +28,7 @@ export interface ChartsComponentsPropsList { // BarChart components MuiBarChart: BarChartProps; MuiBarElement: BarElementProps; + MuiBarLabel: BarLabelProps; // LineChart components MuiLineChart: LineChartProps; MuiAreaElement: AreaElementProps; diff --git a/packages/x-charts/tsconfig.json b/packages/x-charts/tsconfig.json index b83e29b02231..96d9df1cf667 100644 --- a/packages/x-charts/tsconfig.json +++ b/packages/x-charts/tsconfig.json @@ -1,7 +1,13 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["mocha", "node", "@mui/material/themeCssVarsAugmentation"] + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha", + "node" + ] }, - "include": ["src/**/*", "../../test/utils/addChaiAssertions.ts"] + "include": ["src/**/*", "../../test/utils/addChaiAssertions.ts", "../../test/utils/init.ts"] } diff --git a/packages/x-codemod/package.json b/packages/x-codemod/package.json index aa81c0fdd999..8557de11576e 100644 --- a/packages/x-codemod/package.json +++ b/packages/x-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-codemod", - "version": "7.0.0", + "version": "7.6.0", "bin": "./codemod.js", "private": false, "author": "MUI Team", @@ -32,9 +32,9 @@ "url": "https://opencollective.com/mui-org" }, "dependencies": { - "@babel/core": "^7.24.5", - "@babel/runtime": "^7.24.5", - "@babel/traverse": "^7.24.5", + "@babel/core": "^7.24.6", + "@babel/runtime": "^7.24.6", + "@babel/traverse": "^7.24.6", "jscodeshift": "0.13.1", "jscodeshift-add-imports": "^1.0.10", "yargs": "^17.7.2" @@ -43,7 +43,7 @@ "@types/jscodeshift": "^0.11.5", "dayjs": "^1.11.11", "moment-timezone": "^0.5.45", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "sideEffects": false, "publishConfig": { diff --git a/packages/x-codemod/src/codemod.ts b/packages/x-codemod/src/codemod.ts index e98eb8f36edf..99580a0b38c9 100755 --- a/packages/x-codemod/src/codemod.ts +++ b/packages/x-codemod/src/codemod.ts @@ -3,7 +3,7 @@ import childProcess from 'child_process'; import { promises as fs } from 'fs'; import path from 'path'; -import yargs, { CommandModule } from 'yargs'; +import yargs, { ArgumentsCamelCase, CommandModule } from 'yargs'; const jscodeshiftPackage = require('jscodeshift/package.json'); @@ -86,7 +86,7 @@ interface HandlerArgv extends Flags { paths: string[]; } -function run(argv: yargs.ArgumentsCamelCase<HandlerArgv>) { +function run(argv: ArgumentsCamelCase<HandlerArgv>) { const { codemod, paths, _: other, jscodeshift, parser } = argv; return runTransform( @@ -97,7 +97,7 @@ function run(argv: yargs.ArgumentsCamelCase<HandlerArgv>) { ); } -yargs +yargs(process.argv.slice(2)) .command({ command: '$0 <codemod> <paths...>', describe: 'Applies a `@mui/x-codemod` to the specified paths', diff --git a/packages/x-codemod/tsconfig.json b/packages/x-codemod/tsconfig.json index 3371fcd2233c..8ed973501222 100644 --- a/packages/x-codemod/tsconfig.json +++ b/packages/x-codemod/tsconfig.json @@ -2,12 +2,14 @@ "extends": "../../tsconfig.json", "compilerOptions": { "types": [ - "mocha", - "node", + "@mui/internal-test-utils/initMatchers", "@mui/material/themeCssVarsAugmentation", - "dayjs/plugin/utc.d.ts", + "chai-dom", "dayjs/plugin/timezone.d.ts", - "moment-timezone" + "dayjs/plugin/utc.d.ts", + "mocha", + "moment-timezone", + "node" ], "noImplicitAny": false }, diff --git a/packages/x-data-grid-generator/package.json b/packages/x-data-grid-generator/package.json index 5c6b26b2b943..3dfd5ebd6dbf 100644 --- a/packages/x-data-grid-generator/package.json +++ b/packages/x-data-grid-generator/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid-generator", - "version": "7.5.0", + "version": "7.6.2", "description": "Generate fake data for demo purposes only.", "author": "MUI Team", "main": "src/index.ts", @@ -33,7 +33,7 @@ "directory": "packages/x-data-grid-generator" }, "dependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@mui/base": "^5.0.0-beta.40", "@mui/x-data-grid-premium": "workspace:*", "chance": "^1.1.11", @@ -43,7 +43,7 @@ "devDependencies": { "@types/chance": "^1.1.6", "@types/lru-cache": "^7.10.10", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "peerDependencies": { "@mui/icons-material": "^5.4.1", diff --git a/packages/x-data-grid-generator/src/hooks/useMovieData.ts b/packages/x-data-grid-generator/src/hooks/useMovieData.ts index 5ed750492030..7820a7471fde 100644 --- a/packages/x-data-grid-generator/src/hooks/useMovieData.ts +++ b/packages/x-data-grid-generator/src/hooks/useMovieData.ts @@ -49,6 +49,7 @@ const COLUMNS: GridColDef[] = [ field: 'year', headerName: 'Year', type: 'number', + valueFormatter: (value) => (typeof value === 'number' ? `${value}` : ''), availableAggregationFunctions: ['max', 'min'], }, { diff --git a/packages/x-data-grid-generator/tsconfig.json b/packages/x-data-grid-generator/tsconfig.json index 9dc2a70b2061..5b674a6fce63 100644 --- a/packages/x-data-grid-generator/tsconfig.json +++ b/packages/x-data-grid-generator/tsconfig.json @@ -1,7 +1,14 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["react", "mocha", "node", "@mui/material/themeCssVarsAugmentation"] + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha", + "node", + "react" + ] }, "include": ["src/**/*"] } diff --git a/packages/x-data-grid-premium/package.json b/packages/x-data-grid-premium/package.json index 3c428bfd2080..762af6cb53a1 100644 --- a/packages/x-data-grid-premium/package.json +++ b/packages/x-data-grid-premium/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid-premium", - "version": "7.5.0", + "version": "7.6.2", "description": "The Premium plan edition of the Data Grid Components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -43,8 +43,8 @@ "directory": "packages/x-data-grid-premium" }, "dependencies": { - "@babel/runtime": "^7.24.5", - "@mui/system": "^5.15.14", + "@babel/runtime": "^7.24.6", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@mui/x-data-grid": "workspace:*", "@mui/x-data-grid-pro": "workspace:*", @@ -61,9 +61,10 @@ "react-dom": "^17.0.0 || ^18.0.0" }, "devDependencies": { + "@mui/internal-test-utils": "1.0.0", "@types/prop-types": "^15.7.12", "date-fns": "^2.30.0", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx b/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx index 33c17ae307f2..c00103025fe4 100644 --- a/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx +++ b/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx @@ -83,7 +83,7 @@ export const DataGridPremium = React.memo(DataGridPremiumRaw) as DataGridPremium DataGridPremiumRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Aggregation functions available on the grid. @@ -116,7 +116,7 @@ DataGridPremiumRaw.propTypes = { */ 'aria-labelledby': PropTypes.string, /** - * If `true`, the Data Grid height is dynamic and follow the number of rows in the Data Grid. + * If `true`, the Data Grid height is dynamic and follows the number of rows in the Data Grid. * @default false */ autoHeight: PropTypes.bool, diff --git a/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx b/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx index afadecb9a098..01bba6af146b 100644 --- a/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx +++ b/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx @@ -108,7 +108,7 @@ function GridColumnMenuAggregationItem(props: GridColumnMenuItemProps) { GridColumnMenuAggregationItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, diff --git a/packages/x-data-grid-premium/src/components/GridColumnMenuRowGroupItem.tsx b/packages/x-data-grid-premium/src/components/GridColumnMenuRowGroupItem.tsx index c01cafe26094..0cc989571312 100644 --- a/packages/x-data-grid-premium/src/components/GridColumnMenuRowGroupItem.tsx +++ b/packages/x-data-grid-premium/src/components/GridColumnMenuRowGroupItem.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; import MenuItem from '@mui/material/MenuItem'; import ListItemIcon from '@mui/material/ListItemIcon'; import ListItemText from '@mui/material/ListItemText'; @@ -17,7 +16,7 @@ import { } from '../hooks/features/rowGrouping/gridRowGroupingUtils'; import { useGridRootProps } from '../hooks/utils/useGridRootProps'; -function GridColumnMenuRowGroupItem(props: GridColumnMenuItemProps) { +export function GridColumnMenuRowGroupItem(props: GridColumnMenuItemProps) { const { colDef, onClick } = props; const apiRef = useGridApiContext(); const rowGroupingModel = useGridSelector(apiRef, gridRowGroupingSanitizedModelSelector); @@ -52,14 +51,3 @@ function GridColumnMenuRowGroupItem(props: GridColumnMenuItemProps) { return renderUnGroupingMenuItem(getRowGroupingCriteriaFromGroupingField(colDef.field)!); } - -GridColumnMenuRowGroupItem.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - colDef: PropTypes.object.isRequired, - onClick: PropTypes.func.isRequired, -} as any; - -export { GridColumnMenuRowGroupItem }; diff --git a/packages/x-data-grid-premium/src/components/GridColumnMenuRowUngroupItem.tsx b/packages/x-data-grid-premium/src/components/GridColumnMenuRowUngroupItem.tsx index dc879859e498..48a8e21f85ff 100644 --- a/packages/x-data-grid-premium/src/components/GridColumnMenuRowUngroupItem.tsx +++ b/packages/x-data-grid-premium/src/components/GridColumnMenuRowUngroupItem.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; import MenuItem from '@mui/material/MenuItem'; import ListItemIcon from '@mui/material/ListItemIcon'; import ListItemText from '@mui/material/ListItemText'; @@ -12,7 +11,7 @@ import { useGridApiContext } from '../hooks/utils/useGridApiContext'; import { gridRowGroupingSanitizedModelSelector } from '../hooks/features/rowGrouping/gridRowGroupingSelector'; import { useGridRootProps } from '../hooks/utils/useGridRootProps'; -function GridColumnMenuRowUngroupItem(props: GridColumnMenuItemProps) { +export function GridColumnMenuRowUngroupItem(props: GridColumnMenuItemProps) { const { colDef, onClick } = props; const apiRef = useGridApiContext(); const rowGroupingModel = useGridSelector(apiRef, gridRowGroupingSanitizedModelSelector); @@ -55,14 +54,3 @@ function GridColumnMenuRowUngroupItem(props: GridColumnMenuItemProps) { </MenuItem> ); } - -GridColumnMenuRowUngroupItem.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - colDef: PropTypes.object.isRequired, - onClick: PropTypes.func.isRequired, -} as any; - -export { GridColumnMenuRowUngroupItem }; diff --git a/packages/x-data-grid-premium/src/components/GridExcelExportMenuItem.tsx b/packages/x-data-grid-premium/src/components/GridExcelExportMenuItem.tsx index 4a7ebb2b2a16..37e265b9233b 100644 --- a/packages/x-data-grid-premium/src/components/GridExcelExportMenuItem.tsx +++ b/packages/x-data-grid-premium/src/components/GridExcelExportMenuItem.tsx @@ -27,13 +27,14 @@ function GridExcelExportMenuItem(props: GridExcelExportMenuItemProps) { GridExcelExportMenuItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- hideMenu: PropTypes.func, options: PropTypes.shape({ allColumns: PropTypes.bool, columnsStyles: PropTypes.object, disableToolbarButton: PropTypes.bool, + escapeFormulas: PropTypes.bool, exceljsPostProcess: PropTypes.func, exceljsPreProcess: PropTypes.func, fields: PropTypes.arrayOf(PropTypes.string), diff --git a/packages/x-data-grid-premium/src/components/GridPremiumColumnMenu.tsx b/packages/x-data-grid-premium/src/components/GridPremiumColumnMenu.tsx index 518be3a4e0e3..edaee7957fc3 100644 --- a/packages/x-data-grid-premium/src/components/GridPremiumColumnMenu.tsx +++ b/packages/x-data-grid-premium/src/components/GridPremiumColumnMenu.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; import { GridGenericColumnMenu, GridColumnMenuProps, @@ -33,7 +32,7 @@ export const GRID_COLUMN_MENU_SLOT_PROPS_PREMIUM = { columnMenuGroupingItem: { displayOrder: 27 }, }; -const GridPremiumColumnMenu = React.forwardRef<HTMLUListElement, GridColumnMenuProps>( +export const GridPremiumColumnMenu = React.forwardRef<HTMLUListElement, GridColumnMenuProps>( function GridPremiumColumnMenuSimple(props, ref) { return ( <GridGenericColumnMenu @@ -45,15 +44,3 @@ const GridPremiumColumnMenu = React.forwardRef<HTMLUListElement, GridColumnMenuP ); }, ); - -GridPremiumColumnMenu.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - colDef: PropTypes.object.isRequired, - hideMenu: PropTypes.func.isRequired, - open: PropTypes.bool.isRequired, -} as any; - -export { GridPremiumColumnMenu }; diff --git a/packages/x-data-grid-premium/src/hooks/features/cellSelection/useGridCellSelection.ts b/packages/x-data-grid-premium/src/hooks/features/cellSelection/useGridCellSelection.ts index e83cd6834b8b..920aafd965bf 100644 --- a/packages/x-data-grid-premium/src/hooks/features/cellSelection/useGridCellSelection.ts +++ b/packages/x-data-grid-premium/src/hooks/features/cellSelection/useGridCellSelection.ts @@ -559,9 +559,12 @@ export const useGridCellSelection = ( if (fieldsMap[field]) { const cellParams = apiRef.current.getCellParams(rowId, field); cellData = serializeCellValue(cellParams, { - delimiterCharacter: clipboardCopyCellDelimiter, + csvOptions: { + delimiter: clipboardCopyCellDelimiter, + shouldAppendQuotes: false, + escapeFormulas: false, + }, ignoreValueFormatter, - shouldAppendQuotes: false, }); } else { cellData = ''; diff --git a/packages/x-data-grid-premium/src/hooks/features/export/serializer/excelSerializer.ts b/packages/x-data-grid-premium/src/hooks/features/export/serializer/excelSerializer.ts index ba4439cc4da9..f6c9de2adcc1 100644 --- a/packages/x-data-grid-premium/src/hooks/features/export/serializer/excelSerializer.ts +++ b/packages/x-data-grid-premium/src/hooks/features/export/serializer/excelSerializer.ts @@ -15,12 +15,9 @@ import { isObject, GridColumnGroupLookup, isSingleSelectColDef, + gridHasColSpanSelector, } from '@mui/x-data-grid/internals'; -import { - GridExceljsProcessInput, - ColumnsStylesInterface, - GridExcelExportOptions, -} from '../gridExcelExportInterface'; +import { ColumnsStylesInterface, GridExcelExportOptions } from '../gridExcelExportInterface'; import { GridPrivateApiPremium } from '../../../../models/gridApiPremium'; const getExcelJs = async () => { @@ -65,29 +62,41 @@ interface SerializedRow { mergedCells: { leftIndex: number; rightIndex: number }[]; } -export const serializeRow = ( +/** + * FIXME: This function mutates the colspan info, but colspan info assumes that the columns + * passed to it are always consistent. In this case, the exported columns may differ from the + * actual rendered columns. + * The caller of this function MUST call `resetColSpan()` before and after usage. + */ +export const serializeRowUnsafe = ( id: GridRowId, columns: GridStateColDef[], - api: GridPrivateApiPremium, + apiRef: React.MutableRefObject<GridPrivateApiPremium>, defaultValueOptionsFormulae: { [field: string]: { address: string } }, + options: Pick<BuildExcelOptions, 'escapeFormulas'>, ): SerializedRow => { const row: SerializedRow['row'] = {}; const dataValidation: SerializedRow['dataValidation'] = {}; const mergedCells: SerializedRow['mergedCells'] = []; - const firstCellParams = api.getCellParams(id, columns[0].field); + const firstCellParams = apiRef.current.getCellParams(id, columns[0].field); const outlineLevel = firstCellParams.rowNode.depth; - - // `colSpan` is only calculated for rendered rows, so we need to calculate it during export for every row - api.calculateColSpan({ - rowId: id, - minFirstColumn: 0, - maxLastColumn: columns.length, - columns, - }); + const hasColSpan = gridHasColSpanSelector(apiRef); + + if (hasColSpan) { + // `colSpan` is only calculated for rendered rows, so we need to calculate it during export for every row + apiRef.current.calculateColSpan({ + rowId: id, + minFirstColumn: 0, + maxLastColumn: columns.length, + columns, + }); + } columns.forEach((column, colIndex) => { - const colSpanInfo = api.unstable_getCellColSpanInfo(id, colIndex); + const colSpanInfo = hasColSpan + ? apiRef.current.unstable_getCellColSpanInfo(id, colIndex) + : undefined; if (colSpanInfo && colSpanInfo.spannedByColSpan) { return; } @@ -98,7 +107,9 @@ export const serializeRow = ( }); } - const cellParams = api.getCellParams(id, column.field); + const cellParams = apiRef.current.getCellParams(id, column.field); + + let cellValue: string | undefined; switch (cellParams.colDef.type) { case 'singleSelect': { @@ -115,7 +126,7 @@ export const serializeRow = ( castColumn, row, valueOptions, - api, + apiRef.current, ); dataValidation[castColumn.field] = { type: 'list', @@ -137,7 +148,7 @@ export const serializeRow = ( }; } - const formattedValue = api.getCellParams(id, castColumn.field).formattedValue; + const formattedValue = apiRef.current.getCellParams(id, castColumn.field).formattedValue; if (process.env.NODE_ENV !== 'production') { if (String(cellParams.formattedValue) === '[object Object]') { warnInvalidFormattedValue(); @@ -152,14 +163,14 @@ export const serializeRow = ( } case 'boolean': case 'number': - row[column.field] = api.getCellParams(id, column.field).value as any; + cellValue = apiRef.current.getCellParams(id, column.field).value as any; break; case 'date': case 'dateTime': { // Excel does not do any timezone conversion, so we create a date using UTC instead of local timezone // Solution from: https://github.com/exceljs/exceljs/issues/486#issuecomment-432557582 // About Date.UTC(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC#exemples - const value = api.getCellParams<any, Date>(id, column.field).value; + const value = apiRef.current.getCellParams<any, Date>(id, column.field).value; // value may be `undefined` in auto-generated grouping rows if (!value) { break; @@ -180,7 +191,7 @@ export const serializeRow = ( case 'actions': break; default: - row[column.field] = api.getCellParams(id, column.field).formattedValue as any; + cellValue = apiRef.current.getCellParams(id, column.field).formattedValue as any; if (process.env.NODE_ENV !== 'production') { if (String(cellParams.formattedValue) === '[object Object]') { warnInvalidFormattedValue(); @@ -188,6 +199,17 @@ export const serializeRow = ( } break; } + + if (typeof cellValue === 'string' && options.escapeFormulas) { + // See https://owasp.org/www-community/attacks/CSV_Injection + if (['=', '+', '-', '@', '\t', '\r'].includes(cellValue[0])) { + cellValue = `'${cellValue}`; + } + } + + if (typeof cellValue !== 'undefined') { + row[column.field] = cellValue; + } }); return { @@ -367,20 +389,20 @@ async function createValueOptionsSheetIfNeeded( }); } -interface BuildExcelOptions { +interface BuildExcelOptions + extends Pick<GridExcelExportOptions, 'exceljsPreProcess' | 'exceljsPostProcess'>, + Pick< + Required<GridExcelExportOptions>, + 'valueOptionsSheetName' | 'includeHeaders' | 'includeColumnGroupsHeaders' | 'escapeFormulas' + > { columns: GridStateColDef[]; rowIds: GridRowId[]; - includeHeaders: boolean; - includeColumnGroupsHeaders: boolean; - valueOptionsSheetName: string; - exceljsPreProcess?: (processInput: GridExceljsProcessInput) => Promise<void>; - exceljsPostProcess?: (processInput: GridExceljsProcessInput) => Promise<void>; columnsStyles?: ColumnsStylesInterface; } export async function buildExcel( options: BuildExcelOptions, - api: GridPrivateApiPremium, + apiRef: React.MutableRefObject<GridPrivateApiPremium>, ): Promise<Excel.Workbook> { const { columns, @@ -409,7 +431,7 @@ export async function buildExcel( if (includeColumnGroupsHeaders) { const columnGroupPaths = columns.reduce<Record<string, string[]>>((acc, column) => { - acc[column.field] = api.getColumnGroupPath(column.field); + acc[column.field] = apiRef.current.getColumnGroupPath(column.field); return acc; }, {}); @@ -417,7 +439,7 @@ export async function buildExcel( worksheet, serializedColumns, columnGroupPaths, - api.getAllGroupDetails(), + apiRef.current.getAllGroupDetails(), ); } @@ -425,13 +447,19 @@ export async function buildExcel( worksheet.addRow(columns.map((column) => column.headerName ?? column.field)); } - const valueOptionsData = await getDataForValueOptionsSheet(columns, valueOptionsSheetName, api); + const valueOptionsData = await getDataForValueOptionsSheet( + columns, + valueOptionsSheetName, + apiRef.current, + ); createValueOptionsSheetIfNeeded(valueOptionsData, valueOptionsSheetName, workbook); + apiRef.current.resetColSpan(); rowIds.forEach((id) => { - const serializedRow = serializeRow(id, columns, api, valueOptionsData); + const serializedRow = serializeRowUnsafe(id, columns, apiRef, valueOptionsData, options); addSerializedRowToWorksheet(serializedRow, worksheet); }); + apiRef.current.resetColSpan(); if (exceljsPostProcess) { await exceljsPostProcess({ diff --git a/packages/x-data-grid-premium/src/hooks/features/export/useGridExcelExport.tsx b/packages/x-data-grid-premium/src/hooks/features/export/useGridExcelExport.tsx index 5d568919e335..93286e45fc4f 100644 --- a/packages/x-data-grid-premium/src/hooks/features/export/useGridExcelExport.tsx +++ b/packages/x-data-grid-premium/src/hooks/features/export/useGridExcelExport.tsx @@ -24,7 +24,7 @@ import { ExcelExportInitEvent, getDataForValueOptionsSheet, serializeColumns, - serializeRow, + serializeRowUnsafe, } from './serializer/excelSerializer'; import { GridExcelExportMenuItem } from '../../../components'; @@ -60,8 +60,9 @@ export const useGridExcelExport = ( columnsStyles: options?.columnsStyles, exceljsPreProcess: options?.exceljsPreProcess, exceljsPostProcess: options?.exceljsPostProcess, + escapeFormulas: options.escapeFormulas ?? true, }, - apiRef.current, + apiRef, ); }, [logger, apiRef], @@ -140,9 +141,13 @@ export const useGridExcelExport = ( const serializedColumns = serializeColumns(exportedColumns, options.columnsStyles || {}); + apiRef.current.resetColSpan(); const serializedRows = exportedRowIds.map((id) => - serializeRow(id, exportedColumns, apiRef.current, valueOptionsData), + serializeRowUnsafe(id, exportedColumns, apiRef, valueOptionsData, { + escapeFormulas: options.escapeFormulas ?? true, + }), ); + apiRef.current.resetColSpan(); const columnGroupPaths = exportedColumns.reduce<Record<string, string[]>>((acc, column) => { acc[column.field] = apiRef.current.getColumnGroupPath(column.field); diff --git a/packages/x-data-grid-premium/src/index.ts b/packages/x-data-grid-premium/src/index.ts index 5e9f3e0c5334..0def4c628a75 100644 --- a/packages/x-data-grid-premium/src/index.ts +++ b/packages/x-data-grid-premium/src/index.ts @@ -25,6 +25,7 @@ export * from './models'; export * from './components'; export { GridColumnHeaders } from '@mui/x-data-grid-pro'; +export type { GridColumnHeadersProps } from '@mui/x-data-grid-pro'; export type { DataGridPremiumProps, diff --git a/packages/x-data-grid-premium/src/tests/DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/DataGridPremium.test.tsx index d6c0fa758875..70df5ae9c3d5 100644 --- a/packages/x-data-grid-premium/src/tests/DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/DataGridPremium.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, act } from '@mui-internal/test-utils'; +import { createRenderer, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGridPremium as DataGrid, diff --git a/packages/x-data-grid-premium/src/tests/aggregation.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/aggregation.DataGridPremium.test.tsx index deffec6d9b2f..43f054c2635c 100644 --- a/packages/x-data-grid-premium/src/tests/aggregation.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/aggregation.DataGridPremium.test.tsx @@ -6,7 +6,7 @@ import { within, act, fireEvent, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { expect } from 'chai'; import { getCell, getColumnHeaderCell, getColumnValues } from 'test/utils/helperFn'; import { SinonSpy, spy } from 'sinon'; diff --git a/packages/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx index 87eb8977c8f5..15f398c262c2 100644 --- a/packages/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/cellSelection.DataGridPremium.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { stub, SinonStub } from 'sinon'; import { expect } from 'chai'; import { spyApi, getCell, grid } from 'test/utils/helperFn'; -import { createRenderer, fireEvent, act, userEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act, userEvent, screen } from '@mui/internal-test-utils'; import { DataGridPremium, DataGridPremiumProps, diff --git a/packages/x-data-grid-premium/src/tests/clipboard.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/clipboard.DataGridPremium.test.tsx index cbc2b55cc850..1be69796afdd 100644 --- a/packages/x-data-grid-premium/src/tests/clipboard.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/clipboard.DataGridPremium.test.tsx @@ -7,7 +7,7 @@ import { GridColDef, } from '@mui/x-data-grid-premium'; // @ts-ignore Remove once the test utils are typed -import { createRenderer, fireEvent, userEvent, waitFor } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, userEvent, waitFor } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { stub, SinonStub, spy } from 'sinon'; import { getCell, getColumnValues, sleep } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid-premium/src/tests/columns.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/columns.DataGridPremium.test.tsx index 63543419ab26..979136dc5e7e 100644 --- a/packages/x-data-grid-premium/src/tests/columns.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/columns.DataGridPremium.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { act, createRenderer, fireEvent } from '@mui-internal/test-utils'; +import { act, createRenderer, fireEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGridPremium, gridClasses } from '@mui/x-data-grid-premium'; import { getCell, getColumnHeaderCell } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx index b582b1b1f792..08d9483f1eda 100644 --- a/packages/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/exportExcel.DataGridPremium.test.tsx @@ -8,7 +8,7 @@ import { DataGridPremiumProps, GridActionsCellItem, } from '@mui/x-data-grid-premium'; -import { createRenderer, screen, fireEvent, act } from '@mui-internal/test-utils'; +import { createRenderer, screen, fireEvent, act } from '@mui/internal-test-utils'; import { spy, SinonSpy } from 'sinon'; import { expect } from 'chai'; import Excel from 'exceljs'; @@ -352,6 +352,46 @@ describe('<DataGridPremium /> - Export Excel', () => { expect(worksheet.getCell('B3').type).to.equal(Excel.ValueType.String); expect(worksheet.getCell('C3').type).to.equal(Excel.ValueType.String); }); + + it('should escape formulas in the cells', async () => { + function Test() { + apiRef = useGridApiRef(); + + return ( + <div style={{ width: 300, height: 300 }}> + <DataGridPremium + apiRef={apiRef} + columns={[{ field: 'name' }]} + rows={[ + { id: 0, name: '=1+1' }, + { id: 1, name: '+1+1' }, + { id: 2, name: '-1+1' }, + { id: 3, name: '@1+1' }, + { id: 4, name: '\t1+1' }, + { id: 5, name: '\r1+1' }, + { id: 6, name: ',=1+1' }, + { id: 7, name: 'value,=1+1' }, + ]} + /> + </div> + ); + } + + render(<Test />); + + const workbook = await apiRef.current.getDataAsExcel(); + const worksheet = workbook!.worksheets[0]; + + expect(worksheet.getCell('A1').value).to.equal('name'); + expect(worksheet.getCell('A2').value).to.equal("'=1+1"); + expect(worksheet.getCell('A3').value).to.equal("'+1+1"); + expect(worksheet.getCell('A4').value).to.equal("'-1+1"); + expect(worksheet.getCell('A5').value).to.equal("'@1+1"); + expect(worksheet.getCell('A6').value).to.equal("'\t1+1"); + expect(worksheet.getCell('A7').value).to.equal("'\r1+1"); + expect(worksheet.getCell('A8').value).to.equal(',=1+1'); + expect(worksheet.getCell('A9').value).to.equal('value,=1+1'); + }); }); describe('web worker', () => { diff --git a/packages/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx index 52bd05723a49..62b51732d8c0 100644 --- a/packages/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/license.DataGridPremium.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import addYears from 'date-fns/addYears'; import { expect } from 'chai'; -import { createRenderer, screen, waitFor } from '@mui-internal/test-utils'; +import { createRenderer, screen, waitFor } from '@mui/internal-test-utils'; import { DataGridPremium } from '@mui/x-data-grid-premium'; import { generateLicense, LicenseInfo } from '@mui/x-license'; diff --git a/packages/x-data-grid-premium/src/tests/rowGrouping.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/rowGrouping.DataGridPremium.test.tsx index c7bf4608de88..69f2268255ea 100644 --- a/packages/x-data-grid-premium/src/tests/rowGrouping.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/rowGrouping.DataGridPremium.test.tsx @@ -6,7 +6,7 @@ import { act, userEvent, waitFor, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { microtasks, getColumnHeaderCell, diff --git a/packages/x-data-grid-premium/src/tests/rowPinning.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/rowPinning.DataGridPremium.test.tsx index e0a103cbde2b..7f591f2dd8be 100644 --- a/packages/x-data-grid-premium/src/tests/rowPinning.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/rowPinning.DataGridPremium.test.tsx @@ -1,4 +1,4 @@ -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import * as React from 'react'; import { expect } from 'chai'; import { diff --git a/packages/x-data-grid-premium/src/tests/statePersistence.DataGridPremium.test.tsx b/packages/x-data-grid-premium/src/tests/statePersistence.DataGridPremium.test.tsx index a8a9a8411d1e..3ae5c92b250e 100644 --- a/packages/x-data-grid-premium/src/tests/statePersistence.DataGridPremium.test.tsx +++ b/packages/x-data-grid-premium/src/tests/statePersistence.DataGridPremium.test.tsx @@ -8,7 +8,7 @@ import { GridRowsProp, useGridApiRef, } from '@mui/x-data-grid-premium'; -import { createRenderer, act } from '@mui-internal/test-utils'; +import { createRenderer, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { getColumnValues } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid-premium/tsconfig.json b/packages/x-data-grid-premium/tsconfig.json index 1c24452d71f8..6afc65000e94 100644 --- a/packages/x-data-grid-premium/tsconfig.json +++ b/packages/x-data-grid-premium/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["@mui/material/themeCssVarsAugmentation"] + "types": ["@mui/material/themeCssVarsAugmentation", "chai-dom", "mocha"] }, "include": ["src/**/*"] } diff --git a/packages/x-data-grid-pro/package.json b/packages/x-data-grid-pro/package.json index 3bf22b6ec809..3234611336a4 100644 --- a/packages/x-data-grid-pro/package.json +++ b/packages/x-data-grid-pro/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid-pro", - "version": "7.5.0", + "version": "7.6.2", "description": "The Pro plan edition of the Data Grid components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -43,8 +43,8 @@ "directory": "packages/x-data-grid-pro" }, "dependencies": { - "@babel/runtime": "^7.24.5", - "@mui/system": "^5.15.14", + "@babel/runtime": "^7.24.6", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@mui/x-data-grid": "workspace:*", "@mui/x-license": "workspace:*", @@ -59,8 +59,9 @@ "react-dom": "^17.0.0 || ^18.0.0" }, "devDependencies": { + "@mui/internal-test-utils": "1.0.0", "@types/prop-types": "^15.7.12", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx b/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx index 0cea896652bb..4a68d6580cf5 100644 --- a/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx +++ b/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx @@ -70,7 +70,7 @@ export const DataGridPro = React.memo(DataGridProRaw) as DataGridProComponent; DataGridProRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The ref object that allows grid manipulation. Can be instantiated with `useGridApiRef()`. @@ -87,7 +87,7 @@ DataGridProRaw.propTypes = { */ 'aria-labelledby': PropTypes.string, /** - * If `true`, the Data Grid height is dynamic and follow the number of rows in the Data Grid. + * If `true`, the Data Grid height is dynamic and follows the number of rows in the Data Grid. * @default false */ autoHeight: PropTypes.bool, diff --git a/packages/x-data-grid-pro/src/components/GridColumnHeaders.tsx b/packages/x-data-grid-pro/src/components/GridColumnHeaders.tsx index cff0add8e8c5..ea0327ece85e 100644 --- a/packages/x-data-grid-pro/src/components/GridColumnHeaders.tsx +++ b/packages/x-data-grid-pro/src/components/GridColumnHeaders.tsx @@ -9,11 +9,11 @@ const Filler = styled('div')({ backgroundColor: 'var(--DataGrid-containerBackground)', }); -interface DataGridProColumnHeadersProps +export interface GridColumnHeadersProps extends React.HTMLAttributes<HTMLDivElement>, UseGridColumnHeadersProps {} -const GridColumnHeaders = React.forwardRef<HTMLDivElement, DataGridProColumnHeadersProps>( +const GridColumnHeaders = React.forwardRef<HTMLDivElement, GridColumnHeadersProps>( function GridColumnHeaders(props, ref) { const { style, @@ -63,7 +63,7 @@ const GridColumnHeaders = React.forwardRef<HTMLDivElement, DataGridProColumnHead GridColumnHeaders.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- columnGroupHeaderFocus: PropTypes.shape({ depth: PropTypes.number.isRequired, diff --git a/packages/x-data-grid-pro/src/components/GridColumnMenuPinningItem.tsx b/packages/x-data-grid-pro/src/components/GridColumnMenuPinningItem.tsx index 8af8bb84ceb1..743fcb3fc341 100644 --- a/packages/x-data-grid-pro/src/components/GridColumnMenuPinningItem.tsx +++ b/packages/x-data-grid-pro/src/components/GridColumnMenuPinningItem.tsx @@ -95,7 +95,7 @@ function GridColumnMenuPinningItem(props: GridColumnMenuItemProps) { GridColumnMenuPinningItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, diff --git a/packages/x-data-grid-pro/src/components/GridDetailPanelToggleCell.tsx b/packages/x-data-grid-pro/src/components/GridDetailPanelToggleCell.tsx index 079ba8fb5c2c..f38083de2364 100644 --- a/packages/x-data-grid-pro/src/components/GridDetailPanelToggleCell.tsx +++ b/packages/x-data-grid-pro/src/components/GridDetailPanelToggleCell.tsx @@ -55,7 +55,7 @@ function GridDetailPanelToggleCell(props: GridRenderCellParams) { GridDetailPanelToggleCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid-pro/src/components/GridProColumnMenu.tsx b/packages/x-data-grid-pro/src/components/GridProColumnMenu.tsx index b9ff646078fc..c35f78686ea3 100644 --- a/packages/x-data-grid-pro/src/components/GridProColumnMenu.tsx +++ b/packages/x-data-grid-pro/src/components/GridProColumnMenu.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; import { GridGenericColumnMenu, GridColumnMenuProps, @@ -20,7 +19,7 @@ export const GRID_COLUMN_MENU_SLOT_PROPS_PRO = { }, }; -const GridProColumnMenu = React.forwardRef<HTMLUListElement, GridColumnMenuProps>( +export const GridProColumnMenu = React.forwardRef<HTMLUListElement, GridColumnMenuProps>( function GridProColumnMenu(props, ref) { return ( <GridGenericColumnMenu @@ -32,15 +31,3 @@ const GridProColumnMenu = React.forwardRef<HTMLUListElement, GridColumnMenuProps ); }, ); - -GridProColumnMenu.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - colDef: PropTypes.object.isRequired, - hideMenu: PropTypes.func.isRequired, - open: PropTypes.bool.isRequired, -} as any; - -export { GridProColumnMenu }; diff --git a/packages/x-data-grid-pro/src/components/GridTreeDataGroupingCell.tsx b/packages/x-data-grid-pro/src/components/GridTreeDataGroupingCell.tsx index 53ae19801615..8e1e85688d89 100644 --- a/packages/x-data-grid-pro/src/components/GridTreeDataGroupingCell.tsx +++ b/packages/x-data-grid-pro/src/components/GridTreeDataGroupingCell.tsx @@ -89,7 +89,7 @@ function GridTreeDataGroupingCell(props: GridTreeDataGroupingCellProps) { GridTreeDataGroupingCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterCell.tsx b/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterCell.tsx index 3f2b92db7a10..23ca4abaeed3 100644 --- a/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterCell.tsx +++ b/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterCell.tsx @@ -123,8 +123,12 @@ const GridHeaderFilterCell = React.forwardRef<HTMLDivElement, GridHeaderFilterCe const isMenuOpen = menuOpenField === colDef.field; // TODO: Support for `isAnyOf` operator - const filterOperators = - colDef.filterOperators?.filter((operator) => operator.value !== 'isAnyOf') ?? []; + const filterOperators = React.useMemo(() => { + if (!colDef.filterOperators) { + return []; + } + return colDef.filterOperators.filter((operator) => operator.value !== 'isAnyOf'); + }, [colDef.filterOperators]); const filterModel = useGridSelector(apiRef, gridFilterModelSelector); const filterableColumnsLookup = useGridSelector(apiRef, gridFilterableColumnLookupSelector); @@ -136,7 +140,11 @@ const GridHeaderFilterCell = React.forwardRef<HTMLDivElement, GridHeaderFilterCe return filterModelItem ? !filterableColumnsLookup[filterModelItem.field] : false; }, [colDef.field, filterModel, filterableColumnsLookup]); - const currentOperator = filterOperators![0]; + const currentOperator = React.useMemo( + () => + filterOperators.find((operator) => operator.value === item.operator) ?? filterOperators![0], + [item.operator, filterOperators], + ); const InputComponent = colDef.filterable || isFilterReadOnly ? currentOperator!.InputComponent : null; @@ -286,10 +294,10 @@ const GridHeaderFilterCell = React.forwardRef<HTMLDivElement, GridHeaderFilterCe const classes = useUtilityClasses(ownerState as OwnerState); - const isNoInputOperator = - filterOperators?.find(({ value }) => item.operator === value)?.requiresFilterValue === false; + const isNoInputOperator = currentOperator.requiresFilterValue === false; const isApplied = Boolean(item?.value) || isNoInputOperator; + const label = currentOperator.headerLabel ?? apiRef.current.getLocaleText( @@ -377,7 +385,7 @@ const GridHeaderFilterCell = React.forwardRef<HTMLDivElement, GridHeaderFilterCe GridHeaderFilterCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, colIndex: PropTypes.number.isRequired, diff --git a/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenu.tsx b/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenu.tsx index 409d1efa6601..9c049130ee1a 100644 --- a/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenu.tsx +++ b/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenu.tsx @@ -86,7 +86,7 @@ function GridHeaderFilterMenu({ GridHeaderFilterMenu.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- applyFilterChanges: PropTypes.func.isRequired, field: PropTypes.string.isRequired, diff --git a/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenuContainer.tsx b/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenuContainer.tsx index ac8188dd7226..a09f307355e9 100644 --- a/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenuContainer.tsx +++ b/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterMenuContainer.tsx @@ -92,7 +92,7 @@ function GridHeaderFilterMenuContainer(props: { GridHeaderFilterMenuContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- applyFilterChanges: PropTypes.func.isRequired, buttonRef: refType, diff --git a/packages/x-data-grid-pro/src/index.ts b/packages/x-data-grid-pro/src/index.ts index 3a47149e4706..e100b7283cca 100644 --- a/packages/x-data-grid-pro/src/index.ts +++ b/packages/x-data-grid-pro/src/index.ts @@ -38,3 +38,4 @@ export { } from './components/reexports'; export { GridColumnHeaders } from './components/GridColumnHeaders'; +export type { GridColumnHeadersProps } from './components/GridColumnHeaders'; diff --git a/packages/x-data-grid-pro/src/tests/accessibility.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/accessibility.DataGridPro.test.tsx index 2c5402436274..474026c577d0 100644 --- a/packages/x-data-grid-pro/src/tests/accessibility.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/accessibility.DataGridPro.test.tsx @@ -3,7 +3,7 @@ import { expect } from 'chai'; import axe from 'axe-core'; import { DataGridPro } from '@mui/x-data-grid-pro'; import { useBasicDemoData } from '@mui/x-data-grid-generator'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; function logViolations(violations: any) { if (violations.length !== 0) { diff --git a/packages/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx index 0e495c379482..65611293817f 100644 --- a/packages/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/cellEditing.DataGridPro.test.tsx @@ -13,7 +13,7 @@ import { GridCellModes, } from '@mui/x-data-grid-pro'; import { getBasicGridData } from '@mui/x-data-grid-generator'; -import { createRenderer, fireEvent, act, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act, userEvent } from '@mui/internal-test-utils'; import { getCell, spyApi } from 'test/utils/helperFn'; describe('<DataGridPro /> - Cell editing', () => { diff --git a/packages/x-data-grid-pro/src/tests/clipboard.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/clipboard.DataGridPro.test.tsx index 38f3731ddd33..3ce23f839bf3 100644 --- a/packages/x-data-grid-pro/src/tests/clipboard.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/clipboard.DataGridPro.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { GridApi, useGridApiRef, DataGridPro, DataGridProProps } from '@mui/x-data-grid-pro'; -import { createRenderer, fireEvent, act, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act, userEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { stub, SinonStub } from 'sinon'; import { getCell } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid-pro/src/tests/columnHeaders.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/columnHeaders.DataGridPro.test.tsx index 8dd68c791f3d..90830ac40578 100644 --- a/packages/x-data-grid-pro/src/tests/columnHeaders.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/columnHeaders.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { gridClasses, DataGridPro, DataGridProProps } from '@mui/x-data-grid-pro'; import { getColumnHeaderCell, getColumnValues } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid-pro/src/tests/columnPinning.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/columnPinning.DataGridPro.test.tsx index dc8aa7bb50fb..97615142218a 100644 --- a/packages/x-data-grid-pro/src/tests/columnPinning.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/columnPinning.DataGridPro.test.tsx @@ -19,7 +19,7 @@ import { createEvent, act, userEvent, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { $, $$, diff --git a/packages/x-data-grid-pro/src/tests/columnReorder.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/columnReorder.DataGridPro.test.tsx index 0967ea01d746..180920eca159 100644 --- a/packages/x-data-grid-pro/src/tests/columnReorder.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/columnReorder.DataGridPro.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { createRenderer, fireEvent, createEvent, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, createEvent, act } from '@mui/internal-test-utils'; import { getColumnHeadersTextContent, getColumnHeaderCell, diff --git a/packages/x-data-grid-pro/src/tests/columnSpanning.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/columnSpanning.DataGridPro.test.tsx index ea6a2ad59282..f5f8e93126a2 100644 --- a/packages/x-data-grid-pro/src/tests/columnSpanning.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/columnSpanning.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, act, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act, userEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGridPro, GridApi, useGridApiRef, GridColDef, gridClasses } from '@mui/x-data-grid-pro'; import { getActiveCell, getCell, getColumnHeaderCell } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx index 55d2a672dbba..ec2f96b1ac44 100644 --- a/packages/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/columns.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { spy } from 'sinon'; import { diff --git a/packages/x-data-grid-pro/src/tests/columnsVisibility.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/columnsVisibility.DataGridPro.test.tsx index 58d5b8168d13..884c31719746 100644 --- a/packages/x-data-grid-pro/src/tests/columnsVisibility.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/columnsVisibility.DataGridPro.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { createRenderer, fireEvent, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act } from '@mui/internal-test-utils'; import { DataGridPro, DataGridProProps, diff --git a/packages/x-data-grid-pro/src/tests/components.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/components.DataGridPro.test.tsx index 2b354aba0ec3..496505757760 100644 --- a/packages/x-data-grid-pro/src/tests/components.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/components.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, EventType, fireEvent, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, EventType, fireEvent, userEvent } from '@mui/internal-test-utils'; import { spy } from 'sinon'; import { expect } from 'chai'; import { diff --git a/packages/x-data-grid-pro/src/tests/detailPanel.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/detailPanel.DataGridPro.test.tsx index bfe5efda3299..78a9d17a85f3 100644 --- a/packages/x-data-grid-pro/src/tests/detailPanel.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/detailPanel.DataGridPro.test.tsx @@ -18,7 +18,7 @@ import { waitFor, act, userEvent, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { $, $$, grid, getRow, getCell, getColumnValues, microtasks } from 'test/utils/helperFn'; const isJSDOM = /jsdom/.test(window.navigator.userAgent); diff --git a/packages/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx index abeab01c4098..016d93c357ef 100644 --- a/packages/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/editComponents.DataGridPro.test.tsx @@ -10,7 +10,7 @@ import { renderEditInputCell, renderEditSingleSelectCell, } from '@mui/x-data-grid-pro'; -import { act, createRenderer, fireEvent, screen, userEvent } from '@mui-internal/test-utils'; +import { act, createRenderer, fireEvent, screen, userEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { getCell, spyApi } from 'test/utils/helperFn'; import { spy, SinonSpy } from 'sinon'; diff --git a/packages/x-data-grid-pro/src/tests/events.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/events.DataGridPro.test.tsx index 0e58e190a945..9a3625a65509 100644 --- a/packages/x-data-grid-pro/src/tests/events.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/events.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGridPro, diff --git a/packages/x-data-grid-pro/src/tests/export.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/export.DataGridPro.test.tsx index a9868210ced8..883c1c1409c5 100644 --- a/packages/x-data-grid-pro/src/tests/export.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/export.DataGridPro.test.tsx @@ -5,7 +5,7 @@ import { GridApi, DataGridProProps, } from '@mui/x-data-grid-pro'; -import { createRenderer, act } from '@mui-internal/test-utils'; +import { createRenderer, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import * as React from 'react'; diff --git a/packages/x-data-grid-pro/src/tests/filterPanel.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/filterPanel.DataGridPro.test.tsx index d7f5333dfa1c..4b4722fe3a89 100644 --- a/packages/x-data-grid-pro/src/tests/filterPanel.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/filterPanel.DataGridPro.test.tsx @@ -7,7 +7,7 @@ import { GridApi, useGridApiRef, } from '@mui/x-data-grid-pro'; -import { createRenderer, act } from '@mui-internal/test-utils'; +import { createRenderer, act } from '@mui/internal-test-utils'; const isJSDOM = /jsdom/.test(window.navigator.userAgent); diff --git a/packages/x-data-grid-pro/src/tests/filtering.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/filtering.DataGridPro.test.tsx index 8c919672114a..9818caf94205 100644 --- a/packages/x-data-grid-pro/src/tests/filtering.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/filtering.DataGridPro.test.tsx @@ -15,8 +15,9 @@ import { gridExpandedSortedRowEntriesSelector, gridClasses, GridColDef, + getGridStringOperators, } from '@mui/x-data-grid-pro'; -import { createRenderer, fireEvent, screen, act, within } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act, within } from '@mui/internal-test-utils'; import { expect } from 'chai'; import * as React from 'react'; import { spy } from 'sinon'; @@ -1057,6 +1058,46 @@ describe('<DataGridPro /> - Filter', () => { expect(getColumnHeaderCell(0, 1).textContent).to.equal('Custom Input'); }); + + // See https://github.com/mui/mui-x/issues/13217 + it('should not throw when custom filter operator is used with an initilaized value', () => { + expect(() => { + render( + <TestCase + columns={[ + { + field: 'brand', + headerName: 'Brand', + filterOperators: [ + ...getGridStringOperators(), + { + value: 'looksLike', + label: 'Looks Like', + headerLabel: 'Looks Like', + getApplyFilterFn: () => () => true, + InputComponent: () => <div>Custom Input</div>, + }, + ], + }, + ]} + initialState={{ + filter: { + filterModel: { + items: [ + { + field: 'brand', + operator: 'looksLike', + value: 'a', + }, + ], + }, + }, + }} + headerFilters + />, + ); + }).not.toErrorDev(); + }); }); describe('Read-only filters', () => { diff --git a/packages/x-data-grid-pro/src/tests/infiniteLoader.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/infiniteLoader.DataGridPro.test.tsx index eb99be09db6d..3c941053e0f1 100644 --- a/packages/x-data-grid-pro/src/tests/infiniteLoader.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/infiniteLoader.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, waitFor } from '@mui-internal/test-utils'; +import { createRenderer, waitFor } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGridPro } from '@mui/x-data-grid-pro'; import { spy } from 'sinon'; diff --git a/packages/x-data-grid-pro/src/tests/layout.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/layout.DataGridPro.test.tsx index dc631df9fe10..34c8e9ded21f 100644 --- a/packages/x-data-grid-pro/src/tests/layout.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/layout.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, act } from '@mui-internal/test-utils'; +import { createRenderer, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { GridApi, useGridApiRef, DataGridPro, DataGridProProps } from '@mui/x-data-grid-pro'; diff --git a/packages/x-data-grid-pro/src/tests/lazyLoader.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/lazyLoader.DataGridPro.test.tsx index d39f33acb344..b7915e7c6878 100644 --- a/packages/x-data-grid-pro/src/tests/lazyLoader.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/lazyLoader.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act } from '@mui/internal-test-utils'; import { getColumnHeaderCell, getColumnValues, getRow } from 'test/utils/helperFn'; import { expect } from 'chai'; import { diff --git a/packages/x-data-grid-pro/src/tests/license.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/license.DataGridPro.test.tsx index 73fe3acb9445..0e4b3abd433b 100644 --- a/packages/x-data-grid-pro/src/tests/license.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/license.DataGridPro.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { createRenderer, screen, waitFor } from '@mui-internal/test-utils'; +import { createRenderer, screen, waitFor } from '@mui/internal-test-utils'; import { DataGridPro } from '@mui/x-data-grid-pro'; import { LicenseInfo } from '@mui/x-license'; diff --git a/packages/x-data-grid-pro/src/tests/pagination.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/pagination.DataGridPro.test.tsx index b236b2e80ea6..0f9a0952b616 100644 --- a/packages/x-data-grid-pro/src/tests/pagination.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/pagination.DataGridPro.test.tsx @@ -1,4 +1,4 @@ -import { createRenderer, act } from '@mui-internal/test-utils'; +import { createRenderer, act } from '@mui/internal-test-utils'; import { getColumnValues } from 'test/utils/helperFn'; import * as React from 'react'; import { expect } from 'chai'; diff --git a/packages/x-data-grid-pro/src/tests/printExport.DataGrid.test.tsx b/packages/x-data-grid-pro/src/tests/printExport.DataGrid.test.tsx index 5a5433fe409f..3b81cec4544f 100644 --- a/packages/x-data-grid-pro/src/tests/printExport.DataGrid.test.tsx +++ b/packages/x-data-grid-pro/src/tests/printExport.DataGrid.test.tsx @@ -9,7 +9,7 @@ import { DataGridProProps, } from '@mui/x-data-grid-pro'; import { getBasicGridData } from '@mui/x-data-grid-generator'; -import { createRenderer, screen, fireEvent, act } from '@mui-internal/test-utils'; +import { createRenderer, screen, fireEvent, act } from '@mui/internal-test-utils'; describe('<DataGridPro /> - Print export', () => { const { render, clock } = createRenderer(); diff --git a/packages/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx index b510d3bc63fd..ff073625b482 100644 --- a/packages/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/rowEditing.DataGridPro.test.tsx @@ -13,7 +13,7 @@ import { } from '@mui/x-data-grid-pro'; import Portal from '@mui/material/Portal'; import { getBasicGridData } from '@mui/x-data-grid-generator'; -import { createRenderer, fireEvent, act, userEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act, userEvent, screen } from '@mui/internal-test-utils'; import { getCell, getRow, spyApi } from 'test/utils/helperFn'; describe('<DataGridPro /> - Row editing', () => { diff --git a/packages/x-data-grid-pro/src/tests/rowPinning.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/rowPinning.DataGridPro.test.tsx index a8af181e101a..bb57b3b1aad8 100644 --- a/packages/x-data-grid-pro/src/tests/rowPinning.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/rowPinning.DataGridPro.test.tsx @@ -18,7 +18,7 @@ import { act, userEvent, waitFor, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { $, grid, diff --git a/packages/x-data-grid-pro/src/tests/rowReorder.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/rowReorder.DataGridPro.test.tsx index 481f269486ca..20c3b1ab0681 100644 --- a/packages/x-data-grid-pro/src/tests/rowReorder.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/rowReorder.DataGridPro.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { createRenderer, fireEvent, createEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, createEvent } from '@mui/internal-test-utils'; import { getCell, getRowsFieldContent } from 'test/utils/helperFn'; import { useGridApiRef, DataGridPro, gridClasses, GridApi } from '@mui/x-data-grid-pro'; import { useBasicDemoData } from '@mui/x-data-grid-generator'; diff --git a/packages/x-data-grid-pro/src/tests/rowSelection.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/rowSelection.DataGridPro.test.tsx index 7d480f5c9182..3c5eda242358 100644 --- a/packages/x-data-grid-pro/src/tests/rowSelection.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/rowSelection.DataGridPro.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; import { getCell, getColumnValues, getRows } from 'test/utils/helperFn'; -import { createRenderer, fireEvent, screen, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act } from '@mui/internal-test-utils'; import { GridApi, useGridApiRef, diff --git a/packages/x-data-grid-pro/src/tests/rows.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/rows.DataGridPro.test.tsx index 6c67c82437ef..f0704d4fb4fd 100644 --- a/packages/x-data-grid-pro/src/tests/rows.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/rows.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, act, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act, userEvent } from '@mui/internal-test-utils'; import { spy } from 'sinon'; import { expect } from 'chai'; import { diff --git a/packages/x-data-grid-pro/src/tests/sorting.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/sorting.DataGridPro.test.tsx index 0ef51f51fb71..f2778ad7cd93 100644 --- a/packages/x-data-grid-pro/src/tests/sorting.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/sorting.DataGridPro.test.tsx @@ -7,7 +7,7 @@ import { useGridApiRef, GridColDef, } from '@mui/x-data-grid-pro'; -import { createRenderer, fireEvent, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { spy } from 'sinon'; import { getColumnValues, getCell, getColumnHeaderCell } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid-pro/src/tests/state.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/state.DataGridPro.test.tsx index 4b5090b4e277..d19116820792 100644 --- a/packages/x-data-grid-pro/src/tests/state.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/state.DataGridPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen } from '@mui/internal-test-utils'; import { getColumnValues } from 'test/utils/helperFn'; import { expect } from 'chai'; import { DataGridPro, useGridApiRef, GridApi, DataGridProProps } from '@mui/x-data-grid-pro'; diff --git a/packages/x-data-grid-pro/src/tests/statePersistence.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/statePersistence.DataGridPro.test.tsx index 6472bd21f8df..637907681341 100644 --- a/packages/x-data-grid-pro/src/tests/statePersistence.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/statePersistence.DataGridPro.test.tsx @@ -10,7 +10,7 @@ import { GridRowsProp, useGridApiRef, } from '@mui/x-data-grid-pro'; -import { createRenderer, screen, act } from '@mui-internal/test-utils'; +import { createRenderer, screen, act } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { getColumnHeaderCell, diff --git a/packages/x-data-grid-pro/src/tests/treeData.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/treeData.DataGridPro.test.tsx index c6b60ed1fd4f..9f80a0d0858e 100644 --- a/packages/x-data-grid-pro/src/tests/treeData.DataGridPro.test.tsx +++ b/packages/x-data-grid-pro/src/tests/treeData.DataGridPro.test.tsx @@ -1,4 +1,4 @@ -import { createRenderer, fireEvent, screen, act, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act, userEvent } from '@mui/internal-test-utils'; import { getCell, getColumnHeaderCell, diff --git a/packages/x-data-grid-pro/tsconfig.json b/packages/x-data-grid-pro/tsconfig.json index 1c24452d71f8..aba8438e2441 100644 --- a/packages/x-data-grid-pro/tsconfig.json +++ b/packages/x-data-grid-pro/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["@mui/material/themeCssVarsAugmentation"] + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha" + ] }, "include": ["src/**/*"] } diff --git a/packages/x-data-grid/package.json b/packages/x-data-grid/package.json index f224008cdcf2..1a1653e81320 100644 --- a/packages/x-data-grid/package.json +++ b/packages/x-data-grid/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-data-grid", - "version": "7.5.0", + "version": "7.6.2", "description": "The Community plan edition of the Data Grid components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -47,8 +47,8 @@ "directory": "packages/x-data-grid" }, "dependencies": { - "@babel/runtime": "^7.24.5", - "@mui/system": "^5.15.14", + "@babel/runtime": "^7.24.6", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -60,10 +60,11 @@ "react-dom": "^17.0.0 || ^18.0.0" }, "devDependencies": { - "@mui/joy": "^5.0.0-beta.24", + "@mui/internal-test-utils": "1.0.0", + "@mui/joy": "5.0.0-beta.32", "@mui/types": "^7.2.14", "@types/prop-types": "^15.7.12", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-data-grid/src/DataGrid/DataGrid.tsx b/packages/x-data-grid/src/DataGrid/DataGrid.tsx index 1ba6770356ac..7c567b6774a2 100644 --- a/packages/x-data-grid/src/DataGrid/DataGrid.tsx +++ b/packages/x-data-grid/src/DataGrid/DataGrid.tsx @@ -80,7 +80,7 @@ export const DataGrid = React.memo(DataGridRaw) as DataGridComponent; DataGridRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The ref object that allows Data Grid manipulation. Can be instantiated with `useGridApiRef()`. @@ -97,7 +97,7 @@ DataGridRaw.propTypes = { */ 'aria-labelledby': PropTypes.string, /** - * If `true`, the Data Grid height is dynamic and follow the number of rows in the Data Grid. + * If `true`, the Data Grid height is dynamic and follows the number of rows in the Data Grid. * @default false */ autoHeight: PropTypes.bool, diff --git a/packages/x-data-grid/src/components/GridColumnHeaders.tsx b/packages/x-data-grid/src/components/GridColumnHeaders.tsx index 8f737ae942df..460902b9690f 100644 --- a/packages/x-data-grid/src/components/GridColumnHeaders.tsx +++ b/packages/x-data-grid/src/components/GridColumnHeaders.tsx @@ -59,7 +59,7 @@ const GridColumnHeaders = React.forwardRef<HTMLDivElement, GridColumnHeadersProp GridColumnHeaders.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- columnGroupHeaderFocus: PropTypes.shape({ depth: PropTypes.number.isRequired, diff --git a/packages/x-data-grid/src/components/GridFooter.tsx b/packages/x-data-grid/src/components/GridFooter.tsx index 23e6a8dcfc85..8f8ee151fee2 100644 --- a/packages/x-data-grid/src/components/GridFooter.tsx +++ b/packages/x-data-grid/src/components/GridFooter.tsx @@ -52,7 +52,7 @@ const GridFooter = React.forwardRef<HTMLDivElement, GridFooterContainerProps>( GridFooter.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/GridLoadingOverlay.tsx b/packages/x-data-grid/src/components/GridLoadingOverlay.tsx index 8e7e4ea35234..2bcb4eed7a89 100644 --- a/packages/x-data-grid/src/components/GridLoadingOverlay.tsx +++ b/packages/x-data-grid/src/components/GridLoadingOverlay.tsx @@ -16,7 +16,7 @@ const GridLoadingOverlay = React.forwardRef<HTMLDivElement, GridOverlayProps>( GridLoadingOverlay.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/GridNoRowsOverlay.tsx b/packages/x-data-grid/src/components/GridNoRowsOverlay.tsx index 341d496ee4ce..1d27e2b081a1 100644 --- a/packages/x-data-grid/src/components/GridNoRowsOverlay.tsx +++ b/packages/x-data-grid/src/components/GridNoRowsOverlay.tsx @@ -19,7 +19,7 @@ const GridNoRowsOverlay = React.forwardRef<HTMLDivElement, GridOverlayProps>( GridNoRowsOverlay.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/GridPagination.tsx b/packages/x-data-grid/src/components/GridPagination.tsx index 8a5c5fd0e763..e4ff7b2953c9 100644 --- a/packages/x-data-grid/src/components/GridPagination.tsx +++ b/packages/x-data-grid/src/components/GridPagination.tsx @@ -177,7 +177,7 @@ const GridPagination = React.forwardRef< GridPagination.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- component: PropTypes.elementType, } as any; diff --git a/packages/x-data-grid/src/components/GridRow.tsx b/packages/x-data-grid/src/components/GridRow.tsx index 5e9854587a4e..134786356f65 100644 --- a/packages/x-data-grid/src/components/GridRow.tsx +++ b/packages/x-data-grid/src/components/GridRow.tsx @@ -177,13 +177,6 @@ const GridRow = React.forwardRef<HTMLDivElement, GridRowProps>(function GridRow( const classes = useUtilityClasses(ownerState); - React.useLayoutEffect(() => { - if (rowHeight === 'auto' && ref.current && typeof ResizeObserver === 'undefined') { - // Fallback for IE - apiRef.current.unstable_storeRowHeightMeasurement(rowId, ref.current.clientHeight); - } - }, [apiRef, rowHeight, rowId]); - React.useLayoutEffect(() => { if (currentPage.range) { // The index prop is relative to the rows from all pages. As example, the index prop of the @@ -534,7 +527,7 @@ const GridRow = React.forwardRef<HTMLDivElement, GridRowProps>(function GridRow( GridRow.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- dimensions: PropTypes.shape({ bottomContainerHeight: PropTypes.number.isRequired, diff --git a/packages/x-data-grid/src/components/GridRowCount.tsx b/packages/x-data-grid/src/components/GridRowCount.tsx index bbff5190068b..e032ae6c443f 100644 --- a/packages/x-data-grid/src/components/GridRowCount.tsx +++ b/packages/x-data-grid/src/components/GridRowCount.tsx @@ -72,7 +72,7 @@ const GridRowCount = React.forwardRef<HTMLDivElement, GridRowCountProps>( GridRowCount.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- rowCount: PropTypes.number.isRequired, sx: PropTypes.oneOfType([ diff --git a/packages/x-data-grid/src/components/GridScrollArea.tsx b/packages/x-data-grid/src/components/GridScrollArea.tsx index 59752fd21305..9b0cc4e330b1 100644 --- a/packages/x-data-grid/src/components/GridScrollArea.tsx +++ b/packages/x-data-grid/src/components/GridScrollArea.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import PropTypes from 'prop-types'; import clsx from 'clsx'; import { unstable_composeClasses as composeClasses, @@ -170,14 +169,4 @@ function GridScrollAreaRaw(props: ScrollAreaProps) { ); } -GridScrollAreaRaw.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - scrollDirection: PropTypes.oneOf(['left', 'right']).isRequired, -} as any; - -const GridScrollArea = fastMemo(GridScrollAreaRaw); - -export { GridScrollArea }; +export const GridScrollArea = fastMemo(GridScrollAreaRaw); diff --git a/packages/x-data-grid/src/components/GridSelectedRowCount.tsx b/packages/x-data-grid/src/components/GridSelectedRowCount.tsx index c389b75a03b7..0b1f98a07bed 100644 --- a/packages/x-data-grid/src/components/GridSelectedRowCount.tsx +++ b/packages/x-data-grid/src/components/GridSelectedRowCount.tsx @@ -71,7 +71,7 @@ const GridSelectedRowCount = React.forwardRef<HTMLDivElement, GridSelectedRowCou GridSelectedRowCount.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- selectedRowCount: PropTypes.number.isRequired, sx: PropTypes.oneOfType([ diff --git a/packages/x-data-grid/src/components/base/GridOverlays.tsx b/packages/x-data-grid/src/components/base/GridOverlays.tsx index 2cf1331342cd..2e214bc219ff 100644 --- a/packages/x-data-grid/src/components/base/GridOverlays.tsx +++ b/packages/x-data-grid/src/components/base/GridOverlays.tsx @@ -88,7 +88,7 @@ function GridOverlayWrapper(props: React.PropsWithChildren<{ overlayType: string GridOverlayWrapper.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- overlayType: PropTypes.string.isRequired, } as any; diff --git a/packages/x-data-grid/src/components/cell/GridActionsCell.tsx b/packages/x-data-grid/src/components/cell/GridActionsCell.tsx index 9030408f0339..2abc7adc0e45 100644 --- a/packages/x-data-grid/src/components/cell/GridActionsCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridActionsCell.tsx @@ -245,7 +245,7 @@ function GridActionsCell(props: GridActionsCellProps) { GridActionsCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- api: PropTypes.object, /** diff --git a/packages/x-data-grid/src/components/cell/GridActionsCellItem.tsx b/packages/x-data-grid/src/components/cell/GridActionsCellItem.tsx index d11bd15188a0..3d39805c11f0 100644 --- a/packages/x-data-grid/src/components/cell/GridActionsCellItem.tsx +++ b/packages/x-data-grid/src/components/cell/GridActionsCellItem.tsx @@ -81,7 +81,7 @@ const GridActionsCellItem = React.forwardRef<HTMLElement, GridActionsCellItemPro GridActionsCellItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * from https://mui.com/material-ui/api/button-base/#ButtonBase-prop-component diff --git a/packages/x-data-grid/src/components/cell/GridBooleanCell.tsx b/packages/x-data-grid/src/components/cell/GridBooleanCell.tsx index bb750606dd1f..3a6ba22174f2 100644 --- a/packages/x-data-grid/src/components/cell/GridBooleanCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridBooleanCell.tsx @@ -70,7 +70,7 @@ function GridBooleanCellRaw(props: GridBooleanCellProps) { GridBooleanCellRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid/src/components/cell/GridCell.tsx b/packages/x-data-grid/src/components/cell/GridCell.tsx index 81a23061e4da..2a196dccb5a7 100644 --- a/packages/x-data-grid/src/components/cell/GridCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridCell.tsx @@ -146,7 +146,7 @@ let warnedOnce = false; // TODO(v7): Removing the wrapper will break the docs performance visualization demo. -const GridCell = React.forwardRef<HTMLDivElement, GridCellProps>((props, ref) => { +const GridCell = React.forwardRef<HTMLDivElement, GridCellProps>(function GridCell(props, ref) { const { column, rowId, @@ -484,7 +484,7 @@ const GridCell = React.forwardRef<HTMLDivElement, GridCellProps>((props, ref) => GridCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- align: PropTypes.oneOf(['center', 'left', 'right']).isRequired, className: PropTypes.string, diff --git a/packages/x-data-grid/src/components/cell/GridEditBooleanCell.tsx b/packages/x-data-grid/src/components/cell/GridEditBooleanCell.tsx index 6bcc1af78acc..36353890fd0e 100644 --- a/packages/x-data-grid/src/components/cell/GridEditBooleanCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridEditBooleanCell.tsx @@ -113,7 +113,7 @@ function GridEditBooleanCell(props: GridEditBooleanCellProps) { GridEditBooleanCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid/src/components/cell/GridEditDateCell.tsx b/packages/x-data-grid/src/components/cell/GridEditDateCell.tsx index 0e46299cb5c0..0927583c5aab 100644 --- a/packages/x-data-grid/src/components/cell/GridEditDateCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridEditDateCell.tsx @@ -170,7 +170,7 @@ function GridEditDateCell(props: GridEditDateCellProps) { GridEditDateCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid/src/components/cell/GridEditInputCell.tsx b/packages/x-data-grid/src/components/cell/GridEditInputCell.tsx index 104f90d489ca..aae349be5ed3 100644 --- a/packages/x-data-grid/src/components/cell/GridEditInputCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridEditInputCell.tsx @@ -144,7 +144,7 @@ const GridEditInputCell = React.forwardRef<HTMLInputElement, GridEditInputCellPr GridEditInputCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid/src/components/cell/GridEditSingleSelectCell.tsx b/packages/x-data-grid/src/components/cell/GridEditSingleSelectCell.tsx index 0f0ac6412031..328bd0110969 100644 --- a/packages/x-data-grid/src/components/cell/GridEditSingleSelectCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridEditSingleSelectCell.tsx @@ -172,7 +172,7 @@ function GridEditSingleSelectCell(props: GridEditSingleSelectCellProps) { GridEditSingleSelectCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid/src/components/cell/GridSkeletonCell.tsx b/packages/x-data-grid/src/components/cell/GridSkeletonCell.tsx index 66f7fe4ffaf4..fef4188a67f0 100644 --- a/packages/x-data-grid/src/components/cell/GridSkeletonCell.tsx +++ b/packages/x-data-grid/src/components/cell/GridSkeletonCell.tsx @@ -51,7 +51,7 @@ function GridSkeletonCell(props: React.HTMLAttributes<HTMLDivElement> & GridSkel GridSkeletonCell.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- align: PropTypes.string.isRequired, field: PropTypes.string.isRequired, diff --git a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderFilterIconButton.tsx b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderFilterIconButton.tsx index d9e8e77041db..d48bc0ccdfe2 100644 --- a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderFilterIconButton.tsx +++ b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderFilterIconButton.tsx @@ -111,7 +111,7 @@ function GridColumnHeaderFilterIconButton(props: ColumnHeaderFilterIconButtonPro GridColumnHeaderFilterIconButton.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- counter: PropTypes.number, field: PropTypes.string.isRequired, diff --git a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderItem.tsx b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderItem.tsx index e11e6b273345..2822705bf090 100644 --- a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderItem.tsx +++ b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderItem.tsx @@ -312,7 +312,7 @@ function GridColumnHeaderItem(props: GridColumnHeaderItemProps) { GridColumnHeaderItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, colIndex: PropTypes.number.isRequired, diff --git a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSeparator.tsx b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSeparator.tsx index ea85556f5675..43957b0eaba7 100644 --- a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSeparator.tsx +++ b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSeparator.tsx @@ -75,7 +75,7 @@ const GridColumnHeaderSeparator = React.memo(GridColumnHeaderSeparatorRaw); GridColumnHeaderSeparatorRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- height: PropTypes.number.isRequired, resizable: PropTypes.bool.isRequired, diff --git a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSortIcon.tsx b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSortIcon.tsx index b260a6af5772..d9e069df341a 100644 --- a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSortIcon.tsx +++ b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderSortIcon.tsx @@ -93,7 +93,7 @@ const GridColumnHeaderSortIcon = React.memo(GridColumnHeaderSortIconRaw); GridColumnHeaderSortIconRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- direction: PropTypes.oneOf(['asc', 'desc']), disabled: PropTypes.bool, diff --git a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderTitle.tsx b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderTitle.tsx index 3f62816621fe..7faef9a89489 100644 --- a/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderTitle.tsx +++ b/packages/x-data-grid/src/components/columnHeaders/GridColumnHeaderTitle.tsx @@ -88,7 +88,7 @@ function GridColumnHeaderTitle(props: GridColumnHeaderTitleProps) { GridColumnHeaderTitle.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- columnWidth: PropTypes.number.isRequired, description: PropTypes.node, diff --git a/packages/x-data-grid/src/components/columnHeaders/GridGenericColumnHeaderItem.tsx b/packages/x-data-grid/src/components/columnHeaders/GridGenericColumnHeaderItem.tsx index 7b1111733f9e..f7a9978c767e 100644 --- a/packages/x-data-grid/src/components/columnHeaders/GridGenericColumnHeaderItem.tsx +++ b/packages/x-data-grid/src/components/columnHeaders/GridGenericColumnHeaderItem.tsx @@ -76,7 +76,6 @@ const GridGenericColumnHeaderItem = React.forwardRef(function GridGenericColumnH const apiRef = useGridPrivateApiContext(); const rootProps = useGridRootProps(); const headerCellRef = React.useRef<HTMLDivElement>(null); - const [showColumnMenuIcon, setShowColumnMenuIcon] = React.useState(columnMenuOpen); const handleRef = useForkRef(headerCellRef, ref); @@ -85,12 +84,6 @@ const GridGenericColumnHeaderItem = React.forwardRef(function GridGenericColumnH ariaSort = sortDirection === 'asc' ? 'ascending' : 'descending'; } - React.useEffect(() => { - if (!showColumnMenuIcon) { - setShowColumnMenuIcon(columnMenuOpen); - } - }, [showColumnMenuIcon, columnMenuOpen]); - React.useLayoutEffect(() => { const columnMenuState = apiRef.current.state.columnMenu; if (hasFocus && !columnMenuState.open) { diff --git a/packages/x-data-grid/src/components/columnSelection/GridCellCheckboxRenderer.tsx b/packages/x-data-grid/src/components/columnSelection/GridCellCheckboxRenderer.tsx index 3cc175945a20..377713f3bb3b 100644 --- a/packages/x-data-grid/src/components/columnSelection/GridCellCheckboxRenderer.tsx +++ b/packages/x-data-grid/src/components/columnSelection/GridCellCheckboxRenderer.tsx @@ -116,7 +116,7 @@ const GridCellCheckboxForwardRef = React.forwardRef<HTMLInputElement, GridRender GridCellCheckboxForwardRef.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * GridApi that let you manipulate the grid. diff --git a/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx b/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx index 215608379c39..47ee8b35b92b 100644 --- a/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx +++ b/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx @@ -150,7 +150,7 @@ const GridHeaderCheckbox = React.forwardRef<HTMLButtonElement, GridColumnHeaderP GridHeaderCheckbox.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The column of the current header component. diff --git a/packages/x-data-grid/src/components/columnsManagement/GridColumnsManagement.tsx b/packages/x-data-grid/src/components/columnsManagement/GridColumnsManagement.tsx index 7230fb48e412..7fdf409c4811 100644 --- a/packages/x-data-grid/src/components/columnsManagement/GridColumnsManagement.tsx +++ b/packages/x-data-grid/src/components/columnsManagement/GridColumnsManagement.tsx @@ -294,7 +294,7 @@ function GridColumnsManagement(props: GridColumnsManagementProps) { GridColumnsManagement.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the column search field will be focused automatically. diff --git a/packages/x-data-grid/src/components/containers/GridFooterContainer.tsx b/packages/x-data-grid/src/components/containers/GridFooterContainer.tsx index d6a7cbe1ea4a..ef1f96f32fe1 100644 --- a/packages/x-data-grid/src/components/containers/GridFooterContainer.tsx +++ b/packages/x-data-grid/src/components/containers/GridFooterContainer.tsx @@ -55,7 +55,7 @@ const GridFooterContainer = React.forwardRef<HTMLDivElement, GridFooterContainer GridFooterContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/containers/GridOverlay.tsx b/packages/x-data-grid/src/components/containers/GridOverlay.tsx index fd7167275ac4..5a48306eaeab 100644 --- a/packages/x-data-grid/src/components/containers/GridOverlay.tsx +++ b/packages/x-data-grid/src/components/containers/GridOverlay.tsx @@ -58,7 +58,7 @@ const GridOverlay = React.forwardRef<HTMLDivElement, GridOverlayProps>(function GridOverlay.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/containers/GridRoot.tsx b/packages/x-data-grid/src/components/containers/GridRoot.tsx index a8e56cecfc30..d141c5a0f6b5 100644 --- a/packages/x-data-grid/src/components/containers/GridRoot.tsx +++ b/packages/x-data-grid/src/components/containers/GridRoot.tsx @@ -92,7 +92,7 @@ const GridRoot = React.forwardRef<HTMLDivElement, GridRootProps>(function GridRo GridRoot.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The system prop that allows defining system overrides as well as additional CSS styles. diff --git a/packages/x-data-grid/src/components/containers/GridToolbarContainer.tsx b/packages/x-data-grid/src/components/containers/GridToolbarContainer.tsx index 313b5d1994d5..c291bd10796e 100644 --- a/packages/x-data-grid/src/components/containers/GridToolbarContainer.tsx +++ b/packages/x-data-grid/src/components/containers/GridToolbarContainer.tsx @@ -60,7 +60,7 @@ const GridToolbarContainer = React.forwardRef<HTMLDivElement, GridToolbarContain GridToolbarContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/menu/GridMenu.tsx b/packages/x-data-grid/src/components/menu/GridMenu.tsx index cc00c12dae5d..5c338398ba4d 100644 --- a/packages/x-data-grid/src/components/menu/GridMenu.tsx +++ b/packages/x-data-grid/src/components/menu/GridMenu.tsx @@ -138,7 +138,7 @@ function GridMenu(props: GridMenuProps) { GridMenu.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, onClose: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/GridColumnHeaderMenu.tsx b/packages/x-data-grid/src/components/menu/columnMenu/GridColumnHeaderMenu.tsx index 13a4cd36e502..7edb89bed306 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/GridColumnHeaderMenu.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/GridColumnHeaderMenu.tsx @@ -67,7 +67,7 @@ function GridColumnHeaderMenu({ GridColumnHeaderMenu.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- columnMenuButtonId: PropTypes.string, columnMenuId: PropTypes.string, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenu.tsx b/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenu.tsx index 882d8e879c8a..3842fe844f93 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenu.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenu.tsx @@ -58,7 +58,7 @@ const GridColumnMenu = React.forwardRef<HTMLUListElement, GridColumnMenuProps>( GridColumnMenu.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, hideMenu: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenuContainer.tsx b/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenuContainer.tsx index fdb51803c566..7e283fc151ca 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenuContainer.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/GridColumnMenuContainer.tsx @@ -47,7 +47,7 @@ const GridColumnMenuContainer = React.forwardRef<HTMLUListElement, GridColumnMen GridColumnMenuContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, hideMenu: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuColumnsItem.tsx b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuColumnsItem.tsx index 5cf4355d3a43..905eb54bba3f 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuColumnsItem.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuColumnsItem.tsx @@ -16,7 +16,7 @@ function GridColumnMenuColumnsItem(props: GridColumnMenuItemProps) { GridColumnMenuColumnsItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuFilterItem.tsx b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuFilterItem.tsx index 92092fc3d8a7..d86f61e78098 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuFilterItem.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuFilterItem.tsx @@ -37,7 +37,7 @@ function GridColumnMenuFilterItem(props: GridColumnMenuItemProps) { GridColumnMenuFilterItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuHideItem.tsx b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuHideItem.tsx index ae311bdca443..ce7660929312 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuHideItem.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuHideItem.tsx @@ -55,7 +55,7 @@ function GridColumnMenuHideItem(props: GridColumnMenuItemProps) { GridColumnMenuHideItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuManageItem.tsx b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuManageItem.tsx index ebe0e18edde6..860751420dda 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuManageItem.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuManageItem.tsx @@ -38,7 +38,7 @@ function GridColumnMenuManageItem(props: GridColumnMenuItemProps) { GridColumnMenuManageItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.tsx b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.tsx index dfd75a44b47a..de67a637774e 100644 --- a/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.tsx +++ b/packages/x-data-grid/src/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.tsx @@ -83,7 +83,7 @@ function GridColumnMenuSortItem(props: GridColumnMenuItemProps) { GridColumnMenuSortItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- colDef: PropTypes.object.isRequired, onClick: PropTypes.func.isRequired, diff --git a/packages/x-data-grid/src/components/panel/GridColumnsPanel.tsx b/packages/x-data-grid/src/components/panel/GridColumnsPanel.tsx index 449133c41666..763077ef3a91 100644 --- a/packages/x-data-grid/src/components/panel/GridColumnsPanel.tsx +++ b/packages/x-data-grid/src/components/panel/GridColumnsPanel.tsx @@ -18,7 +18,7 @@ function GridColumnsPanel(props: GridColumnsPanelProps) { GridColumnsPanel.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- slotProps: PropTypes.object, } as any; diff --git a/packages/x-data-grid/src/components/panel/GridPanel.test.tsx b/packages/x-data-grid/src/components/panel/GridPanel.test.tsx index 35da4139dd1f..225f13469abf 100644 --- a/packages/x-data-grid/src/components/panel/GridPanel.test.tsx +++ b/packages/x-data-grid/src/components/panel/GridPanel.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { GridPanel, gridPanelClasses as classes, diff --git a/packages/x-data-grid/src/components/panel/GridPanel.tsx b/packages/x-data-grid/src/components/panel/GridPanel.tsx index a169fd4ea6c1..a82b53b37c7a 100644 --- a/packages/x-data-grid/src/components/panel/GridPanel.tsx +++ b/packages/x-data-grid/src/components/panel/GridPanel.tsx @@ -139,7 +139,7 @@ const GridPanel = React.forwardRef<HTMLDivElement, GridPanelProps>((props, ref) GridPanel.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Popper render function or node. diff --git a/packages/x-data-grid/src/components/panel/GridPanelContent.tsx b/packages/x-data-grid/src/components/panel/GridPanelContent.tsx index 6541ce3b64d4..2e373a71ab0b 100644 --- a/packages/x-data-grid/src/components/panel/GridPanelContent.tsx +++ b/packages/x-data-grid/src/components/panel/GridPanelContent.tsx @@ -48,7 +48,7 @@ function GridPanelContent(props: React.HTMLAttributes<HTMLDivElement> & { sx?: S GridPanelContent.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/panel/GridPanelFooter.tsx b/packages/x-data-grid/src/components/panel/GridPanelFooter.tsx index 6104beaeb21c..df96cce1c7f9 100644 --- a/packages/x-data-grid/src/components/panel/GridPanelFooter.tsx +++ b/packages/x-data-grid/src/components/panel/GridPanelFooter.tsx @@ -46,7 +46,7 @@ function GridPanelFooter(props: React.HTMLAttributes<HTMLDivElement> & { sx?: Sx GridPanelFooter.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/panel/GridPanelHeader.tsx b/packages/x-data-grid/src/components/panel/GridPanelHeader.tsx index 5c25eeb540f9..23ad3f025218 100644 --- a/packages/x-data-grid/src/components/panel/GridPanelHeader.tsx +++ b/packages/x-data-grid/src/components/panel/GridPanelHeader.tsx @@ -44,7 +44,7 @@ function GridPanelHeader(props: React.HTMLAttributes<HTMLDivElement> & { sx?: Sx GridPanelHeader.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- sx: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), diff --git a/packages/x-data-grid/src/components/panel/GridPanelWrapper.tsx b/packages/x-data-grid/src/components/panel/GridPanelWrapper.tsx index c9361e118ed1..455a3e474a76 100644 --- a/packages/x-data-grid/src/components/panel/GridPanelWrapper.tsx +++ b/packages/x-data-grid/src/components/panel/GridPanelWrapper.tsx @@ -67,7 +67,7 @@ const GridPanelWrapper = React.forwardRef<HTMLDivElement, GridPanelWrapperProps> GridPanelWrapper.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- slotProps: PropTypes.object, } as any; diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterForm.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterForm.tsx index 9ff36187ec42..9df9f570d18e 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterForm.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterForm.tsx @@ -615,7 +615,7 @@ const GridFilterForm = React.forwardRef<HTMLDivElement, GridFilterFormProps>( GridFilterForm.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Callback called when the operator, column field or value is changed. diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputBoolean.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputBoolean.tsx index 1dc95b695313..89d0a2114e33 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputBoolean.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputBoolean.tsx @@ -123,7 +123,7 @@ function GridFilterInputBoolean(props: GridFilterInputBooleanProps) { GridFilterInputBoolean.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- apiRef: PropTypes.shape({ current: PropTypes.object.isRequired, diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputDate.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputDate.tsx index f583c4f8860c..0005842a9f18 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputDate.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputDate.tsx @@ -126,7 +126,7 @@ function GridFilterInputDate(props: GridFilterInputDateProps) { GridFilterInputDate.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- apiRef: PropTypes.shape({ current: PropTypes.object.isRequired, diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.tsx index f6ba9e0b2a19..0e1674bb1255 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.tsx @@ -108,14 +108,18 @@ function GridFilterInputMultipleSingleSelect(props: GridFilterInputMultipleSingl onChange={handleChange} getOptionLabel={getOptionLabel} renderTags={(value, getTagProps) => - value.map((option, index) => ( - <rootProps.slots.baseChip - variant="outlined" - size="small" - label={getOptionLabel(option)} - {...getTagProps({ index })} - /> - )) + value.map((option, index) => { + const { key, ...tagProps } = getTagProps({ index }); + return ( + <rootProps.slots.baseChip + key={key} + variant="outlined" + size="small" + label={getOptionLabel(option)} + {...tagProps} + /> + ); + }) } renderInput={(params) => ( <rootProps.slots.baseTextField @@ -140,7 +144,7 @@ function GridFilterInputMultipleSingleSelect(props: GridFilterInputMultipleSingl GridFilterInputMultipleSingleSelect.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- apiRef: PropTypes.shape({ current: PropTypes.object.isRequired, diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleValue.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleValue.tsx index eb8bac5c6514..0d39447e61c7 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleValue.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputMultipleValue.tsx @@ -97,7 +97,7 @@ function GridFilterInputMultipleValue(props: GridFilterInputMultipleValueProps) GridFilterInputMultipleValue.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- apiRef: PropTypes.shape({ current: PropTypes.object.isRequired, diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputSingleSelect.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputSingleSelect.tsx index 6836f735cb51..d88468fb9cd1 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputSingleSelect.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputSingleSelect.tsx @@ -171,7 +171,7 @@ function GridFilterInputSingleSelect(props: GridFilterInputSingleSelectProps) { GridFilterInputSingleSelect.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- apiRef: PropTypes.shape({ current: PropTypes.object.isRequired, diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputValue.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputValue.tsx index 4ee1baf459bf..a16cc1a850dd 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputValue.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterInputValue.tsx @@ -102,7 +102,7 @@ function GridFilterInputValue(props: GridTypeFilterInputValueProps) { GridFilterInputValue.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- apiRef: PropTypes.shape({ current: PropTypes.object.isRequired, diff --git a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterPanel.tsx b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterPanel.tsx index a4d1deba6864..fa5bdeabb4ea 100644 --- a/packages/x-data-grid/src/components/panel/filterPanel/GridFilterPanel.tsx +++ b/packages/x-data-grid/src/components/panel/filterPanel/GridFilterPanel.tsx @@ -304,7 +304,7 @@ const GridFilterPanel = React.forwardRef<HTMLDivElement, GridFilterPanelProps>( GridFilterPanel.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * @ignore - do not document. diff --git a/packages/x-data-grid/src/components/toolbar/GridToolbar.tsx b/packages/x-data-grid/src/components/toolbar/GridToolbar.tsx index aa86e75b367d..216335a99ba3 100644 --- a/packages/x-data-grid/src/components/toolbar/GridToolbar.tsx +++ b/packages/x-data-grid/src/components/toolbar/GridToolbar.tsx @@ -71,7 +71,7 @@ const GridToolbar = React.forwardRef<HTMLDivElement, GridToolbarProps>( GridToolbar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Props passed to the quick filter component. diff --git a/packages/x-data-grid/src/components/toolbar/GridToolbarColumnsButton.tsx b/packages/x-data-grid/src/components/toolbar/GridToolbarColumnsButton.tsx index ddb6e36e49c2..67a176845fac 100644 --- a/packages/x-data-grid/src/components/toolbar/GridToolbarColumnsButton.tsx +++ b/packages/x-data-grid/src/components/toolbar/GridToolbarColumnsButton.tsx @@ -83,7 +83,7 @@ const GridToolbarColumnsButton = React.forwardRef<HTMLButtonElement, GridToolbar GridToolbarColumnsButton.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The props used for each slot inside. diff --git a/packages/x-data-grid/src/components/toolbar/GridToolbarDensitySelector.tsx b/packages/x-data-grid/src/components/toolbar/GridToolbarDensitySelector.tsx index 4c790f2ee720..26b3fc9e9622 100644 --- a/packages/x-data-grid/src/components/toolbar/GridToolbarDensitySelector.tsx +++ b/packages/x-data-grid/src/components/toolbar/GridToolbarDensitySelector.tsx @@ -154,7 +154,7 @@ const GridToolbarDensitySelector = React.forwardRef< GridToolbarDensitySelector.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The props used for each slot inside. diff --git a/packages/x-data-grid/src/components/toolbar/GridToolbarExport.tsx b/packages/x-data-grid/src/components/toolbar/GridToolbarExport.tsx index ee6ff918006e..855233ca9ecc 100644 --- a/packages/x-data-grid/src/components/toolbar/GridToolbarExport.tsx +++ b/packages/x-data-grid/src/components/toolbar/GridToolbarExport.tsx @@ -96,7 +96,7 @@ const GridToolbarExport = React.forwardRef<HTMLButtonElement, GridToolbarExportP GridToolbarExport.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- csvOptions: PropTypes.object, printOptions: PropTypes.object, diff --git a/packages/x-data-grid/src/components/toolbar/GridToolbarExportContainer.tsx b/packages/x-data-grid/src/components/toolbar/GridToolbarExportContainer.tsx index ac46a7281e0e..879e6ed01221 100644 --- a/packages/x-data-grid/src/components/toolbar/GridToolbarExportContainer.tsx +++ b/packages/x-data-grid/src/components/toolbar/GridToolbarExportContainer.tsx @@ -107,7 +107,7 @@ const GridToolbarExportContainer = React.forwardRef< GridToolbarExportContainer.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The props used for each slot inside. diff --git a/packages/x-data-grid/src/components/toolbar/GridToolbarFilterButton.tsx b/packages/x-data-grid/src/components/toolbar/GridToolbarFilterButton.tsx index 27e41315efab..2e286a44519d 100644 --- a/packages/x-data-grid/src/components/toolbar/GridToolbarFilterButton.tsx +++ b/packages/x-data-grid/src/components/toolbar/GridToolbarFilterButton.tsx @@ -162,7 +162,7 @@ const GridToolbarFilterButton = React.forwardRef<HTMLButtonElement, GridToolbarF GridToolbarFilterButton.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The props used for each slot inside. diff --git a/packages/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx b/packages/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx index 31c0425dbd11..8881a0a86f24 100644 --- a/packages/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx +++ b/packages/x-data-grid/src/components/toolbar/GridToolbarQuickFilter.tsx @@ -39,13 +39,6 @@ const GridToolbarQuickFilterRoot = styled(TextField, { '& .MuiInput-underline:before': { borderBottom: `1px solid ${(theme.vars || theme).palette.divider}`, }, - [`& input[type=search]::-ms-clear, -& input[type=search]::-ms-reveal`]: { - /* clears the 'X' icon from IE */ - display: 'none', - width: 0, - height: 0, - }, [`& input[type="search"]::-webkit-search-decoration, & input[type="search"]::-webkit-search-cancel-button, & input[type="search"]::-webkit-search-results-button, @@ -181,7 +174,7 @@ function GridToolbarQuickFilter(props: GridToolbarQuickFilterProps) { GridToolbarQuickFilter.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The debounce time in milliseconds. diff --git a/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts b/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts index ee308a38076d..35e8e6081f97 100644 --- a/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts +++ b/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts @@ -95,18 +95,21 @@ export const useGridClipboard = ( if (selectedRows.size > 0) { textToCopy = apiRef.current.getDataAsCsv({ includeHeaders: false, - // TODO: make it configurable delimiter: clipboardCopyCellDelimiter, shouldAppendQuotes: false, + escapeFormulas: false, }); } else { const focusedCell = gridFocusCellSelector(apiRef); if (focusedCell) { const cellParams = apiRef.current.getCellParams(focusedCell.id, focusedCell.field); textToCopy = serializeCellValue(cellParams, { - delimiterCharacter: clipboardCopyCellDelimiter, + csvOptions: { + delimiter: clipboardCopyCellDelimiter, + shouldAppendQuotes: false, + escapeFormulas: false, + }, ignoreValueFormatter, - shouldAppendQuotes: false, }); } } diff --git a/packages/x-data-grid/src/hooks/features/columnResize/useGridColumnResize.tsx b/packages/x-data-grid/src/hooks/features/columnResize/useGridColumnResize.tsx index e4d3c51d905e..f90184394445 100644 --- a/packages/x-data-grid/src/hooks/features/columnResize/useGridColumnResize.tsx +++ b/packages/x-data-grid/src/hooks/features/columnResize/useGridColumnResize.tsx @@ -19,6 +19,7 @@ import { findParentElementFromClassName, findLeftPinnedHeadersAfterCol, findRightPinnedHeadersBeforeCol, + escapeOperandAttributeSelector, } from '../../../utils/domUtils'; import { GridAutosizeOptions, @@ -57,28 +58,6 @@ type AutosizeOptionsRequired = Required<GridAutosizeOptions>; type ResizeDirection = keyof typeof GridColumnHeaderSeparatorSides; -// TODO: remove support for Safari < 13. -// https://caniuse.com/#search=touch-action -// -// Safari, on iOS, supports touch action since v13. -// Over 80% of the iOS phones are compatible -// in August 2020. -// Utilizing the CSS.supports method to check if touch-action is supported. -// Since CSS.supports is supported on all but Edge@12 and IE and touch-action -// is supported on both Edge@12 and IE if CSS.supports is not available that means that -// touch-action will be supported -let cachedSupportsTouchActionNone = false; -function doesSupportTouchActionNone(): boolean { - if (cachedSupportsTouchActionNone === undefined) { - if (typeof CSS !== 'undefined' && typeof CSS.supports === 'function') { - cachedSupportsTouchActionNone = CSS.supports('touch-action', 'none'); - } else { - cachedSupportsTouchActionNone = true; - } - } - return cachedSupportsTouchActionNone; -} - function trackFinger(event: any, currentTouchId: number | undefined): CursorCoordinates | boolean { if (currentTouchId !== undefined && event.changedTouches) { for (let i = 0; i < event.changedTouches.length; i += 1) { @@ -430,6 +409,9 @@ export const useGridColumnResize = ( apiRef.current.setColumnWidth(refs.colDef.field, refs.colDef.width!); logger.debug(`Updating col ${refs.colDef.field} with new width: ${refs.colDef.width}`); + // Since during resizing we update the columns width outside of React, React is unable to + // reapply the right style properties. We need to sync the state manually. + // So we reapply the same logic as in https://github.com/mui/mui-x/blob/0511bf65543ca05d2602a5a3e0a6156f2fc8e759/packages/x-data-grid/src/hooks/features/columnHeaders/useGridColumnHeaders.tsx#L405 const columnsState = gridColumnsStateSelector(apiRef.current.state); refs.groupHeaderElements!.forEach((element) => { const fields = getFieldsFromGroupHeaderElem(element); @@ -468,7 +450,7 @@ export const useGridColumnResize = ( ); const headerFilterElement = root.querySelector( - `.${gridClasses.headerFilterRow} [data-field="${colDef.field}"]`, + `.${gridClasses.headerFilterRow} [data-field="${escapeOperandAttributeSelector(colDef.field)}"]`, ); if (headerFilterElement) { refs.headerFilterElement = headerFilterElement as HTMLDivElement; @@ -593,10 +575,6 @@ export const useGridColumnResize = ( if (!cellSeparator) { return; } - // If touch-action: none; is not supported we need to prevent the scroll manually. - if (!doesSupportTouchActionNone()) { - event.preventDefault(); - } const touch = event.changedTouches[0]; if (touch != null) { @@ -812,7 +790,7 @@ export const useGridColumnResize = ( () => apiRef.current.columnHeadersContainerRef?.current, 'touchstart', handleTouchStart, - { passive: doesSupportTouchActionNone() }, + { passive: true }, ); useGridApiMethod( diff --git a/packages/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts b/packages/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts index 9126960acde7..cd3c0d8d42ce 100644 --- a/packages/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts +++ b/packages/x-data-grid/src/hooks/features/columns/gridColumnsUtils.ts @@ -171,30 +171,36 @@ export const hydrateColumnsWidth = ( const flexColumns: GridStateColDef[] = []; // For the non-flex columns, compute their width - // For the flex columns, compute there minimum width and how much width must be allocated during the flex allocation + // For the flex columns, compute their minimum width and how much width must be allocated during the flex allocation rawState.orderedFields.forEach((columnField) => { - const newColumn = { ...rawState.lookup[columnField] } as GridStateColDef; - if (rawState.columnVisibilityModel[columnField] === false) { - newColumn.computedWidth = 0; - } else { - let computedWidth: number; - if (newColumn.flex && newColumn.flex > 0) { - totalFlexUnits += newColumn.flex; - computedWidth = 0; - flexColumns.push(newColumn); + let column = rawState.lookup[columnField] as GridStateColDef; + let computedWidth = 0; + let isFlex = false; + + if (rawState.columnVisibilityModel[columnField] !== false) { + if (column.flex && column.flex > 0) { + totalFlexUnits += column.flex; + isFlex = true; } else { computedWidth = clamp( - newColumn.width || GRID_STRING_COL_DEF.width!, - newColumn.minWidth || GRID_STRING_COL_DEF.minWidth!, - newColumn.maxWidth || GRID_STRING_COL_DEF.maxWidth!, + column.width || GRID_STRING_COL_DEF.width!, + column.minWidth || GRID_STRING_COL_DEF.minWidth!, + column.maxWidth || GRID_STRING_COL_DEF.maxWidth!, ); } widthAllocatedBeforeFlex += computedWidth; - newColumn.computedWidth = computedWidth; } - columnsLookup[columnField] = newColumn; + if (column.computedWidth !== computedWidth) { + column = { ...column, computedWidth }; + } + + if (isFlex) { + flexColumns.push(column); + } + + columnsLookup[columnField] = column; }); const availableWidth = @@ -382,7 +388,7 @@ export const createColumnsState = ({ if (keepOnlyColumnsToUpsert && !isInsideStateInitializer) { Object.keys(columnsState.lookup).forEach((field) => { - if (!columnsToKeep![field]) { + if (!columnsToKeep[field]) { delete columnsState.lookup[field]; } }); diff --git a/packages/x-data-grid/src/hooks/features/columns/useGridColumnSpanning.ts b/packages/x-data-grid/src/hooks/features/columns/useGridColumnSpanning.ts index 94941c8e405e..2c7d8f97684a 100644 --- a/packages/x-data-grid/src/hooks/features/columns/useGridColumnSpanning.ts +++ b/packages/x-data-grid/src/hooks/features/columns/useGridColumnSpanning.ts @@ -26,6 +26,10 @@ export const useGridColumnSpanning = (apiRef: React.MutableRefObject<GridPrivate return lookup.current[rowId]?.[columnIndex]; }; + const resetColSpan: GridColumnSpanningPrivateApi['resetColSpan'] = () => { + lookup.current = {}; + }; + // Calculate `colSpan` for each cell in the row const calculateColSpan = React.useCallback<GridColumnSpanningPrivateApi['calculateColSpan']>( ({ rowId, minFirstColumn, maxLastColumn, columns }) => { @@ -52,18 +56,14 @@ export const useGridColumnSpanning = (apiRef: React.MutableRefObject<GridPrivate }; const columnSpanningPrivateApi: GridColumnSpanningPrivateApi = { + resetColSpan, calculateColSpan, }; useGridApiMethod(apiRef, columnSpanningPublicApi, 'public'); useGridApiMethod(apiRef, columnSpanningPrivateApi, 'private'); - const handleColumnReorderChange = React.useCallback(() => { - // `colSpan` needs to be recalculated after column reordering - lookup.current = {}; - }, []); - - useGridApiEventHandler(apiRef, 'columnOrderChange', handleColumnReorderChange); + useGridApiEventHandler(apiRef, 'columnOrderChange', resetColSpan); }; function calculateCellColSpan(params: { diff --git a/packages/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts b/packages/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts index 1c3a96e97712..9727b8b19c03 100644 --- a/packages/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts +++ b/packages/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts @@ -121,16 +121,14 @@ export function useGridDimensions( const computedStyle = ownerWindow(element).getComputedStyle(element); - const height = parseFloat(computedStyle.height) || 0; - const width = parseFloat(computedStyle.width) || 0; - - const hasHeightChanged = height !== previousSize.current?.height; - const hasWidthChanged = width !== previousSize.current?.width; + const newSize = { + width: parseFloat(computedStyle.width) || 0, + height: parseFloat(computedStyle.height) || 0, + }; - if (!previousSize.current || hasHeightChanged || hasWidthChanged) { - const size = { width, height }; - apiRef.current.publishEvent('resize', size); - previousSize.current = size; + if (!previousSize.current || !areElementSizesEqual(previousSize.current, newSize)) { + apiRef.current.publishEvent('resize', newSize); + previousSize.current = newSize; } }, [apiRef]); @@ -263,10 +261,7 @@ export function useGridDimensions( const prevDimensions = apiRef.current.state.dimensions; setDimensions(newDimensions); - if ( - newDimensions.viewportInnerSize.width !== prevDimensions.viewportInnerSize.width || - newDimensions.viewportInnerSize.height !== prevDimensions.viewportInnerSize.height - ) { + if (!areElementSizesEqual(newDimensions.viewportInnerSize, prevDimensions.viewportInnerSize)) { apiRef.current.publishEvent('viewportInnerSizeChange', newDimensions.viewportInnerSize); } @@ -413,3 +408,7 @@ function measureScrollbarSize( function roundToDecimalPlaces(value: number, decimals: number) { return Math.round(value * 10 ** decimals) / 10 ** decimals; } + +function areElementSizesEqual(a: ElementSize, b: ElementSize) { + return a.width === b.width && a.height === b.height; +} diff --git a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts index b11c6c986de5..d03e505fe05b 100644 --- a/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts +++ b/packages/x-data-grid/src/hooks/features/export/serializers/csvSerializer.ts @@ -5,14 +5,20 @@ import type { GridStateColDef } from '../../../../models/colDef/gridColDef'; import type { GridApiCommunity } from '../../../../models/api/gridApiCommunity'; import { buildWarning } from '../../../../utils/warning'; -function sanitizeCellValue(value: any, delimiterCharacter: string, shouldAppendQuotes: boolean) { +function sanitizeCellValue(value: any, csvOptions: CSVOptions) { if (typeof value === 'string') { - if (shouldAppendQuotes) { + if (csvOptions.shouldAppendQuotes || csvOptions.escapeFormulas) { const escapedValue = value.replace(/"/g, '""'); - // Make sure value containing delimiter or line break won't be split into multiple rows - if ([delimiterCharacter, '\n', '\r', '"'].some((delimiter) => value.includes(delimiter))) { + // Make sure value containing delimiter or line break won't be split into multiple cells + if ([csvOptions.delimiter, '\n', '\r', '"'].some((delimiter) => value.includes(delimiter))) { return `"${escapedValue}"`; } + if (csvOptions.escapeFormulas) { + // See https://owasp.org/www-community/attacks/CSV_Injection + if (['=', '+', '-', '@', '\t', '\r'].includes(escapedValue[0])) { + return `'${escapedValue}`; + } + } return escapedValue; } @@ -25,12 +31,11 @@ function sanitizeCellValue(value: any, delimiterCharacter: string, shouldAppendQ export const serializeCellValue = ( cellParams: GridCellParams, options: { - delimiterCharacter: string; + csvOptions: CSVOptions; ignoreValueFormatter: boolean; - shouldAppendQuotes: boolean; }, ) => { - const { delimiterCharacter, ignoreValueFormatter, shouldAppendQuotes } = options; + const { csvOptions, ignoreValueFormatter } = options; let value: any; if (ignoreValueFormatter) { const columnType = cellParams.colDef.type; @@ -47,7 +52,7 @@ export const serializeCellValue = ( value = cellParams.formattedValue; } - return sanitizeCellValue(value, delimiterCharacter, shouldAppendQuotes); + return sanitizeCellValue(value, csvOptions); }; const objectFormattedValueWarning = buildWarning([ @@ -55,10 +60,13 @@ const objectFormattedValueWarning = buildWarning([ 'You can provide a `valueFormatter` with a string representation to be used.', ]); +type CSVOptions = Required< + Pick<GridCsvExportOptions, 'delimiter' | 'shouldAppendQuotes' | 'escapeFormulas'> +>; + type CSVRowOptions = { - delimiterCharacter: string; - sanitizeCellValue?: (value: any, delimiterCharacter: string, shouldAppendQuotes: boolean) => any; - shouldAppendQuotes: boolean; + sanitizeCellValue?: (value: any, csvOptions: CSVOptions) => any; + csvOptions: CSVOptions; }; class CSVRow { options: CSVRowOptions; @@ -73,16 +81,12 @@ class CSVRow { addValue(value: string) { if (!this.isEmpty) { - this.rowString += this.options.delimiterCharacter; + this.rowString += this.options.csvOptions.delimiter; } if (value === null || value === undefined) { this.rowString += ''; } else if (typeof this.options.sanitizeCellValue === 'function') { - this.rowString += this.options.sanitizeCellValue( - value, - this.options.delimiterCharacter, - this.options.shouldAppendQuotes, - ); + this.rowString += this.options.sanitizeCellValue(value, this.options.csvOptions); } else { this.rowString += value; } @@ -98,18 +102,16 @@ const serializeRow = ({ id, columns, getCellParams, - delimiterCharacter, + csvOptions, ignoreValueFormatter, - shouldAppendQuotes, }: { id: GridRowId; columns: GridStateColDef[]; getCellParams: (id: GridRowId, field: string) => GridCellParams; - delimiterCharacter: string; + csvOptions: CSVOptions; ignoreValueFormatter: boolean; - shouldAppendQuotes: boolean; }) => { - const row = new CSVRow({ delimiterCharacter, shouldAppendQuotes }); + const row = new CSVRow({ csvOptions }); columns.forEach((column) => { const cellParams = getCellParams(id, column.field); @@ -120,9 +122,8 @@ const serializeRow = ({ } row.addValue( serializeCellValue(cellParams, { - delimiterCharacter, ignoreValueFormatter, - shouldAppendQuotes, + csvOptions, }), ); }); @@ -133,25 +134,22 @@ const serializeRow = ({ interface BuildCSVOptions { columns: GridStateColDef[]; rowIds: GridRowId[]; - delimiterCharacter: NonNullable<GridCsvExportOptions['delimiter']>; - includeHeaders: NonNullable<GridCsvExportOptions['includeHeaders']>; - includeColumnGroupsHeaders: NonNullable<GridCsvExportOptions['includeColumnGroupsHeaders']>; + csvOptions: Required< + Pick< + GridCsvExportOptions, + | 'delimiter' + | 'includeColumnGroupsHeaders' + | 'includeHeaders' + | 'shouldAppendQuotes' + | 'escapeFormulas' + > + >; ignoreValueFormatter: boolean; apiRef: React.MutableRefObject<GridApiCommunity>; - shouldAppendQuotes: boolean; } export function buildCSV(options: BuildCSVOptions): string { - const { - columns, - rowIds, - delimiterCharacter, - includeHeaders, - includeColumnGroupsHeaders, - ignoreValueFormatter, - apiRef, - shouldAppendQuotes, - } = options; + const { columns, rowIds, csvOptions, ignoreValueFormatter, apiRef } = options; const CSVBody = rowIds .reduce<string>( @@ -160,15 +158,14 @@ export function buildCSV(options: BuildCSVOptions): string { id, columns, getCellParams: apiRef.current.getCellParams, - delimiterCharacter, ignoreValueFormatter, - shouldAppendQuotes, + csvOptions, })}\r\n`, '', ) .trim(); - if (!includeHeaders) { + if (!csvOptions.includeHeaders) { return CSVBody; } @@ -178,7 +175,7 @@ export function buildCSV(options: BuildCSVOptions): string { const headerRows: CSVRow[] = []; - if (includeColumnGroupsHeaders) { + if (csvOptions.includeColumnGroupsHeaders) { const columnGroupLookup = apiRef.current.getAllGroupDetails(); let maxColumnGroupsDepth = 0; @@ -193,9 +190,8 @@ export function buildCSV(options: BuildCSVOptions): string { for (let i = 0; i < maxColumnGroupsDepth; i += 1) { const headerGroupRow = new CSVRow({ - delimiterCharacter, + csvOptions, sanitizeCellValue, - shouldAppendQuotes, }); headerRows.push(headerGroupRow); filteredColumns.forEach((column) => { @@ -206,7 +202,10 @@ export function buildCSV(options: BuildCSVOptions): string { } } - const mainHeaderRow = new CSVRow({ delimiterCharacter, sanitizeCellValue, shouldAppendQuotes }); + const mainHeaderRow = new CSVRow({ + csvOptions, + sanitizeCellValue, + }); filteredColumns.forEach((column) => { mainHeaderRow.addValue(column.headerName || column.field); }); diff --git a/packages/x-data-grid/src/hooks/features/export/useGridCsvExport.tsx b/packages/x-data-grid/src/hooks/features/export/useGridCsvExport.tsx index cb6f4d9d7d3f..69c85085e15a 100644 --- a/packages/x-data-grid/src/hooks/features/export/useGridCsvExport.tsx +++ b/packages/x-data-grid/src/hooks/features/export/useGridCsvExport.tsx @@ -48,12 +48,15 @@ export const useGridCsvExport = ( return buildCSV({ columns: exportedColumns, rowIds: exportedRowIds, - delimiterCharacter: options.delimiter || ',', - includeHeaders: options.includeHeaders ?? true, - includeColumnGroupsHeaders: options.includeColumnGroupsHeaders ?? true, + csvOptions: { + delimiter: options.delimiter || ',', + shouldAppendQuotes: options.shouldAppendQuotes ?? true, + includeHeaders: options.includeHeaders ?? true, + includeColumnGroupsHeaders: options.includeColumnGroupsHeaders ?? true, + escapeFormulas: options.escapeFormulas ?? true, + }, ignoreValueFormatter, apiRef, - shouldAppendQuotes: options.shouldAppendQuotes ?? true, }); }, [logger, apiRef, ignoreValueFormatter], diff --git a/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx b/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx index 2fc1b43d1f09..be18719cafd7 100644 --- a/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx +++ b/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx @@ -85,7 +85,14 @@ const createScrollCache = ( }); type ScrollCache = ReturnType<typeof createScrollCache>; -const isJSDOM = typeof window !== 'undefined' ? /jsdom/.test(window.navigator.userAgent) : false; +let isJSDOM = false; +try { + if (typeof window !== 'undefined') { + isJSDOM = /jsdom/.test(window.navigator.userAgent); + } +} catch (_) { + /* ignore */ +} export const useGridVirtualScroller = () => { const apiRef = useGridPrivateApiContext() as React.MutableRefObject<PrivateApiWithInfiniteLoader>; diff --git a/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.test.tsx b/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.test.tsx index 8619de8bf66f..1ee0bd2c105f 100644 --- a/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.test.tsx +++ b/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { sleep } from 'test/utils/helperFn'; import { createUseGridApiEventHandler } from './useGridApiEventHandler'; import { FinalizationRegistryBasedCleanupTracking } from '../../utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking'; diff --git a/packages/x-data-grid/src/index.ts b/packages/x-data-grid/src/index.ts index 1414eac4e3b6..385e5a8da1e7 100644 --- a/packages/x-data-grid/src/index.ts +++ b/packages/x-data-grid/src/index.ts @@ -20,6 +20,7 @@ export type { GridToolbarExportProps } from './components/toolbar/GridToolbarExp export type { GridExportFormat, GridExportExtension } from './models/gridExport'; export { GridColumnHeaders } from './components/GridColumnHeaders'; +export type { GridColumnHeadersProps } from './components/GridColumnHeaders'; /** * Reexportable components. diff --git a/packages/x-data-grid/src/locales/beBY.ts b/packages/x-data-grid/src/locales/beBY.ts index d2aaaa7729c5..b10dd30d81fd 100644 --- a/packages/x-data-grid/src/locales/beBY.ts +++ b/packages/x-data-grid/src/locales/beBY.ts @@ -4,16 +4,16 @@ import { getGridLocalization, Localization } from '../utils/getGridLocalization' type PluralForm = { one: string; - twoToFour: string; - other: string; + few: string; + many: string; }; const getPluralForm = (count: number, options: PluralForm) => { - let pluralForm = options.other; + let pluralForm = options.many; const lastDigit = count % 10; if (lastDigit > 1 && lastDigit < 5 && (count < 10 || count > 20)) { - pluralForm = options.twoToFour; + pluralForm = options.few; } else if (lastDigit === 1 && count % 100 !== 11) { pluralForm = options.one; } @@ -45,8 +45,8 @@ const beBYGrid: Partial<GridLocaleText> = { toolbarFiltersTooltipActive: (count) => getPluralForm(count, { one: 'актыўны фільтр', - twoToFour: 'актыўных фільтра', - other: 'актыўных фільтраў', + few: 'актыўных фільтра', + many: 'актыўных фільтраў', }), // Quick filter toolbar field @@ -140,8 +140,8 @@ const beBYGrid: Partial<GridLocaleText> = { columnHeaderFiltersTooltipActive: (count) => getPluralForm(count, { one: 'актыўны фільтр', - twoToFour: 'актыўных фільтра', - other: 'актыўных фільтраў', + few: 'актыўных фільтра', + many: 'актыўных фільтраў', }), columnHeaderFiltersLabel: 'Паказаць фільтры', columnHeaderSortIconLabel: 'Сартыраваць', @@ -150,8 +150,8 @@ const beBYGrid: Partial<GridLocaleText> = { footerRowSelected: (count) => getPluralForm(count, { one: 'абраны радок', - twoToFour: 'абраных радка', - other: 'абраных радкоў', + few: 'абраных радка', + many: 'абраных радкоў', }), // Total row amount footer text diff --git a/packages/x-data-grid/src/locales/faIR.ts b/packages/x-data-grid/src/locales/faIR.ts index cb0f327f0f2e..3bef75f7745c 100644 --- a/packages/x-data-grid/src/locales/faIR.ts +++ b/packages/x-data-grid/src/locales/faIR.ts @@ -5,7 +5,7 @@ import { getGridLocalization, Localization } from '../utils/getGridLocalization' const faIRGrid: Partial<GridLocaleText> = { // Root noRowsLabel: 'بدون سطر', - noResultsOverlayLabel: 'نتیجه ای پیدا نشد.', + noResultsOverlayLabel: 'نتیجه‌ای پیدا نشد.', // Density selector toolbar button text toolbarDensity: 'تراکم', @@ -110,14 +110,14 @@ const faIRGrid: Partial<GridLocaleText> = { columnMenuFilter: 'فیلتر', columnMenuHideColumn: 'مخفی', columnMenuUnsort: 'نامرتب‌کردن', - columnMenuSortAsc: 'مرتب‌کردن صعودی', - columnMenuSortDesc: 'مرتب‌کردن نزولی', + columnMenuSortAsc: 'مرتب‌سازی صعودی', + columnMenuSortDesc: 'مرتب‌سازی نزولی', // Column header text columnHeaderFiltersTooltipActive: (count) => count !== 1 ? `${count} فیلتر‌های فعال` : `${count} فیلتر فعال`, columnHeaderFiltersLabel: 'نمایش فیلترها', - columnHeaderSortIconLabel: 'مرتب‌کردن', + columnHeaderSortIconLabel: 'مرتب‌سازی', // Rows selected footer text footerRowSelected: (count) => diff --git a/packages/x-data-grid/src/locales/fiFI.ts b/packages/x-data-grid/src/locales/fiFI.ts index 2d7f5c733b08..ba94f12f0644 100644 --- a/packages/x-data-grid/src/locales/fiFI.ts +++ b/packages/x-data-grid/src/locales/fiFI.ts @@ -39,10 +39,10 @@ const fiFIGrid: Partial<GridLocaleText> = { toolbarExportExcel: 'Lataa Excel-muodossa', // Columns management text - // columnsManagementSearchTitle: 'Search', - // columnsManagementNoColumns: 'No columns', - // columnsManagementShowHideAllText: 'Show/Hide All', - // columnsManagementReset: 'Reset', + columnsManagementSearchTitle: 'Hae', + columnsManagementNoColumns: 'Ei sarakkeita näytettäväksi', + columnsManagementShowHideAllText: 'Näytä/Piilota kaikki', + columnsManagementReset: 'Palauta', // Filter panel text filterPanelAddFilter: 'Lisää suodatin', diff --git a/packages/x-data-grid/src/locales/ruRU.ts b/packages/x-data-grid/src/locales/ruRU.ts index f08cfba7b4da..7312e34d60ba 100644 --- a/packages/x-data-grid/src/locales/ruRU.ts +++ b/packages/x-data-grid/src/locales/ruRU.ts @@ -2,6 +2,26 @@ import { ruRU as ruRUCore } from '@mui/material/locale'; import { GridLocaleText } from '../models/api/gridLocaleTextApi'; import { getGridLocalization, Localization } from '../utils/getGridLocalization'; +type PluralForm = { + one: string; + few: string; + many: string; +}; + +function getPluralForm(count: number, options: PluralForm) { + const penultimateDigit = Math.floor(count / 10) % 10; + const lastDigit = count % 10; + + let pluralForm = options.many; + if (penultimateDigit !== 1 && lastDigit > 1 && lastDigit < 5) { + pluralForm = options.few; + } else if (penultimateDigit !== 1 && lastDigit === 1) { + pluralForm = options.one; + } + + return `${count} ${pluralForm}`; +} + const ruRUGrid: Partial<GridLocaleText> = { // Root noRowsLabel: 'Нет строк', @@ -23,16 +43,12 @@ const ruRUGrid: Partial<GridLocaleText> = { toolbarFiltersLabel: 'Показать фильтры', toolbarFiltersTooltipHide: 'Скрыть фильтры', toolbarFiltersTooltipShow: 'Показать фильтры', - toolbarFiltersTooltipActive: (count) => { - let pluralForm = 'активных фильтров'; - const lastDigit = count % 10; - if (lastDigit > 1 && lastDigit < 5) { - pluralForm = 'активных фильтра'; - } else if (lastDigit === 1) { - pluralForm = 'активный фильтр'; - } - return `${count} ${pluralForm}`; - }, + toolbarFiltersTooltipActive: (count) => + getPluralForm(count, { + one: 'активный фильтр', + few: 'активных фильтра', + many: 'активных фильтров', + }), // Quick filter toolbar field toolbarQuickFilterPlaceholder: 'Поиск…', @@ -122,30 +138,22 @@ const ruRUGrid: Partial<GridLocaleText> = { columnMenuSortDesc: 'Сортировать по убыванию', // Column header text - columnHeaderFiltersTooltipActive: (count) => { - let pluralForm = 'активных фильтров'; - const lastDigit = count % 10; - if (lastDigit > 1 && lastDigit < 5) { - pluralForm = 'активных фильтра'; - } else if (lastDigit === 1) { - pluralForm = 'активный фильтр'; - } - return `${count} ${pluralForm}`; - }, + columnHeaderFiltersTooltipActive: (count) => + getPluralForm(count, { + one: 'активный фильтр', + few: 'активных фильтра', + many: 'активных фильтров', + }), columnHeaderFiltersLabel: 'Показать фильтры', columnHeaderSortIconLabel: 'Сортировать', // Rows selected footer text - footerRowSelected: (count) => { - let pluralForm = 'строк выбрано'; - const lastDigit = count % 10; - if (lastDigit > 1 && lastDigit < 5) { - pluralForm = 'строки выбраны'; - } else if (lastDigit === 1) { - pluralForm = 'строка выбрана'; - } - return `${count} ${pluralForm}`; - }, + footerRowSelected: (count) => + getPluralForm(count, { + one: 'строка выбрана', + few: 'строки выбраны', + many: 'строк выбрано', + }), // Total row amount footer text footerTotalRows: 'Всего строк:', diff --git a/packages/x-data-grid/src/locales/ukUA.ts b/packages/x-data-grid/src/locales/ukUA.ts index 22185c2c34e9..bfb45ead7c68 100644 --- a/packages/x-data-grid/src/locales/ukUA.ts +++ b/packages/x-data-grid/src/locales/ukUA.ts @@ -8,18 +8,19 @@ type PluralForm = { many: string; }; -const getPluralForm = (count: number, options: PluralForm) => { - let pluralForm = options.many; +function getPluralForm(count: number, options: PluralForm) { + const penultimateDigit = Math.floor(count / 10) % 10; const lastDigit = count % 10; - if (lastDigit > 1 && lastDigit < 5) { + let pluralForm = options.many; + if (penultimateDigit !== 1 && lastDigit > 1 && lastDigit < 5) { pluralForm = options.few; - } else if (lastDigit === 1) { + } else if (penultimateDigit !== 1 && lastDigit === 1) { pluralForm = options.one; } return `${count} ${pluralForm}`; -}; +} const ukUAGrid: Partial<GridLocaleText> = { // Root diff --git a/packages/x-data-grid/src/models/api/gridColumnSpanning.ts b/packages/x-data-grid/src/models/api/gridColumnSpanning.ts index b61c2f8e69a6..835f06034c3e 100644 --- a/packages/x-data-grid/src/models/api/gridColumnSpanning.ts +++ b/packages/x-data-grid/src/models/api/gridColumnSpanning.ts @@ -20,6 +20,8 @@ export interface GridColumnSpanningApi { } export interface GridColumnSpanningPrivateApi { + /** Reset the colspan cache */ + resetColSpan: () => void; /** * Calculate column spanning for each cell in the row * @param {Object} options The options to apply on the calculation. diff --git a/packages/x-data-grid/src/models/gridExport.ts b/packages/x-data-grid/src/models/gridExport.ts index 07aea49676c1..98220015a855 100644 --- a/packages/x-data-grid/src/models/gridExport.ts +++ b/packages/x-data-grid/src/models/gridExport.ts @@ -40,6 +40,13 @@ export interface GridFileExportOptions<Api extends GridApiCommon = GridApiCommun * @returns {GridRowId[]} The list of row ids to export. */ getRowsToExport?: (params: GridGetRowsToExportParams<Api>) => GridRowId[]; + /** + * If `false`, the formulas in the cells will not be escaped. + * It is not recommended to disable this option as it exposes the user to potential CSV injection attacks. + * See https://owasp.org/www-community/attacks/CSV_Injection for more information. + * @default true + */ + escapeFormulas?: boolean; } export interface GridGetRowsToExportParams<Api extends GridApiCommon = GridApiCommunity> { diff --git a/packages/x-data-grid/src/models/gridSlotsComponent.ts b/packages/x-data-grid/src/models/gridSlotsComponent.ts index e9badaecaf5d..f08dc9dde12f 100644 --- a/packages/x-data-grid/src/models/gridSlotsComponent.ts +++ b/packages/x-data-grid/src/models/gridSlotsComponent.ts @@ -100,7 +100,7 @@ export interface GridSlotsComponent extends GridBaseSlots, GridIconSlotsComponen columnMenu: React.JSXElementConstructor<GridSlotProps['columnMenu']>; /** * Component responsible for rendering the column headers. - * @default DataGridColumnHeaders + * @default GridColumnHeaders */ columnHeaders: React.JSXElementConstructor<GridSlotProps['columnHeaders']>; /** diff --git a/packages/x-data-grid/src/models/props/DataGridProps.ts b/packages/x-data-grid/src/models/props/DataGridProps.ts index dab6bbdef927..759097fa8d12 100644 --- a/packages/x-data-grid/src/models/props/DataGridProps.ts +++ b/packages/x-data-grid/src/models/props/DataGridProps.ts @@ -99,7 +99,7 @@ export interface DataGridPropsWithComplexDefaultValueBeforeProcessing { */ export interface DataGridPropsWithDefaultValues<R extends GridValidRowModel = any> { /** - * If `true`, the Data Grid height is dynamic and follow the number of rows in the Data Grid. + * If `true`, the Data Grid height is dynamic and follows the number of rows in the Data Grid. * @default false */ autoHeight: boolean; diff --git a/packages/x-data-grid/src/tests/DataGrid.test.tsx b/packages/x-data-grid/src/tests/DataGrid.test.tsx index 0cdd1258c059..17011096eb2d 100644 --- a/packages/x-data-grid/src/tests/DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGrid } from '@mui/x-data-grid'; diff --git a/packages/x-data-grid/src/tests/cells.DataGrid.test.tsx b/packages/x-data-grid/src/tests/cells.DataGrid.test.tsx index 263db67e04b8..14c0f51e40e8 100644 --- a/packages/x-data-grid/src/tests/cells.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/cells.DataGrid.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { spy } from 'sinon'; -import { createRenderer, fireEvent, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, userEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGrid, GridValueFormatter } from '@mui/x-data-grid'; import { getCell } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid/src/tests/columnGrouping.DataGrid.test.tsx b/packages/x-data-grid/src/tests/columnGrouping.DataGrid.test.tsx index 2cc31a60f043..d3ee1dd081c5 100644 --- a/packages/x-data-grid/src/tests/columnGrouping.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/columnGrouping.DataGrid.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { createRenderer, ErrorBoundary, screen } from '@mui-internal/test-utils'; +import { createRenderer, ErrorBoundary, screen } from '@mui/internal-test-utils'; import { DataGrid, DataGridProps, GridRowModel, GridColDef } from '@mui/x-data-grid'; const isJSDOM = /jsdom/.test(window.navigator.userAgent); diff --git a/packages/x-data-grid/src/tests/columnHeaders.DataGrid.test.tsx b/packages/x-data-grid/src/tests/columnHeaders.DataGrid.test.tsx index 51d1e7bb69f8..817d96a118a9 100644 --- a/packages/x-data-grid/src/tests/columnHeaders.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/columnHeaders.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen, within, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, within, userEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGrid } from '@mui/x-data-grid'; import { getColumnHeaderCell, getColumnHeadersTextContent } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid/src/tests/columnSpanning.DataGrid.test.tsx b/packages/x-data-grid/src/tests/columnSpanning.DataGrid.test.tsx index 25071ffe04e8..eaada2a7f132 100644 --- a/packages/x-data-grid/src/tests/columnSpanning.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/columnSpanning.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen, within, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, within, userEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGrid, gridClasses, GridColDef } from '@mui/x-data-grid'; import { getCell, getActiveCell, getColumnHeaderCell } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid/src/tests/columns.DataGrid.test.tsx b/packages/x-data-grid/src/tests/columns.DataGrid.test.tsx index 20726bc89195..528bb11fc88b 100644 --- a/packages/x-data-grid/src/tests/columns.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/columns.DataGrid.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { DataGrid, DataGridProps, GridRowsProp, GridColDef } from '@mui/x-data-grid'; import { getCell, getColumnHeaderCell, getColumnHeadersTextContent } from 'test/utils/helperFn'; diff --git a/packages/x-data-grid/src/tests/columnsVisibility.DataGrid.test.tsx b/packages/x-data-grid/src/tests/columnsVisibility.DataGrid.test.tsx index 721934f49d3b..3771593c4f90 100644 --- a/packages/x-data-grid/src/tests/columnsVisibility.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/columnsVisibility.DataGrid.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { act, createRenderer, fireEvent, screen } from '@mui-internal/test-utils'; +import { act, createRenderer, fireEvent, screen } from '@mui/internal-test-utils'; import { DataGrid, DataGridProps, diff --git a/packages/x-data-grid/src/tests/density.DataGrid.test.tsx b/packages/x-data-grid/src/tests/density.DataGrid.test.tsx index 6e71774e9651..e1a2e2b3148f 100644 --- a/packages/x-data-grid/src/tests/density.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/density.DataGrid.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { spy } from 'sinon'; -import { createRenderer, fireEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen } from '@mui/internal-test-utils'; import { grid } from 'test/utils/helperFn'; import { expect } from 'chai'; import { DataGrid, DataGridProps, GridToolbar, gridClasses } from '@mui/x-data-grid'; diff --git a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx index 16626ae166a8..0e6b3745103b 100644 --- a/packages/x-data-grid/src/tests/export.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/export.DataGrid.test.tsx @@ -3,7 +3,7 @@ import { expect } from 'chai'; import { spy, SinonSpy } from 'sinon'; import { DataGrid, DataGridProps, GridToolbar, GridToolbarExport } from '@mui/x-data-grid'; import { useBasicDemoData } from '@mui/x-data-grid-generator'; -import { createRenderer, screen, fireEvent } from '@mui-internal/test-utils'; +import { createRenderer, screen, fireEvent } from '@mui/internal-test-utils'; describe('<DataGrid /> - Export', () => { const { render, clock } = createRenderer({ clock: 'fake' }); @@ -76,6 +76,47 @@ describe('<DataGrid /> - Export', () => { expect(screen.queryByRole('menu')).not.to.equal(null); expect(screen.queryByRole('menuitem', { name: 'Download as CSV' })).to.equal(null); }); + + it('should escape formulas in the cells', async () => { + render( + <div style={{ width: 300, height: 300 }}> + <DataGrid + columns={[{ field: 'name' }]} + rows={[ + { id: 0, name: '=1+1' }, + { id: 1, name: '+1+1' }, + { id: 2, name: '-1+1' }, + { id: 3, name: '@1+1' }, + { id: 4, name: '\t1+1' }, + { id: 5, name: '\r1+1' }, + { id: 6, name: ',=1+1' }, + { id: 7, name: 'value,=1+1' }, + ]} + slots={{ toolbar: GridToolbar }} + /> + </div>, + ); + fireEvent.click(screen.getByRole('button', { name: 'Export' })); + clock.runToLast(); + expect(screen.queryByRole('menu')).not.to.equal(null); + fireEvent.click(screen.getByRole('menuitem', { name: 'Download as CSV' })); + expect(spyCreateObjectURL.callCount).to.equal(1); + const csv = await spyCreateObjectURL.lastCall.firstArg.text(); + + expect(csv).to.equal( + [ + 'name', + "'=1+1", + "'+1+1", + "'-1+1", + "'@1+1", + "'\t1+1", + '"\r1+1"', + '",=1+1"', + '"value,=1+1"', + ].join('\r\n'), + ); + }); }); describe('component: GridToolbarExport', () => { diff --git a/packages/x-data-grid/src/tests/filterPanel.DataGrid.test.tsx b/packages/x-data-grid/src/tests/filterPanel.DataGrid.test.tsx index 20e3b581f83e..6eea8f600895 100644 --- a/packages/x-data-grid/src/tests/filterPanel.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/filterPanel.DataGrid.test.tsx @@ -9,7 +9,7 @@ import { GridFilterOperator, GridPreferencePanelsValue, } from '@mui/x-data-grid'; -import { createRenderer, fireEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen } from '@mui/internal-test-utils'; import { getColumnHeaderCell, getColumnValues, getSelectByName } from 'test/utils/helperFn'; function setColumnValue(columnValue: string) { diff --git a/packages/x-data-grid/src/tests/filtering.DataGrid.test.tsx b/packages/x-data-grid/src/tests/filtering.DataGrid.test.tsx index 1c0e44a39cbf..b67d56f5a4be 100644 --- a/packages/x-data-grid/src/tests/filtering.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/filtering.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGrid, diff --git a/packages/x-data-grid/src/tests/keyboard.DataGrid.test.tsx b/packages/x-data-grid/src/tests/keyboard.DataGrid.test.tsx index 6fccae286dee..27c196256ecd 100644 --- a/packages/x-data-grid/src/tests/keyboard.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/keyboard.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen, act, userEvent } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act, userEvent } from '@mui/internal-test-utils'; import { spy } from 'sinon'; import { expect } from 'chai'; import { diff --git a/packages/x-data-grid/src/tests/layout.DataGrid.test.tsx b/packages/x-data-grid/src/tests/layout.DataGrid.test.tsx index 468d5709d28a..28a32fe53aa0 100644 --- a/packages/x-data-grid/src/tests/layout.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/layout.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, screen, ErrorBoundary, waitFor } from '@mui-internal/test-utils'; +import { createRenderer, screen, ErrorBoundary, waitFor } from '@mui/internal-test-utils'; import { stub, spy } from 'sinon'; import { expect } from 'chai'; import { diff --git a/packages/x-data-grid/src/tests/pagination.DataGrid.test.tsx b/packages/x-data-grid/src/tests/pagination.DataGrid.test.tsx index d2ba0c6e840e..a245d201ee94 100644 --- a/packages/x-data-grid/src/tests/pagination.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/pagination.DataGrid.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy, stub, SinonStub, SinonSpy } from 'sinon'; import { expect } from 'chai'; -import { createRenderer, fireEvent, screen, userEvent, waitFor } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, userEvent, waitFor } from '@mui/internal-test-utils'; import { DataGrid, DataGridProps, diff --git a/packages/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx b/packages/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx index 6c8bd95121ec..dec971998713 100644 --- a/packages/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/quickFiltering.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, screen, fireEvent } from '@mui-internal/test-utils'; +import { createRenderer, screen, fireEvent } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { spy } from 'sinon'; import { diff --git a/packages/x-data-grid/src/tests/rowSelection.DataGrid.test.tsx b/packages/x-data-grid/src/tests/rowSelection.DataGrid.test.tsx index 4765a170bd59..4cfe95e32b9c 100644 --- a/packages/x-data-grid/src/tests/rowSelection.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/rowSelection.DataGrid.test.tsx @@ -8,7 +8,7 @@ import { act, userEvent, waitFor, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { DataGrid, DataGridProps, diff --git a/packages/x-data-grid/src/tests/rows.DataGrid.test.tsx b/packages/x-data-grid/src/tests/rows.DataGrid.test.tsx index 3993d846fb4b..4cc711d37821 100644 --- a/packages/x-data-grid/src/tests/rows.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/rows.DataGrid.test.tsx @@ -7,7 +7,7 @@ import { userEvent, ErrorBoundary, waitFor, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import clsx from 'clsx'; import { expect } from 'chai'; import { spy, stub } from 'sinon'; diff --git a/packages/x-data-grid/src/tests/slots.DataGrid.test.tsx b/packages/x-data-grid/src/tests/slots.DataGrid.test.tsx index abf7b8a4e89f..9059c02653f7 100644 --- a/packages/x-data-grid/src/tests/slots.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/slots.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, ErrorBoundary, fireEvent, screen } from '@mui-internal/test-utils'; +import { createRenderer, ErrorBoundary, fireEvent, screen } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { spy } from 'sinon'; import { DataGrid, DataGridProps, GridOverlay } from '@mui/x-data-grid'; diff --git a/packages/x-data-grid/src/tests/sorting.DataGrid.test.tsx b/packages/x-data-grid/src/tests/sorting.DataGrid.test.tsx index 2ee187cf650b..4fec48edbd18 100644 --- a/packages/x-data-grid/src/tests/sorting.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/sorting.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen, act, waitFor } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act, waitFor } from '@mui/internal-test-utils'; import { expect } from 'chai'; import { DataGrid, diff --git a/packages/x-data-grid/src/tests/toolbar.DataGrid.test.tsx b/packages/x-data-grid/src/tests/toolbar.DataGrid.test.tsx index cfba3fb2e0f1..12e1c495bd55 100644 --- a/packages/x-data-grid/src/tests/toolbar.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/toolbar.DataGrid.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, fireEvent, screen, act } from '@mui-internal/test-utils'; +import { createRenderer, fireEvent, screen, act } from '@mui/internal-test-utils'; import { getColumnHeadersTextContent } from 'test/utils/helperFn'; import { expect } from 'chai'; import { DataGrid, GridToolbar, GridColumnsManagementProps } from '@mui/x-data-grid'; diff --git a/packages/x-data-grid/src/utils/domUtils.ts b/packages/x-data-grid/src/utils/domUtils.ts index dd27e95e5810..5d19c58809cb 100644 --- a/packages/x-data-grid/src/utils/domUtils.ts +++ b/packages/x-data-grid/src/utils/domUtils.ts @@ -10,7 +10,9 @@ export function findParentElementFromClassName(elem: Element, className: string) return elem.closest(`.${className}`); } -function escapeOperandAttributeSelector(operand: string): string { +// TODO, eventually replaces this function with CSS.escape, once available in jsdom, either added manually or built in +// https://github.com/jsdom/jsdom/issues/1550#issuecomment-236734471 +export function escapeOperandAttributeSelector(operand: string): string { return operand.replace(/["\\]/g, '\\$&'); } @@ -68,16 +70,19 @@ export function getFieldFromHeaderElem(colCellEl: Element): string { } export function findHeaderElementFromField(elem: Element, field: string): HTMLDivElement { - return elem.querySelector(`[data-field="${field}"]`)!; + return elem.querySelector(`[data-field="${escapeOperandAttributeSelector(field)}"]`)!; } export function getFieldsFromGroupHeaderElem(colCellEl: Element): string[] { - const fieldsString = colCellEl.getAttribute('data-fields'); - return fieldsString?.startsWith('|-') ? fieldsString!.slice(2, -2).split('-|-') : []; + return colCellEl.getAttribute('data-fields')!.slice(2, -2).split('-|-'); } export function findGroupHeaderElementsFromField(elem: Element, field: string): Element[] { - return Array.from(elem.querySelectorAll<HTMLDivElement>(`[data-fields*="|-${field}-|"]`) ?? []); + return Array.from( + elem.querySelectorAll<HTMLDivElement>( + `[data-fields*="|-${escapeOperandAttributeSelector(field)}-|"]`, + ) ?? [], + ); } export function findGridCellElementsFromCol(col: HTMLElement, api: GridPrivateApiCommunity) { @@ -235,14 +240,16 @@ export function findRightPinnedHeadersBeforeCol(api: GridPrivateApiCommunity, co export function findGridHeader(api: GridPrivateApiCommunity, field: string) { const headers = api.columnHeadersContainerRef!.current!; - return headers.querySelector(`:scope > div > [data-field="${field}"][role="columnheader"]`); + return headers.querySelector( + `:scope > div > [data-field="${escapeOperandAttributeSelector(field)}"][role="columnheader"]`, + ); } export function findGridCells(api: GridPrivateApiCommunity, field: string) { const container = api.virtualScrollerRef!.current!; return Array.from( container.querySelectorAll( - `:scope > div > div > div > [data-field="${field}"][role="gridcell"]`, + `:scope > div > div > div > [data-field="${escapeOperandAttributeSelector(field)}"][role="gridcell"]`, ), ); } diff --git a/packages/x-data-grid/tsconfig.json b/packages/x-data-grid/tsconfig.json index 1c24452d71f8..aba8438e2441 100644 --- a/packages/x-data-grid/tsconfig.json +++ b/packages/x-data-grid/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["@mui/material/themeCssVarsAugmentation"] + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha" + ] }, "include": ["src/**/*"] } diff --git a/packages/x-date-pickers-pro/package.json b/packages/x-date-pickers-pro/package.json index cb2a7fa5154b..499adc00933b 100644 --- a/packages/x-date-pickers-pro/package.json +++ b/packages/x-date-pickers-pro/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-date-pickers-pro", - "version": "7.5.0", + "version": "7.6.2", "description": "The Pro plan edition of the Date and Time Picker components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -42,9 +42,9 @@ "directory": "packages/x-date-pickers-pro" }, "dependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.14", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@mui/x-date-pickers": "workspace:*", "@mui/x-license": "workspace:*", @@ -96,6 +96,7 @@ } }, "devDependencies": { + "@mui/internal-test-utils": "1.0.0", "@types/luxon": "^3.4.2", "@types/prop-types": "^15.7.12", "date-fns": "^2.30.0", @@ -103,7 +104,7 @@ "dayjs": "^1.11.11", "luxon": "^3.4.4", "moment": "^2.30.1", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.test.tsx b/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.test.tsx index 156a44f61868..1947567216c9 100644 --- a/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.test.tsx +++ b/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.test.tsx @@ -7,7 +7,7 @@ import { getByRole, fireTouchChangedEvent, userEvent, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { adapterToUse, buildPickerDragInteractions, @@ -22,12 +22,12 @@ import { } from '@mui/x-date-pickers-pro/DateRangeCalendar'; import { DateRangePickerDay } from '@mui/x-date-pickers-pro/DateRangePickerDay'; import { describeConformance } from 'test/utils/describeConformance'; -import { DateRangePosition } from './DateRangeCalendar.types'; +import { RangePosition } from '../models'; const getPickerDay = (name: string, picker = 'January 2018') => getByRole(screen.getByText(picker)?.parentElement?.parentElement!, 'gridcell', { name }); -const dynamicShouldDisableDate = (date, position: DateRangePosition) => { +const dynamicShouldDisableDate = (date, position: RangePosition) => { if (position === 'end') { return adapterToUse.getDate(date) % 3 === 0; } diff --git a/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.tsx b/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.tsx index 3bab7b2bfbde..1d8bbc4daa79 100644 --- a/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.tsx +++ b/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.tsx @@ -33,7 +33,6 @@ import { import { DateRangeCalendarProps, DateRangeCalendarDefaultizedProps, - DateRangePosition, DateRangeCalendarOwnerState, } from './DateRangeCalendar.types'; import { @@ -43,7 +42,7 @@ import { isWithinRange, } from '../internals/utils/date-utils'; import { calculateRangeChange, calculateRangePreview } from '../internals/utils/date-range-manager'; -import { DateRange } from '../models'; +import { DateRange, RangePosition } from '../models'; import { DateRangePickerDay, dateRangePickerDayClasses as dayClasses } from '../DateRangePickerDay'; import { rangeValueManager } from '../internals/utils/valueManagers'; import { useDragRange } from './useDragRange'; @@ -239,7 +238,7 @@ const DateRangeCalendar = React.forwardRef(function DateRangeCalendar< onRangePositionChange: inOnRangePositionChange, }); - const handleDatePositionChange = useEventCallback((position: DateRangePosition) => { + const handleDatePositionChange = useEventCallback((position: RangePosition) => { if (rangePosition !== position) { onRangePositionChange(position); } @@ -460,7 +459,7 @@ const DateRangeCalendar = React.forwardRef(function DateRangeCalendar< const isSelectedEndDate = isEndOfRange(utils, day, valueDayRange); const shouldInitDragging = !shouldDisableDragEditing && valueDayRange[0] && valueDayRange[1]; const isElementDraggable = shouldInitDragging && (isSelectedStartDate || isSelectedEndDate); - let datePosition: DateRangePosition | undefined; + let datePosition: RangePosition | undefined; if (isSelectedStartDate) { datePosition = 'start'; } else if (isSelectedEndDate) { @@ -587,7 +586,7 @@ const DateRangeCalendar = React.forwardRef(function DateRangeCalendar< DateRangeCalendar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.types.ts b/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.types.ts index ae263da559b0..7830eba35b47 100644 --- a/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.types.ts +++ b/packages/x-date-pickers-pro/src/DateRangeCalendar/DateRangeCalendar.types.ts @@ -20,14 +20,12 @@ import { ExportedUseViewsOptions, } from '@mui/x-date-pickers/internals'; import { DayRangeValidationProps } from '../internals/models/dateRange'; -import { DateRange } from '../models'; +import { DateRange, RangePosition } from '../models'; import { DateRangeCalendarClasses } from './dateRangeCalendarClasses'; import { DateRangePickerDay, DateRangePickerDayProps } from '../DateRangePickerDay'; import { UseRangePositionProps } from '../internals/hooks/useRangePosition'; import { PickersRangeCalendarHeaderProps } from '../PickersRangeCalendarHeader'; -export type DateRangePosition = 'start' | 'end'; - export interface DateRangeCalendarSlots<TDate extends PickerValidDate> extends PickersArrowSwitcherSlots, Omit<DayCalendarSlots<TDate>, 'day'>, @@ -155,7 +153,7 @@ export interface DateRangeCalendarProps<TDate extends PickerValidDate> * Used on Date Time Range pickers with current `rangePosition` to force a `finish` selection after just one range position selection. * @default ['start', 'end'] */ - availableRangePositions?: DateRangePosition[]; + availableRangePositions?: RangePosition[]; } export interface DateRangeCalendarOwnerState<TDate extends PickerValidDate> diff --git a/packages/x-date-pickers-pro/src/DateRangeCalendar/useDragRange.ts b/packages/x-date-pickers-pro/src/DateRangeCalendar/useDragRange.ts index 5ac9cdc66800..c14b500c8abe 100644 --- a/packages/x-date-pickers-pro/src/DateRangeCalendar/useDragRange.ts +++ b/packages/x-date-pickers-pro/src/DateRangeCalendar/useDragRange.ts @@ -1,8 +1,7 @@ import * as React from 'react'; import useEventCallback from '@mui/utils/useEventCallback'; import { MuiPickersAdapter, PickersTimezone, PickerValidDate } from '@mui/x-date-pickers/models'; -import { DateRangePosition } from './DateRangeCalendar.types'; -import { DateRange } from '../models'; +import { DateRange, RangePosition } from '../models'; import { isEndOfRange, isStartOfRange } from '../internals/utils/date-utils'; interface UseDragRangeParams<TDate extends PickerValidDate> { @@ -11,7 +10,7 @@ interface UseDragRangeParams<TDate extends PickerValidDate> { setRangeDragDay: (value: TDate | null) => void; setIsDragging: (value: boolean) => void; isDragging: boolean; - onDatePositionChange: (position: DateRangePosition) => void; + onDatePositionChange: (position: RangePosition) => void; onDrop: (newDate: TDate) => void; dateRange: DateRange<TDate>; timezone: PickersTimezone; @@ -32,7 +31,7 @@ interface UseDragRangeEvents { interface UseDragRangeResponse<TDate extends PickerValidDate> extends UseDragRangeEvents { isDragging: boolean; rangeDragDay: TDate | null; - draggingDatePosition: DateRangePosition | null; + draggingDatePosition: RangePosition | null; } const resolveDateFromTarget = <TDate extends PickerValidDate>( @@ -136,7 +135,7 @@ const useDragRangeEvents = <TDate extends PickerValidDate>({ event.dataTransfer.setData('draggingDate', buttonDataset.timestamp); } if (buttonDataset.position) { - onDatePositionChange(buttonDataset.position as DateRangePosition); + onDatePositionChange(buttonDataset.position as RangePosition); } }); @@ -188,7 +187,7 @@ const useDragRangeEvents = <TDate extends PickerValidDate>({ const button = event.target as HTMLButtonElement; const buttonDataset = button.dataset; if (buttonDataset.position) { - onDatePositionChange(buttonDataset.position as DateRangePosition); + onDatePositionChange(buttonDataset.position as RangePosition); } }); @@ -296,7 +295,7 @@ export const useDragRange = <TDate extends PickerValidDate>({ } }); - const draggingDatePosition: DateRangePosition | null = React.useMemo(() => { + const draggingDatePosition: RangePosition | null = React.useMemo(() => { const [start, end] = dateRange; if (rangeDragDay) { if (start && utils.isBefore(rangeDragDay, start)) { diff --git a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.test.tsx b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.test.tsx index c7931687484f..c6b3c1487e6d 100644 --- a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { DateRangePicker } from '@mui/x-date-pickers-pro/DateRangePicker'; -import { fireEvent, screen } from '@mui-internal/test-utils/createRenderer'; +import { fireEvent, screen } from '@mui/internal-test-utils/createRenderer'; import { expect } from 'chai'; import { buildFieldInteractions, diff --git a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.tsx b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.tsx index bb82189f082a..d07dafc7a0d1 100644 --- a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.tsx @@ -50,7 +50,7 @@ const DateRangePicker = React.forwardRef(function DateRangePicker< DateRangePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx index ae2ae3100562..b14f206755ee 100644 --- a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx +++ b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx @@ -130,7 +130,7 @@ const DateRangePickerToolbar = React.forwardRef(function DateRangePickerToolbar< DateRangePickerToolbar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx b/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx index 95ca252d165c..a285918781a3 100644 --- a/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx +++ b/packages/x-date-pickers-pro/src/DateRangePickerDay/DateRangePickerDay.tsx @@ -211,14 +211,6 @@ const DateRangePickerDayRoot = styled('div', { ], })); -DateRangePickerDayRoot.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - ownerState: PropTypes.object.isRequired, -} as any; - const DateRangePickerDayRangeIntervalPreview = styled('div', { name: 'MuiDateRangePickerDay', slot: 'RangeIntervalPreview', @@ -272,14 +264,6 @@ const DateRangePickerDayRangeIntervalPreview = styled('div', { ], })); -DateRangePickerDayRangeIntervalPreview.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - ownerState: PropTypes.object.isRequired, -} as any; - const DateRangePickerDayDay = styled(PickersDay, { name: 'MuiDateRangePickerDay', slot: 'Day', @@ -393,7 +377,7 @@ const DateRangePickerDayRaw = React.forwardRef(function DateRangePickerDay< DateRangePickerDayRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * A ref for imperative actions. diff --git a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePicker.tsx b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePicker.tsx index 6e501d487ac4..6a3d955daa36 100644 --- a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePicker.tsx @@ -50,7 +50,7 @@ const DateTimeRangePicker = React.forwardRef(function DateTimeRangePicker< DateTimeRangePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx index 94073f8d1c41..d71f3a04fce2 100644 --- a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx +++ b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx @@ -209,7 +209,7 @@ const DateTimeRangePickerTabs = function DateTimeRangePickerTabs( DateTimeRangePickerTabs.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx index 196d8c78856d..f2ff988c224c 100644 --- a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx +++ b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx @@ -240,7 +240,7 @@ const DateTimeRangePickerToolbar = React.forwardRef(function DateTimeRangePicker DateTimeRangePickerToolbar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- ampm: PropTypes.bool, /** diff --git a/packages/x-date-pickers-pro/src/DesktopDateRangePicker/DesktopDateRangePicker.tsx b/packages/x-date-pickers-pro/src/DesktopDateRangePicker/DesktopDateRangePicker.tsx index 950ec64a3492..eae9bde06a16 100644 --- a/packages/x-date-pickers-pro/src/DesktopDateRangePicker/DesktopDateRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/DesktopDateRangePicker/DesktopDateRangePicker.tsx @@ -91,7 +91,7 @@ const DesktopDateRangePicker = React.forwardRef(function DesktopDateRangePicker< DesktopDateRangePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/DesktopDateRangePicker.test.tsx b/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/DesktopDateRangePicker.test.tsx index 367b2e348957..98032d863607 100644 --- a/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/DesktopDateRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/DesktopDateRangePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, fireEvent, userEvent, act, getByRole } from '@mui-internal/test-utils'; +import { screen, fireEvent, userEvent, act, getByRole } from '@mui/internal-test-utils'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { DesktopDateRangePicker } from '@mui/x-date-pickers-pro/DesktopDateRangePicker'; diff --git a/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/describes.DesktopDateRangePicker.test.tsx b/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/describes.DesktopDateRangePicker.test.tsx index c4915573c45d..a4498dca0101 100644 --- a/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/describes.DesktopDateRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/DesktopDateRangePicker/tests/describes.DesktopDateRangePicker.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { adapterToUse, createPickerRenderer, diff --git a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx index 70cd3bfb0dbc..5987b65694f4 100644 --- a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx @@ -220,7 +220,7 @@ const DesktopDateTimeRangePicker = React.forwardRef(function DesktopDateTimeRang DesktopDateTimeRangePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/DesktopDateTimeRangePicker.test.tsx b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/DesktopDateTimeRangePicker.test.tsx index d487a34c78de..f39f90bdb0d1 100644 --- a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/DesktopDateTimeRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/DesktopDateTimeRangePicker.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, adapterToUse, diff --git a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/describes.DesktopDateTimeRangePicker.test.tsx b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/describes.DesktopDateTimeRangePicker.test.tsx index 9c29cbf35fcf..1045076de111 100644 --- a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/describes.DesktopDateTimeRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/tests/describes.DesktopDateTimeRangePicker.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { describeConformance, screen, userEvent } from '@mui-internal/test-utils'; +import { describeConformance, screen, userEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, adapterToUse, diff --git a/packages/x-date-pickers-pro/src/MobileDateRangePicker/MobileDateRangePicker.tsx b/packages/x-date-pickers-pro/src/MobileDateRangePicker/MobileDateRangePicker.tsx index f7911b49293a..3fb9e8327ebd 100644 --- a/packages/x-date-pickers-pro/src/MobileDateRangePicker/MobileDateRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/MobileDateRangePicker/MobileDateRangePicker.tsx @@ -92,7 +92,7 @@ const MobileDateRangePicker = React.forwardRef(function MobileDateRangePicker< MobileDateRangePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/MobileDateRangePicker.test.tsx b/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/MobileDateRangePicker.test.tsx index 076f95ed07af..b69b18f4a3c9 100644 --- a/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/MobileDateRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/MobileDateRangePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { screen, userEvent, fireEvent } from '@mui-internal/test-utils'; +import { screen, userEvent, fireEvent } from '@mui/internal-test-utils'; import { MobileDateRangePicker } from '@mui/x-date-pickers-pro/MobileDateRangePicker'; import { createPickerRenderer, diff --git a/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/describes.MobileDateRangePicker.test.tsx b/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/describes.MobileDateRangePicker.test.tsx index f2458c04dc86..7b2bcf1dc888 100644 --- a/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/describes.MobileDateRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/MobileDateRangePicker/tests/describes.MobileDateRangePicker.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { screen, userEvent, fireDiscreteEvent } from '@mui-internal/test-utils'; +import { screen, userEvent, fireDiscreteEvent } from '@mui/internal-test-utils'; import { MobileDateRangePicker } from '@mui/x-date-pickers-pro/MobileDateRangePicker'; import { adapterToUse, diff --git a/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx b/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx index 088b1f9b845c..9aedd2c40dd8 100644 --- a/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx @@ -215,7 +215,7 @@ const MobileDateTimeRangePicker = React.forwardRef(function MobileDateTimeRangeP MobileDateTimeRangePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/tests/describes.MobileDateTimeRangePicker.test.tsx b/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/tests/describes.MobileDateTimeRangePicker.test.tsx index 8b7f439ca168..16358cdc5592 100644 --- a/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/tests/describes.MobileDateTimeRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/tests/describes.MobileDateTimeRangePicker.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { describeConformance, fireEvent, screen, userEvent } from '@mui-internal/test-utils'; +import { describeConformance, fireEvent, screen, userEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, adapterToUse, diff --git a/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx b/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx index 69f9a4cf87ba..018b78837697 100644 --- a/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx +++ b/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx @@ -186,7 +186,7 @@ const MultiInputDateRangeField = React.forwardRef(function MultiInputDateRangeFi MultiInputDateRangeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the `input` element is focused during the first mount. diff --git a/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx b/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx index 5ab618cc3ccb..bdeca2c378b7 100644 --- a/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx @@ -185,7 +185,7 @@ const MultiInputDateTimeRangeField = React.forwardRef(function MultiInputDateTim MultiInputDateTimeRangeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx b/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx index 3ecbd6bc1b56..a92f6ca3675c 100644 --- a/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx @@ -188,7 +188,7 @@ const MultiInputTimeRangeField = React.forwardRef(function MultiInputTimeRangeFi MultiInputTimeRangeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers-pro/src/PickersRangeCalendarHeader/PickersRangeCalendarHeader.tsx b/packages/x-date-pickers-pro/src/PickersRangeCalendarHeader/PickersRangeCalendarHeader.tsx index 8bc3001c8cac..faf5ab4b228a 100644 --- a/packages/x-date-pickers-pro/src/PickersRangeCalendarHeader/PickersRangeCalendarHeader.tsx +++ b/packages/x-date-pickers-pro/src/PickersRangeCalendarHeader/PickersRangeCalendarHeader.tsx @@ -85,7 +85,7 @@ const PickersRangeCalendarHeader = React.forwardRef(function PickersRangeCalenda PickersRangeCalendarHeader.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The number of calendars rendered. diff --git a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx index 7f0a6ac5d904..19713bd25d41 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx @@ -84,7 +84,7 @@ SingleInputDateRangeField.fieldType = 'single-input'; SingleInputDateRangeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the `input` element is focused during the first mount. diff --git a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/editing.SingleInputDateRangeField.test.tsx b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/editing.SingleInputDateRangeField.test.tsx index 3ac365c240ed..33b138e7262d 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/editing.SingleInputDateRangeField.test.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/editing.SingleInputDateRangeField.test.tsx @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { spy } from 'sinon'; import { SingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; -import { fireEvent } from '@mui-internal/test-utils'; +import { fireEvent } from '@mui/internal-test-utils'; import { expectFieldValueV7, expectFieldValueV6, diff --git a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/selection.SingleInputDateRangeField.test.tsx b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/selection.SingleInputDateRangeField.test.tsx index 4ab094a9aab0..26f9fe2ceedd 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/selection.SingleInputDateRangeField.test.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/tests/selection.SingleInputDateRangeField.test.tsx @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { SingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; -import { act, fireEvent } from '@mui-internal/test-utils'; +import { act, fireEvent } from '@mui/internal-test-utils'; import { adapterToUse, buildFieldInteractions, diff --git a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx index 47d1536f306b..1c87d69a63a2 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx @@ -84,7 +84,7 @@ SingleInputDateTimeRangeField.fieldType = 'single-input'; SingleInputDateTimeRangeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx index e9dde8dbd50c..8d483b9a2cfc 100644 --- a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx @@ -84,7 +84,7 @@ SingleInputTimeRangeField.fieldType = 'single-input'; SingleInputTimeRangeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.test.tsx b/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.test.tsx index 6878ccf060c0..b47653c3e28d 100644 --- a/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.test.tsx +++ b/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { isWeekend } from 'date-fns'; import { StaticDateRangePicker } from '@mui/x-date-pickers-pro/StaticDateRangePicker'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { wrapPickerMount, createPickerRenderer, diff --git a/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.tsx b/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.tsx index c4edec88d5b2..c9b56b0327f3 100644 --- a/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/StaticDateRangePicker/StaticDateRangePicker.tsx @@ -70,7 +70,7 @@ const StaticDateRangePicker = React.forwardRef(function StaticDateRangePicker< StaticDateRangePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers-pro/src/internals/utils/valueManagers.ts b/packages/x-date-pickers-pro/src/internals/utils/valueManagers.ts index b3dc56a8d2ce..54d0c7234c51 100644 --- a/packages/x-date-pickers-pro/src/internals/utils/valueManagers.ts +++ b/packages/x-date-pickers-pro/src/internals/utils/valueManagers.ts @@ -144,12 +144,12 @@ export const getRangeFieldValueManager = <TDate extends PickerValidDate>({ ...dateRangeSections.endDate, ]); }, - getV6InputValueFromSections: (sections, localizedDigits, isRTL) => { + getV6InputValueFromSections: (sections, localizedDigits, isRtl) => { const dateRangeSections = splitDateRangeSections(sections); return createDateStrForV6InputFromSections( [...dateRangeSections.startDate, ...dateRangeSections.endDate], localizedDigits, - isRTL, + isRtl, ); }, parseValueStr: (valueStr, referenceValue, parseDate) => { diff --git a/packages/x-date-pickers-pro/src/models/fields.ts b/packages/x-date-pickers-pro/src/models/fields.ts index 7bb292bc8e51..3f3b0c3d499b 100644 --- a/packages/x-date-pickers-pro/src/models/fields.ts +++ b/packages/x-date-pickers-pro/src/models/fields.ts @@ -9,9 +9,11 @@ import { } from '@mui/x-date-pickers/models'; import { UseClearableFieldResponse } from '@mui/x-date-pickers/hooks'; import { SxProps } from '@mui/material/styles'; +import TextField from '@mui/material/TextField'; +import { RangePosition } from './range'; export interface RangeFieldSection extends FieldSection { - dateName: 'start' | 'end'; + dateName: RangePosition; } export type FieldType = 'single-input' | 'multi-input'; @@ -86,9 +88,9 @@ export interface BaseMultiInputFieldProps< Record<string, any> >; textField?: SlotComponentProps< - React.ElementType<MultiInputFieldSlotTextFieldProps>, + typeof TextField, {}, - { position?: 'start' | 'end' } & Record<string, any> + { position?: RangePosition } & Record<string, any> >; }; } diff --git a/packages/x-date-pickers-pro/tsconfig.json b/packages/x-date-pickers-pro/tsconfig.json index c3de05a12d2b..b6443628f807 100644 --- a/packages/x-date-pickers-pro/tsconfig.json +++ b/packages/x-date-pickers-pro/tsconfig.json @@ -2,9 +2,12 @@ "extends": "../../tsconfig.json", "compilerOptions": { "types": [ + "@mui/internal-test-utils/initMatchers", "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "dayjs/plugin/timezone.d.ts", "dayjs/plugin/utc.d.ts", - "dayjs/plugin/timezone.d.ts" + "mocha" ], "noImplicitAny": false }, diff --git a/packages/x-date-pickers/package.json b/packages/x-date-pickers/package.json index 41167f18dab7..0655afb13990 100644 --- a/packages/x-date-pickers/package.json +++ b/packages/x-date-pickers/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-date-pickers", - "version": "7.5.0", + "version": "7.6.2", "description": "The community edition of the Date and Time Picker components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -45,9 +45,9 @@ "directory": "packages/x-date-pickers" }, "dependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.14", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.1", @@ -98,6 +98,7 @@ } }, "devDependencies": { + "@mui/internal-test-utils": "1.0.0", "@types/luxon": "^3.4.2", "@types/moment-hijri": "^2.1.4", "@types/moment-jalaali": "^0.7.9", @@ -110,7 +111,7 @@ "moment-hijri": "^2.1.2", "moment-jalaali": "^0.10.0", "moment-timezone": "^0.5.45", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts b/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts index 81e32479c038..47221a9ac21b 100644 --- a/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts +++ b/packages/x-date-pickers/src/AdapterDayjs/AdapterDayjs.ts @@ -280,8 +280,11 @@ export class AdapterDayjs implements MuiPickersAdapter<Dayjs, string> { if ((fixedValue.$offset ?? 0) === (value.$offset ?? 0)) { return value; } - - return fixedValue; + // Change only what is needed to avoid creating a new object with unwanted data + // Especially important when used in an environment where utc or timezone dates are used only in some places + // Reference: https://github.com/mui/mui-x/issues/13290 + // @ts-ignore + value.$offset = fixedValue.$offset; } return value; diff --git a/packages/x-date-pickers/src/DateCalendar/DateCalendar.tsx b/packages/x-date-pickers/src/DateCalendar/DateCalendar.tsx index 7c9b3442b4dd..e8dad041afc2 100644 --- a/packages/x-date-pickers/src/DateCalendar/DateCalendar.tsx +++ b/packages/x-date-pickers/src/DateCalendar/DateCalendar.tsx @@ -405,7 +405,7 @@ export const DateCalendar = React.forwardRef(function DateCalendar<TDate extends DateCalendar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers/src/DateCalendar/DayCalendar.tsx b/packages/x-date-pickers/src/DateCalendar/DayCalendar.tsx index de6365bc00af..3d68b6a08e95 100644 --- a/packages/x-date-pickers/src/DateCalendar/DayCalendar.tsx +++ b/packages/x-date-pickers/src/DateCalendar/DayCalendar.tsx @@ -2,7 +2,8 @@ import * as React from 'react'; import useEventCallback from '@mui/utils/useEventCallback'; import Typography from '@mui/material/Typography'; import { useSlotProps, SlotComponentProps } from '@mui/base/utils'; -import { styled, useTheme, useThemeProps } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; +import { styled, useThemeProps } from '@mui/material/styles'; import { unstable_composeClasses as composeClasses, unstable_useControlled as useControlled, @@ -371,8 +372,7 @@ export function DayCalendar<TDate extends PickerValidDate>(inProps: DayCalendarP const now = useNow<TDate>(timezone); const classes = useUtilityClasses(props); - const theme = useTheme(); - const isRTL = theme.direction === 'rtl'; + const isRtl = useRtl(); const isDateDisabled = useIsDateDisabled({ shouldDisableDate, @@ -428,14 +428,14 @@ export function DayCalendar<TDate extends PickerValidDate>(inProps: DayCalendarP event.preventDefault(); break; case 'ArrowLeft': { - const newFocusedDayDefault = utils.addDays(day, isRTL ? 1 : -1); - const nextAvailableMonth = utils.addMonths(day, isRTL ? 1 : -1); + const newFocusedDayDefault = utils.addDays(day, isRtl ? 1 : -1); + const nextAvailableMonth = utils.addMonths(day, isRtl ? 1 : -1); const closestDayToFocus = findClosestEnabledDate({ utils, date: newFocusedDayDefault, - minDate: isRTL ? newFocusedDayDefault : utils.startOfMonth(nextAvailableMonth), - maxDate: isRTL ? utils.endOfMonth(nextAvailableMonth) : newFocusedDayDefault, + minDate: isRtl ? newFocusedDayDefault : utils.startOfMonth(nextAvailableMonth), + maxDate: isRtl ? utils.endOfMonth(nextAvailableMonth) : newFocusedDayDefault, isDateDisabled, timezone, }); @@ -444,14 +444,14 @@ export function DayCalendar<TDate extends PickerValidDate>(inProps: DayCalendarP break; } case 'ArrowRight': { - const newFocusedDayDefault = utils.addDays(day, isRTL ? -1 : 1); - const nextAvailableMonth = utils.addMonths(day, isRTL ? -1 : 1); + const newFocusedDayDefault = utils.addDays(day, isRtl ? -1 : 1); + const nextAvailableMonth = utils.addMonths(day, isRtl ? -1 : 1); const closestDayToFocus = findClosestEnabledDate({ utils, date: newFocusedDayDefault, - minDate: isRTL ? utils.startOfMonth(nextAvailableMonth) : newFocusedDayDefault, - maxDate: isRTL ? newFocusedDayDefault : utils.endOfMonth(nextAvailableMonth), + minDate: isRtl ? utils.startOfMonth(nextAvailableMonth) : newFocusedDayDefault, + maxDate: isRtl ? newFocusedDayDefault : utils.endOfMonth(nextAvailableMonth), isDateDisabled, timezone, }); diff --git a/packages/x-date-pickers/src/DateCalendar/tests/DateCalendar.test.tsx b/packages/x-date-pickers/src/DateCalendar/tests/DateCalendar.test.tsx index 7bb1e9c0380c..5d4ff9b31eed 100644 --- a/packages/x-date-pickers/src/DateCalendar/tests/DateCalendar.test.tsx +++ b/packages/x-date-pickers/src/DateCalendar/tests/DateCalendar.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireEvent, userEvent, screen } from '@mui-internal/test-utils'; +import { fireEvent, userEvent, screen } from '@mui/internal-test-utils'; import { DateCalendar } from '@mui/x-date-pickers/DateCalendar'; import { PickersDay } from '@mui/x-date-pickers/PickersDay'; import { createPickerRenderer, adapterToUse } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/DateCalendar/tests/describes.DateCalendar.test.tsx b/packages/x-date-pickers/src/DateCalendar/tests/describes.DateCalendar.test.tsx index 98fd5c80205d..4d03f1df80d0 100644 --- a/packages/x-date-pickers/src/DateCalendar/tests/describes.DateCalendar.test.tsx +++ b/packages/x-date-pickers/src/DateCalendar/tests/describes.DateCalendar.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { DateCalendar, dateCalendarClasses as classes } from '@mui/x-date-pickers/DateCalendar'; import { pickersDayClasses } from '@mui/x-date-pickers/PickersDay'; import { diff --git a/packages/x-date-pickers/src/DateCalendar/tests/keyboard.DateCalendar.test.tsx b/packages/x-date-pickers/src/DateCalendar/tests/keyboard.DateCalendar.test.tsx index 18199a6aa1b9..606996b7beb2 100644 --- a/packages/x-date-pickers/src/DateCalendar/tests/keyboard.DateCalendar.test.tsx +++ b/packages/x-date-pickers/src/DateCalendar/tests/keyboard.DateCalendar.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { act, fireEvent, screen } from '@mui-internal/test-utils'; +import { act, fireEvent, screen } from '@mui/internal-test-utils'; import { DateCalendar } from '@mui/x-date-pickers/DateCalendar'; import { adapterToUse, createPickerRenderer } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/DateCalendar/tests/localization.DateCalendar.test.tsx b/packages/x-date-pickers/src/DateCalendar/tests/localization.DateCalendar.test.tsx index ac7f013442b4..6b4105506de2 100644 --- a/packages/x-date-pickers/src/DateCalendar/tests/localization.DateCalendar.test.tsx +++ b/packages/x-date-pickers/src/DateCalendar/tests/localization.DateCalendar.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { DateCalendar } from '@mui/x-date-pickers/DateCalendar'; import { createPickerRenderer, AdapterName } from 'test/utils/pickers'; import { he } from 'date-fns/locale'; diff --git a/packages/x-date-pickers/src/DateCalendar/tests/timezone.DateCalendar.test.tsx b/packages/x-date-pickers/src/DateCalendar/tests/timezone.DateCalendar.test.tsx index 9dec2c600498..59249ab7660b 100644 --- a/packages/x-date-pickers/src/DateCalendar/tests/timezone.DateCalendar.test.tsx +++ b/packages/x-date-pickers/src/DateCalendar/tests/timezone.DateCalendar.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { userEvent, screen } from '@mui-internal/test-utils'; +import { userEvent, screen } from '@mui/internal-test-utils'; import { describeAdapters } from 'test/utils/pickers'; import { DateCalendar } from '@mui/x-date-pickers/DateCalendar'; diff --git a/packages/x-date-pickers/src/DateCalendar/tests/validation.DateCalendar.test.tsx b/packages/x-date-pickers/src/DateCalendar/tests/validation.DateCalendar.test.tsx index 74eaafe5cfaa..618e04909e3e 100644 --- a/packages/x-date-pickers/src/DateCalendar/tests/validation.DateCalendar.test.tsx +++ b/packages/x-date-pickers/src/DateCalendar/tests/validation.DateCalendar.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen, fireEvent } from '@mui-internal/test-utils'; +import { screen, fireEvent } from '@mui/internal-test-utils'; import { DateCalendar, DateCalendarProps } from '@mui/x-date-pickers/DateCalendar'; import { PickerValidDate } from '@mui/x-date-pickers/models'; import { createPickerRenderer, adapterToUse } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/DateField/DateField.tsx b/packages/x-date-pickers/src/DateField/DateField.tsx index 9683b0cefba7..5e242f80b992 100644 --- a/packages/x-date-pickers/src/DateField/DateField.tsx +++ b/packages/x-date-pickers/src/DateField/DateField.tsx @@ -81,7 +81,7 @@ const DateField = React.forwardRef(function DateField< DateField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the `input` element is focused during the first mount. diff --git a/packages/x-date-pickers/src/DateField/tests/editing.DateField.test.tsx b/packages/x-date-pickers/src/DateField/tests/editing.DateField.test.tsx index 16777b15972a..3d419cdc9240 100644 --- a/packages/x-date-pickers/src/DateField/tests/editing.DateField.test.tsx +++ b/packages/x-date-pickers/src/DateField/tests/editing.DateField.test.tsx @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { spy } from 'sinon'; import { DateField } from '@mui/x-date-pickers/DateField'; -import { act, userEvent, fireEvent } from '@mui-internal/test-utils'; +import { act, userEvent, fireEvent } from '@mui/internal-test-utils'; import { expectFieldValueV7, getTextbox, @@ -210,7 +210,7 @@ describe('<DateField /> - Editing', () => { }); }); - describeAdapters(`key: Delete`, DateField, ({ adapter, testFieldKeyPress, renderWithProps }) => { + describeAdapters('key: Delete', DateField, ({ adapter, testFieldKeyPress, renderWithProps }) => { it('should clear the selected section when only this section is completed', () => { // Test with v7 input const v7Response = renderWithProps({ @@ -516,6 +516,234 @@ describe('<DateField /> - Editing', () => { }); }); + describeAdapters('key: PageUp', DateField, ({ adapter, testFieldKeyPress }) => { + describe('day section (PageUp)', () => { + it('should set day to minimal when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.dayOfMonth, + key: 'PageUp', + expectedValue: '01', + }); + }); + + it('should increment day by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.dayOfMonth, + defaultValue: adapter.date('2022-01-15'), + key: 'PageUp', + expectedValue: '20', + }); + }); + + it('should flip day field when value is higher than 27', () => { + testFieldKeyPress({ + format: adapter.formats.dayOfMonth, + defaultValue: adapter.date('2022-01-28'), + key: 'PageUp', + expectedValue: '02', + }); + }); + }); + + describe('weekday section (PageUp)', () => { + it('should set weekday to Sunday when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.weekday, + key: 'PageUp', + expectedValue: 'Sunday', + }); + }); + + it('should increment weekday by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.weekday, + defaultValue: adapter.date('2024-06-03'), + key: 'PageUp', + expectedValue: 'Saturday', + }); + }); + + it('should flip weekday field when value is higher than 3', () => { + testFieldKeyPress({ + format: adapter.formats.weekday, + defaultValue: adapter.date('2024-06-07'), + key: 'PageUp', + expectedValue: 'Wednesday', + }); + }); + }); + + describe('month section (PageUp)', () => { + it('should set month to January when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.month, + key: 'PageUp', + expectedValue: 'January', + }); + }); + + it('should increment month by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.month, + defaultValue: adapter.date('2022-01-15'), + key: 'PageUp', + expectedValue: 'June', + }); + }); + + it('should flip month field when value is higher than 7', () => { + testFieldKeyPress({ + format: adapter.formats.month, + defaultValue: adapter.date('2022-08-15'), + key: 'PageUp', + expectedValue: 'January', + }); + }); + }); + + describe('year section (PageUp)', () => { + it('should set year to current year when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.year, + key: 'PageUp', + expectedValue: new Date().getFullYear().toString(), + }); + }); + + it('should increment year by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.year, + defaultValue: adapter.date('2022-01-15'), + key: 'PageUp', + expectedValue: '2027', + }); + }); + + it('should flip year field when value is higher than 9995', () => { + testFieldKeyPress({ + format: adapter.formats.year, + defaultValue: adapter.date('9996-01-15'), + key: 'PageUp', + expectedValue: '0001', + }); + }); + }); + }); + + describeAdapters('key: PageDown', DateField, ({ adapter, testFieldKeyPress }) => { + describe('day section (PageDown)', () => { + it('should set day to maximal when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.dayOfMonth, + key: 'PageDown', + expectedValue: '31', + }); + }); + + it('should decrement day by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.dayOfMonth, + defaultValue: adapter.date('2022-01-15'), + key: 'PageDown', + expectedValue: '10', + }); + }); + + it('should flip day field when value is lower than 5', () => { + testFieldKeyPress({ + format: adapter.formats.dayOfMonth, + defaultValue: adapter.date('2022-01-04'), + key: 'PageDown', + expectedValue: '30', + }); + }); + }); + + describe('weekday section (PageDown)', () => { + it('should set weekday to Saturday when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.weekday, + key: 'PageDown', + expectedValue: 'Saturday', + }); + }); + + it('should decrement weekday by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.weekday, + defaultValue: adapter.date('2024-06-22'), + key: 'PageDown', + expectedValue: 'Monday', + }); + }); + + it('should flip weekday field when value is lower than 5', () => { + testFieldKeyPress({ + format: adapter.formats.weekday, + defaultValue: adapter.date('2024-06-23'), + key: 'PageDown', + expectedValue: 'Tuesday', + }); + }); + }); + + describe('month section (PageDown)', () => { + it('should set month to December when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.month, + key: 'PageDown', + expectedValue: 'December', + }); + }); + + it('should decrement month by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.month, + defaultValue: adapter.date('2022-10-15'), + key: 'PageDown', + expectedValue: 'May', + }); + }); + + it('should flip month field when value is lower than 5', () => { + testFieldKeyPress({ + format: adapter.formats.month, + defaultValue: adapter.date('2022-04-15'), + key: 'PageDown', + expectedValue: 'November', + }); + }); + }); + + describe('year section (PageDown)', () => { + it('should set year to current year when no value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.year, + key: 'PageDown', + expectedValue: new Date().getFullYear().toString(), + }); + }); + + it('should decrement year by 5 when value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.year, + defaultValue: adapter.date('2022-01-15'), + key: 'PageDown', + expectedValue: '2017', + }); + }); + + it('should flip year field when value is lower than 5', () => { + testFieldKeyPress({ + format: adapter.formats.year, + defaultValue: adapter.date('0003-01-15'), + key: 'PageDown', + expectedValue: adapter.lib === 'dayjs' ? '1898' : '9998', + }); + }); + }); + }); + describeAdapters('Digit editing', DateField, ({ adapter, testFieldChange, renderWithProps }) => { it('should set the day to the digit pressed when no digit no value is provided', () => { testFieldChange({ diff --git a/packages/x-date-pickers/src/DateField/tests/selection.DateField.test.tsx b/packages/x-date-pickers/src/DateField/tests/selection.DateField.test.tsx index 833bbdca1169..4036ee7beaf6 100644 --- a/packages/x-date-pickers/src/DateField/tests/selection.DateField.test.tsx +++ b/packages/x-date-pickers/src/DateField/tests/selection.DateField.test.tsx @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { DateField } from '@mui/x-date-pickers/DateField'; -import { act, fireEvent } from '@mui-internal/test-utils'; +import { act, fireEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, expectFieldValueV7, diff --git a/packages/x-date-pickers/src/DatePicker/DatePicker.tsx b/packages/x-date-pickers/src/DatePicker/DatePicker.tsx index ce3e8cbe9344..0d03dd027d40 100644 --- a/packages/x-date-pickers/src/DatePicker/DatePicker.tsx +++ b/packages/x-date-pickers/src/DatePicker/DatePicker.tsx @@ -51,7 +51,7 @@ const DatePicker = React.forwardRef(function DatePicker< DatePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx b/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx index 9e0dbdba817d..366996ed1a65 100644 --- a/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx +++ b/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx @@ -126,7 +126,7 @@ export const DatePickerToolbar = React.forwardRef(function DatePickerToolbar< DatePickerToolbar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-date-pickers/src/DatePicker/tests/DatePicker.test.tsx b/packages/x-date-pickers/src/DatePicker/tests/DatePicker.test.tsx index 38bf67e12795..4f46b80c9709 100644 --- a/packages/x-date-pickers/src/DatePicker/tests/DatePicker.test.tsx +++ b/packages/x-date-pickers/src/DatePicker/tests/DatePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { DatePicker } from '@mui/x-date-pickers/DatePicker'; -import { screen } from '@mui-internal/test-utils/createRenderer'; +import { screen } from '@mui/internal-test-utils/createRenderer'; import { createPickerRenderer, stubMatchMedia } from 'test/utils/pickers'; import { pickersInputBaseClasses } from '@mui/x-date-pickers/PickersTextField'; diff --git a/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx b/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx index 43e6a9358664..e0e3bb78b356 100644 --- a/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx +++ b/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx @@ -81,7 +81,7 @@ const DateTimeField = React.forwardRef(function DateTimeField< DateTimeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/DateTimeField/tests/editing.DateTimeField.test.tsx b/packages/x-date-pickers/src/DateTimeField/tests/editing.DateTimeField.test.tsx index 01307069f339..cd0885e18eef 100644 --- a/packages/x-date-pickers/src/DateTimeField/tests/editing.DateTimeField.test.tsx +++ b/packages/x-date-pickers/src/DateTimeField/tests/editing.DateTimeField.test.tsx @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireEvent } from '@mui-internal/test-utils'; +import { fireEvent } from '@mui/internal-test-utils'; import { DateTimeField } from '@mui/x-date-pickers/DateTimeField'; import { adapterToUse, diff --git a/packages/x-date-pickers/src/DateTimeField/tests/timezone.DateTimeField.test.tsx b/packages/x-date-pickers/src/DateTimeField/tests/timezone.DateTimeField.test.tsx index afad44514e14..1cc3a46e7972 100644 --- a/packages/x-date-pickers/src/DateTimeField/tests/timezone.DateTimeField.test.tsx +++ b/packages/x-date-pickers/src/DateTimeField/tests/timezone.DateTimeField.test.tsx @@ -1,6 +1,6 @@ import { spy } from 'sinon'; import { expect } from 'chai'; -import { fireEvent } from '@mui-internal/test-utils'; +import { fireEvent } from '@mui/internal-test-utils'; import { DateTimeField } from '@mui/x-date-pickers/DateTimeField'; import { createPickerRenderer, diff --git a/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.tsx b/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.tsx index 17f220ad2a9b..7150af6bee52 100644 --- a/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.tsx +++ b/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.tsx @@ -51,7 +51,7 @@ const DateTimePicker = React.forwardRef(function DateTimePicker< DateTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx index 43362d38829c..72b58d1c4f94 100644 --- a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx +++ b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx @@ -142,7 +142,7 @@ const DateTimePickerTabs = function DateTimePickerTabs(inProps: DateTimePickerTa DateTimePickerTabs.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx index 21593a3f6081..c8df143a0131 100644 --- a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx +++ b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerToolbar.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { styled, useThemeProps, useTheme, Theme } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; +import { styled, useThemeProps } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; import clsx from 'clsx'; import { PickersToolbarText } from '../internals/components/PickersToolbarText'; @@ -41,13 +42,19 @@ export interface DateTimePickerToolbarProps<TDate extends PickerValidDate> ampmInClock?: boolean; } -const useUtilityClasses = (ownerState: DateTimePickerToolbarProps<any> & { theme: Theme }) => { - const { classes, theme, isLandscape } = ownerState; +interface DateTimePickerToolbarOwnerState<TDate extends PickerValidDate> + extends DateTimePickerToolbarProps<TDate> { + isRtl: boolean; +} + +const useUtilityClasses = (ownerState: DateTimePickerToolbarOwnerState<any>) => { + const { classes, isLandscape, isRtl } = ownerState; + const slots = { root: ['root'], dateContainer: ['dateContainer'], - timeContainer: ['timeContainer', theme.direction === 'rtl' && 'timeLabelReverse'], - timeDigitsContainer: ['timeDigitsContainer', theme.direction === 'rtl' && 'timeLabelReverse'], + timeContainer: ['timeContainer', isRtl && 'timeLabelReverse'], + timeDigitsContainer: ['timeDigitsContainer', isRtl && 'timeLabelReverse'], separator: ['separator'], ampmSelection: ['ampmSelection', isLandscape && 'ampmLandscape'], ampmLabel: ['ampmLabel'], @@ -60,7 +67,7 @@ const DateTimePickerToolbarRoot = styled(PickersToolbar, { name: 'MuiDateTimePickerToolbar', slot: 'Root', overridesResolver: (props, styles) => styles.root, -})<{ ownerState: DateTimePickerToolbarProps<any> }>(({ theme }) => ({ +})<{ ownerState: DateTimePickerToolbarOwnerState<any> }>(({ theme }) => ({ paddingLeft: 16, paddingRight: 16, justifyContent: 'space-around', @@ -92,33 +99,11 @@ const DateTimePickerToolbarRoot = styled(PickersToolbar, { ], })); -DateTimePickerToolbarRoot.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - as: PropTypes.elementType, - classes: PropTypes.object, - className: PropTypes.string, - isLandscape: PropTypes.bool.isRequired, - isMobileKeyboardViewOpen: PropTypes.bool, - landscapeDirection: PropTypes.oneOf(['column', 'row']), - ownerState: PropTypes.object.isRequired, - sx: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), - PropTypes.func, - PropTypes.object, - ]), - toggleMobileKeyboardView: PropTypes.func, - toolbarTitle: PropTypes.node, - viewType: PropTypes.oneOf(['date', 'time']), -} as any; - const DateTimePickerToolbarDateContainer = styled('div', { name: 'MuiDateTimePickerToolbar', slot: 'DateContainer', overridesResolver: (props, styles) => styles.dateContainer, -})<{ ownerState: DateTimePickerToolbarProps<any> }>({ +})<{ ownerState: DateTimePickerToolbarOwnerState<any> }>({ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', @@ -128,73 +113,67 @@ const DateTimePickerToolbarTimeContainer = styled('div', { name: 'MuiDateTimePickerToolbar', slot: 'TimeContainer', overridesResolver: (props, styles) => styles.timeContainer, -})<{ ownerState: DateTimePickerToolbarProps<any> }>(({ theme }) => { - return { - display: 'flex', - flexDirection: 'row', - ...(theme.direction === 'rtl' && { - flexDirection: 'row-reverse', - }), - variants: [ - { - props: ({ isLandscape, toolbarVariant }: DateTimePickerToolbarProps<any>) => - isLandscape && toolbarVariant !== 'desktop', - style: { - flexDirection: 'column', - ...(theme.direction === 'rtl' && { - flexDirection: 'column-reverse', - }), - }, +})<{ ownerState: DateTimePickerToolbarOwnerState<any> }>({ + display: 'flex', + flexDirection: 'row', + variants: [ + { + props: { isRtl: true }, + style: { + flexDirection: 'row-reverse', }, - { - props: { toolbarVariant: 'desktop', isLandscape: false }, - style: { - gap: 9, - marginRight: 4, - alignSelf: 'flex-end', - }, + }, + { + props: { toolbarVariant: 'desktop', isLandscape: false }, + style: { + gap: 9, + marginRight: 4, + alignSelf: 'flex-end', }, - ], - }; + }, + { + props: ({ isLandscape, toolbarVariant }: DateTimePickerToolbarOwnerState<any>) => + isLandscape && toolbarVariant !== 'desktop', + style: { + flexDirection: 'column', + }, + }, + { + props: ({ isLandscape, toolbarVariant, isRtl }: DateTimePickerToolbarOwnerState<any>) => + isLandscape && toolbarVariant !== 'desktop' && isRtl, + style: { + flexDirection: 'column-reverse', + }, + }, + ], }); const DateTimePickerToolbarTimeDigitsContainer = styled('div', { name: 'MuiDateTimePickerToolbar', slot: 'TimeDigitsContainer', overridesResolver: (props, styles) => styles.timeDigitsContainer, -})<{ ownerState: DateTimePickerToolbarProps<any> }>(({ theme }) => ({ +})<{ ownerState: DateTimePickerToolbarOwnerState<any> }>({ display: 'flex', - ...(theme.direction === 'rtl' && { - flexDirection: 'row-reverse', - }), variants: [ + { + props: { isRtl: true }, + style: { + flexDirection: 'row-reverse', + }, + }, { props: { toolbarVariant: 'desktop' }, style: { gap: 1.5 }, }, ], -})); - -DateTimePickerToolbarTimeContainer.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - as: PropTypes.elementType, - ownerState: PropTypes.object.isRequired, - sx: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), - PropTypes.func, - PropTypes.object, - ]), -} as any; +}); const DateTimePickerToolbarSeparator = styled(PickersToolbarText, { name: 'MuiDateTimePickerToolbar', slot: 'Separator', overridesResolver: (props, styles) => styles.separator, })<{ - ownerState: DateTimePickerToolbarProps<any>; + ownerState: DateTimePickerToolbarOwnerState<any>; }>({ margin: '0 4px 0 2px', cursor: 'default', @@ -272,7 +251,9 @@ function DateTimePickerToolbar<TDate extends PickerValidDate>( className, ...other } = props; - const ownerState = props; + + const isRtl = useRtl(); + const ownerState: DateTimePickerToolbarOwnerState<TDate> = { ...props, isRtl }; const utils = useUtils<TDate>(); const { meridiemMode, handleMeridiemChange } = useMeridiemMode(value, ampm, onChange); @@ -280,8 +261,7 @@ function DateTimePickerToolbar<TDate extends PickerValidDate>( const isDesktop = toolbarVariant === 'desktop'; const localeText = useLocaleText<TDate>(); - const theme = useTheme(); - const classes = useUtilityClasses({ ...ownerState, theme }); + const classes = useUtilityClasses(ownerState); const toolbarTitle = inToolbarTitle ?? localeText.dateTimePickerToolbarTitle; const formatHours = (time: TDate) => @@ -424,7 +404,7 @@ function DateTimePickerToolbar<TDate extends PickerValidDate>( DateTimePickerToolbar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- ampm: PropTypes.bool, ampmInClock: PropTypes.bool, diff --git a/packages/x-date-pickers/src/DateTimePicker/tests/DateTimePicker.test.tsx b/packages/x-date-pickers/src/DateTimePicker/tests/DateTimePicker.test.tsx index 6a6b494c9fdd..94bfd89d1760 100644 --- a/packages/x-date-pickers/src/DateTimePicker/tests/DateTimePicker.test.tsx +++ b/packages/x-date-pickers/src/DateTimePicker/tests/DateTimePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker'; -import { screen } from '@mui-internal/test-utils/createRenderer'; +import { screen } from '@mui/internal-test-utils/createRenderer'; import { createPickerRenderer, stubMatchMedia } from 'test/utils/pickers'; import { pickersInputBaseClasses } from '@mui/x-date-pickers/PickersTextField'; diff --git a/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx b/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx index 1af619f65904..c6bfb2ae1f11 100644 --- a/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx +++ b/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx @@ -68,16 +68,6 @@ const DayCalendarSkeletonDay = styled(Skeleton, { ], }); -DayCalendarSkeletonDay.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - ownerState: PropTypes.shape({ - day: PropTypes.number.isRequired, - }).isRequired, -} as any; - const monthMap = [ [0, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1], @@ -128,7 +118,7 @@ function DayCalendarSkeleton(inProps: DayCalendarSkeletonProps) { DayCalendarSkeleton.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-date-pickers/src/DesktopDatePicker/DesktopDatePicker.tsx b/packages/x-date-pickers/src/DesktopDatePicker/DesktopDatePicker.tsx index ac3b3eb16202..029e27fb90e9 100644 --- a/packages/x-date-pickers/src/DesktopDatePicker/DesktopDatePicker.tsx +++ b/packages/x-date-pickers/src/DesktopDatePicker/DesktopDatePicker.tsx @@ -101,7 +101,7 @@ const DesktopDatePicker = React.forwardRef(function DesktopDatePicker< DesktopDatePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers/src/DesktopDatePicker/tests/DesktopDatePicker.test.tsx b/packages/x-date-pickers/src/DesktopDatePicker/tests/DesktopDatePicker.test.tsx index 74e5432a37ca..33cf7a786af0 100644 --- a/packages/x-date-pickers/src/DesktopDatePicker/tests/DesktopDatePicker.test.tsx +++ b/packages/x-date-pickers/src/DesktopDatePicker/tests/DesktopDatePicker.test.tsx @@ -3,7 +3,7 @@ import { expect } from 'chai'; import { spy } from 'sinon'; import { TransitionProps } from '@mui/material/transitions'; import { inputBaseClasses } from '@mui/material/InputBase'; -import { fireEvent, screen, userEvent } from '@mui-internal/test-utils'; +import { fireEvent, screen, userEvent } from '@mui/internal-test-utils'; import { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker'; import { createPickerRenderer, adapterToUse, openPicker } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/DesktopDatePicker/tests/describes.DesktopDatePicker.test.tsx b/packages/x-date-pickers/src/DesktopDatePicker/tests/describes.DesktopDatePicker.test.tsx index c5cf80884fa4..0ddae81144bf 100644 --- a/packages/x-date-pickers/src/DesktopDatePicker/tests/describes.DesktopDatePicker.test.tsx +++ b/packages/x-date-pickers/src/DesktopDatePicker/tests/describes.DesktopDatePicker.test.tsx @@ -1,4 +1,4 @@ -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, adapterToUse, diff --git a/packages/x-date-pickers/src/DesktopDatePicker/tests/field.DesktopDatePicker.test.tsx b/packages/x-date-pickers/src/DesktopDatePicker/tests/field.DesktopDatePicker.test.tsx index 65db45354ed3..808dce9bbcf9 100644 --- a/packages/x-date-pickers/src/DesktopDatePicker/tests/field.DesktopDatePicker.test.tsx +++ b/packages/x-date-pickers/src/DesktopDatePicker/tests/field.DesktopDatePicker.test.tsx @@ -1,4 +1,4 @@ -import { fireEvent } from '@mui-internal/test-utils'; +import { fireEvent } from '@mui/internal-test-utils'; import { DesktopDatePicker, DesktopDatePickerProps } from '@mui/x-date-pickers/DesktopDatePicker'; import { createPickerRenderer, diff --git a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx index 0cdbf5249418..a11c68129fcb 100644 --- a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx +++ b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx @@ -238,7 +238,7 @@ const DesktopDateTimePicker = React.forwardRef(function DesktopDateTimePicker< DesktopDateTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx index f027e7d0afd6..fca2a0f44898 100644 --- a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx +++ b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; +import { useRtl } from '@mui/system/RtlProvider'; import Divider from '@mui/material/Divider'; import { PickersLayoutContentWrapper, @@ -20,14 +21,16 @@ function DesktopDateTimePickerLayout< TDate extends PickerValidDate, TView extends DateOrTimeViewWithMeridiem, >(props: PickersLayoutProps<TValue, TDate, TView>) { + const isRtl = useRtl(); const { toolbar, tabs, content, actionBar, shortcuts } = usePickerLayout(props); - const { sx, className, isLandscape, ref } = props; + const { sx, className, isLandscape, ref, classes } = props; const isActionBarVisible = actionBar && (actionBar.props.actions?.length ?? 0) > 0; + const ownerState = { ...props, isRtl }; return ( <PickersLayoutRoot ref={ref} - className={clsx(className, pickersLayoutClasses.root)} + className={clsx(className, pickersLayoutClasses.root, classes?.root)} sx={[ { [`& .${pickersLayoutClasses.tabs}`]: { gridRow: 4, gridColumn: '1 / 4' }, @@ -35,12 +38,12 @@ function DesktopDateTimePickerLayout< }, ...(Array.isArray(sx) ? sx : [sx]), ]} - ownerState={props} + ownerState={ownerState} > {isLandscape ? shortcuts : toolbar} {isLandscape ? toolbar : shortcuts} <PickersLayoutContentWrapper - className={pickersLayoutClasses.contentWrapper} + className={clsx(pickersLayoutClasses.contentWrapper, classes?.contentWrapper)} sx={{ display: 'grid' }} > {content} @@ -55,7 +58,7 @@ function DesktopDateTimePickerLayout< DesktopDateTimePickerLayout.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, /** @@ -65,6 +68,10 @@ DesktopDateTimePickerLayout.propTypes = { className: PropTypes.string, disabled: PropTypes.bool, isLandscape: PropTypes.bool.isRequired, + /** + * `true` if the application is in right-to-left direction. + */ + isRtl: PropTypes.bool.isRequired, isValid: PropTypes.func.isRequired, onAccept: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired, diff --git a/packages/x-date-pickers/src/DesktopDateTimePicker/tests/DesktopDateTimePicker.test.tsx b/packages/x-date-pickers/src/DesktopDateTimePicker/tests/DesktopDateTimePicker.test.tsx index 291fe6533f34..ade01ebb4a70 100644 --- a/packages/x-date-pickers/src/DesktopDateTimePicker/tests/DesktopDateTimePicker.test.tsx +++ b/packages/x-date-pickers/src/DesktopDateTimePicker/tests/DesktopDateTimePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { DesktopDateTimePicker } from '@mui/x-date-pickers/DesktopDateTimePicker'; import { adapterToUse, createPickerRenderer, openPicker } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/DesktopDateTimePicker/tests/describes.DesktopDateTimePicker.test.tsx b/packages/x-date-pickers/src/DesktopDateTimePicker/tests/describes.DesktopDateTimePicker.test.tsx index 60145806da00..1bc3cde6e795 100644 --- a/packages/x-date-pickers/src/DesktopDateTimePicker/tests/describes.DesktopDateTimePicker.test.tsx +++ b/packages/x-date-pickers/src/DesktopDateTimePicker/tests/describes.DesktopDateTimePicker.test.tsx @@ -1,4 +1,4 @@ -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, adapterToUse, diff --git a/packages/x-date-pickers/src/DesktopTimePicker/DesktopTimePicker.tsx b/packages/x-date-pickers/src/DesktopTimePicker/DesktopTimePicker.tsx index 9062a5843187..26f44fac76b8 100644 --- a/packages/x-date-pickers/src/DesktopTimePicker/DesktopTimePicker.tsx +++ b/packages/x-date-pickers/src/DesktopTimePicker/DesktopTimePicker.tsx @@ -139,7 +139,7 @@ const DesktopTimePicker = React.forwardRef(function DesktopTimePicker< DesktopTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/DesktopTimePicker/tests/DesktopTimePicker.test.tsx b/packages/x-date-pickers/src/DesktopTimePicker/tests/DesktopTimePicker.test.tsx index a98180cffe74..b520cad77727 100644 --- a/packages/x-date-pickers/src/DesktopTimePicker/tests/DesktopTimePicker.test.tsx +++ b/packages/x-date-pickers/src/DesktopTimePicker/tests/DesktopTimePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { DesktopTimePicker } from '@mui/x-date-pickers/DesktopTimePicker'; import { createPickerRenderer, openPicker } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/DesktopTimePicker/tests/describes.DesktopTimePicker.test.tsx b/packages/x-date-pickers/src/DesktopTimePicker/tests/describes.DesktopTimePicker.test.tsx index 8509cf524839..38219d321165 100644 --- a/packages/x-date-pickers/src/DesktopTimePicker/tests/describes.DesktopTimePicker.test.tsx +++ b/packages/x-date-pickers/src/DesktopTimePicker/tests/describes.DesktopTimePicker.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, wrapPickerMount, diff --git a/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx b/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx index 482ec398ac38..bfd5ae2efc29 100644 --- a/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx +++ b/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx @@ -339,7 +339,7 @@ export const DigitalClock = React.forwardRef(function DigitalClock<TDate extends DigitalClock.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/DigitalClock/tests/DigitalClock.test.tsx b/packages/x-date-pickers/src/DigitalClock/tests/DigitalClock.test.tsx index 67f75a9040a8..4f6617cc90c6 100644 --- a/packages/x-date-pickers/src/DigitalClock/tests/DigitalClock.test.tsx +++ b/packages/x-date-pickers/src/DigitalClock/tests/DigitalClock.test.tsx @@ -8,7 +8,7 @@ import { digitalClockHandler, formatFullTimeValue, } from 'test/utils/pickers'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; describe('<DigitalClock />', () => { const { render } = createPickerRenderer(); diff --git a/packages/x-date-pickers/src/DigitalClock/tests/describes.DigitalClock.test.tsx b/packages/x-date-pickers/src/DigitalClock/tests/describes.DigitalClock.test.tsx index 6176930c1592..c4eb1f60a69c 100644 --- a/packages/x-date-pickers/src/DigitalClock/tests/describes.DigitalClock.test.tsx +++ b/packages/x-date-pickers/src/DigitalClock/tests/describes.DigitalClock.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { createPickerRenderer, wrapPickerMount, diff --git a/packages/x-date-pickers/src/DigitalClock/tests/timezone.DigitalClock.test.tsx b/packages/x-date-pickers/src/DigitalClock/tests/timezone.DigitalClock.test.tsx index 646b2d13a5e4..9dc25d08aef5 100644 --- a/packages/x-date-pickers/src/DigitalClock/tests/timezone.DigitalClock.test.tsx +++ b/packages/x-date-pickers/src/DigitalClock/tests/timezone.DigitalClock.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { DigitalClock } from '@mui/x-date-pickers/DigitalClock'; import { getDateOffset, describeAdapters } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.test.tsx b/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.test.tsx index b7120b6f6c0c..7995b6b0554c 100644 --- a/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.test.tsx +++ b/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { useLocalizationContext } from '@mui/x-date-pickers/internals'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; diff --git a/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.tsx b/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.tsx index f58d480c0dfc..230d00084b76 100644 --- a/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.tsx +++ b/packages/x-date-pickers/src/LocalizationProvider/LocalizationProvider.tsx @@ -156,7 +156,7 @@ export const LocalizationProvider = function LocalizationProvider< LocalizationProvider.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Locale for the date library you are using diff --git a/packages/x-date-pickers/src/MobileDatePicker/MobileDatePicker.tsx b/packages/x-date-pickers/src/MobileDatePicker/MobileDatePicker.tsx index 0ce73052f7ac..615392569b1a 100644 --- a/packages/x-date-pickers/src/MobileDatePicker/MobileDatePicker.tsx +++ b/packages/x-date-pickers/src/MobileDatePicker/MobileDatePicker.tsx @@ -98,7 +98,7 @@ const MobileDatePicker = React.forwardRef(function MobileDatePicker< MobileDatePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers/src/MobileDatePicker/tests/MobileDatePicker.test.tsx b/packages/x-date-pickers/src/MobileDatePicker/tests/MobileDatePicker.test.tsx index 2cb49768d442..1095449d3312 100644 --- a/packages/x-date-pickers/src/MobileDatePicker/tests/MobileDatePicker.test.tsx +++ b/packages/x-date-pickers/src/MobileDatePicker/tests/MobileDatePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireEvent, screen, userEvent } from '@mui-internal/test-utils'; +import { fireEvent, screen, userEvent } from '@mui/internal-test-utils'; import { PickersDay } from '@mui/x-date-pickers/PickersDay'; import { DayCalendarSkeleton } from '@mui/x-date-pickers/DayCalendarSkeleton'; import { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker'; diff --git a/packages/x-date-pickers/src/MobileDatePicker/tests/describes.MobileDatePicker.test.tsx b/packages/x-date-pickers/src/MobileDatePicker/tests/describes.MobileDatePicker.test.tsx index aec1d5224624..18898feee3ea 100644 --- a/packages/x-date-pickers/src/MobileDatePicker/tests/describes.MobileDatePicker.test.tsx +++ b/packages/x-date-pickers/src/MobileDatePicker/tests/describes.MobileDatePicker.test.tsx @@ -1,4 +1,4 @@ -import { screen, userEvent, fireEvent } from '@mui-internal/test-utils'; +import { screen, userEvent, fireEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, adapterToUse, diff --git a/packages/x-date-pickers/src/MobileDateTimePicker/MobileDateTimePicker.tsx b/packages/x-date-pickers/src/MobileDateTimePicker/MobileDateTimePicker.tsx index e987ca9c9cf1..11339d82b183 100644 --- a/packages/x-date-pickers/src/MobileDateTimePicker/MobileDateTimePicker.tsx +++ b/packages/x-date-pickers/src/MobileDateTimePicker/MobileDateTimePicker.tsx @@ -113,7 +113,7 @@ const MobileDateTimePicker = React.forwardRef(function MobileDateTimePicker< MobileDateTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/MobileDateTimePicker/tests/MobileDateTimePicker.test.tsx b/packages/x-date-pickers/src/MobileDateTimePicker/tests/MobileDateTimePicker.test.tsx index c26f5a2278d2..ad9c3641efbb 100644 --- a/packages/x-date-pickers/src/MobileDateTimePicker/tests/MobileDateTimePicker.test.tsx +++ b/packages/x-date-pickers/src/MobileDateTimePicker/tests/MobileDateTimePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireTouchChangedEvent, screen, userEvent } from '@mui-internal/test-utils'; +import { fireTouchChangedEvent, screen, userEvent } from '@mui/internal-test-utils'; import { MobileDateTimePicker } from '@mui/x-date-pickers/MobileDateTimePicker'; import { adapterToUse, diff --git a/packages/x-date-pickers/src/MobileDateTimePicker/tests/describes.MobileDateTimePicker.test.tsx b/packages/x-date-pickers/src/MobileDateTimePicker/tests/describes.MobileDateTimePicker.test.tsx index 812dfc42c6f3..31573d3dcf10 100644 --- a/packages/x-date-pickers/src/MobileDateTimePicker/tests/describes.MobileDateTimePicker.test.tsx +++ b/packages/x-date-pickers/src/MobileDateTimePicker/tests/describes.MobileDateTimePicker.test.tsx @@ -1,4 +1,4 @@ -import { screen, userEvent, fireEvent, fireTouchChangedEvent } from '@mui-internal/test-utils'; +import { screen, userEvent, fireEvent, fireTouchChangedEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, adapterToUse, diff --git a/packages/x-date-pickers/src/MobileTimePicker/MobileTimePicker.tsx b/packages/x-date-pickers/src/MobileTimePicker/MobileTimePicker.tsx index 63e299d86f32..13242ec98404 100644 --- a/packages/x-date-pickers/src/MobileTimePicker/MobileTimePicker.tsx +++ b/packages/x-date-pickers/src/MobileTimePicker/MobileTimePicker.tsx @@ -102,7 +102,7 @@ const MobileTimePicker = React.forwardRef(function MobileTimePicker< MobileTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/MobileTimePicker/tests/MobileTimePicker.test.tsx b/packages/x-date-pickers/src/MobileTimePicker/tests/MobileTimePicker.test.tsx index aac6813953bb..5bf9dade08f8 100644 --- a/packages/x-date-pickers/src/MobileTimePicker/tests/MobileTimePicker.test.tsx +++ b/packages/x-date-pickers/src/MobileTimePicker/tests/MobileTimePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { fireTouchChangedEvent, screen, userEvent, act } from '@mui-internal/test-utils'; +import { fireTouchChangedEvent, screen, userEvent, act } from '@mui/internal-test-utils'; import { MobileTimePicker } from '@mui/x-date-pickers/MobileTimePicker'; import { createPickerRenderer, diff --git a/packages/x-date-pickers/src/MobileTimePicker/tests/describes.MobileTimePicker.test.tsx b/packages/x-date-pickers/src/MobileTimePicker/tests/describes.MobileTimePicker.test.tsx index 9a1004b06832..39db06fea3e0 100644 --- a/packages/x-date-pickers/src/MobileTimePicker/tests/describes.MobileTimePicker.test.tsx +++ b/packages/x-date-pickers/src/MobileTimePicker/tests/describes.MobileTimePicker.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { screen, fireEvent, userEvent, fireTouchChangedEvent } from '@mui-internal/test-utils'; +import { screen, fireEvent, userEvent, fireTouchChangedEvent } from '@mui/internal-test-utils'; import { createPickerRenderer, wrapPickerMount, diff --git a/packages/x-date-pickers/src/MonthCalendar/MonthCalendar.tsx b/packages/x-date-pickers/src/MonthCalendar/MonthCalendar.tsx index a537531d9488..dc82ef25fa3e 100644 --- a/packages/x-date-pickers/src/MonthCalendar/MonthCalendar.tsx +++ b/packages/x-date-pickers/src/MonthCalendar/MonthCalendar.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; -import { useTheme } from '@mui/system'; +import { useRtl } from '@mui/system/RtlProvider'; import { styled, useThemeProps } from '@mui/material/styles'; import { unstable_useControlled as useControlled, @@ -119,7 +119,7 @@ export const MonthCalendar = React.forwardRef(function MonthCalendar<TDate exten }); const now = useNow<TDate>(timezone); - const theme = useTheme(); + const isRtl = useRtl(); const utils = useUtils<TDate>(); const referenceDate = React.useMemo( @@ -236,12 +236,12 @@ export const MonthCalendar = React.forwardRef(function MonthCalendar<TDate exten event.preventDefault(); break; case 'ArrowLeft': - focusMonth((monthsInYear + month + (theme.direction === 'ltr' ? -1 : 1)) % monthsInYear); + focusMonth((monthsInYear + month + (isRtl ? 1 : -1)) % monthsInYear); event.preventDefault(); break; case 'ArrowRight': - focusMonth((monthsInYear + month + (theme.direction === 'ltr' ? 1 : -1)) % monthsInYear); + focusMonth((monthsInYear + month + (isRtl ? -1 : 1)) % monthsInYear); event.preventDefault(); break; @@ -303,7 +303,7 @@ export const MonthCalendar = React.forwardRef(function MonthCalendar<TDate exten MonthCalendar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- autoFocus: PropTypes.bool, /** diff --git a/packages/x-date-pickers/src/MonthCalendar/tests/MonthCalendar.test.tsx b/packages/x-date-pickers/src/MonthCalendar/tests/MonthCalendar.test.tsx index b1b43d22c07f..98cb6e98686e 100644 --- a/packages/x-date-pickers/src/MonthCalendar/tests/MonthCalendar.test.tsx +++ b/packages/x-date-pickers/src/MonthCalendar/tests/MonthCalendar.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { fireEvent, screen } from '@mui-internal/test-utils'; +import { fireEvent, screen } from '@mui/internal-test-utils'; import { MonthCalendar } from '@mui/x-date-pickers/MonthCalendar'; import { createPickerRenderer, adapterToUse } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/MonthCalendar/tests/describes.MonthCalendar.test.tsx b/packages/x-date-pickers/src/MonthCalendar/tests/describes.MonthCalendar.test.tsx index 2dffbb7b6707..e34093f7fb33 100644 --- a/packages/x-date-pickers/src/MonthCalendar/tests/describes.MonthCalendar.test.tsx +++ b/packages/x-date-pickers/src/MonthCalendar/tests/describes.MonthCalendar.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { userEvent, screen } from '@mui-internal/test-utils'; +import { userEvent, screen } from '@mui/internal-test-utils'; import { wrapPickerMount, createPickerRenderer, diff --git a/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx b/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx index aed9518b528f..1ddd575baff5 100644 --- a/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx +++ b/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx @@ -431,7 +431,7 @@ export const MultiSectionDigitalClock = React.forwardRef(function MultiSectionDi MultiSectionDigitalClock.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/MultiSectionDigitalClock.test.tsx b/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/MultiSectionDigitalClock.test.tsx index a37fa75c2e99..6229a42f0e22 100644 --- a/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/MultiSectionDigitalClock.test.tsx +++ b/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/MultiSectionDigitalClock.test.tsx @@ -10,7 +10,7 @@ import { adapterToUse, multiSectionDigitalClockHandler, } from 'test/utils/pickers'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; describe('<MultiSectionDigitalClock />', () => { const { render } = createPickerRenderer(); diff --git a/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/describes.MultiSectionDigitalClock.test.tsx b/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/describes.MultiSectionDigitalClock.test.tsx index a9d72478d6de..ed61d90f3988 100644 --- a/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/describes.MultiSectionDigitalClock.test.tsx +++ b/packages/x-date-pickers/src/MultiSectionDigitalClock/tests/describes.MultiSectionDigitalClock.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { createPickerRenderer, wrapPickerMount, diff --git a/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.test.tsx b/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.test.tsx index 066f60e07b48..c4837e507ce7 100644 --- a/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.test.tsx +++ b/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { PickersActionBar } from '@mui/x-date-pickers/PickersActionBar'; import { createPickerRenderer } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx b/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx index 78dc13fee9e0..f2f5f05ffe38 100644 --- a/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx +++ b/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx @@ -79,7 +79,7 @@ function PickersActionBar(props: PickersActionBarProps) { PickersActionBar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Ordered array of actions to display. diff --git a/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx b/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx index e7bbfe369dc5..a172fa35fee2 100644 --- a/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx +++ b/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx @@ -265,7 +265,7 @@ const PickersCalendarHeader = React.forwardRef(function PickersCalendarHeader< PickersCalendarHeader.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-date-pickers/src/PickersDay/PickersDay.test.tsx b/packages/x-date-pickers/src/PickersDay/PickersDay.test.tsx index 350d7b72f788..361f7d7ae798 100644 --- a/packages/x-date-pickers/src/PickersDay/PickersDay.test.tsx +++ b/packages/x-date-pickers/src/PickersDay/PickersDay.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireEvent, screen } from '@mui-internal/test-utils'; +import { fireEvent, screen } from '@mui/internal-test-utils'; import ButtonBase from '@mui/material/ButtonBase'; import { PickersDay, pickersDayClasses as classes } from '@mui/x-date-pickers/PickersDay'; import { adapterToUse, wrapPickerMount, createPickerRenderer } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/PickersDay/PickersDay.tsx b/packages/x-date-pickers/src/PickersDay/PickersDay.tsx index ef0279f6a134..b4bcfb74e731 100644 --- a/packages/x-date-pickers/src/PickersDay/PickersDay.tsx +++ b/packages/x-date-pickers/src/PickersDay/PickersDay.tsx @@ -353,7 +353,7 @@ const PickersDayRaw = React.forwardRef(function PickersDay<TDate extends PickerV PickersDayRaw.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * A ref for imperative actions. diff --git a/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx b/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx index 0937bce1cb7f..bece27f61de4 100644 --- a/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx +++ b/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx @@ -19,11 +19,11 @@ const useUtilityClasses = (ownerState: PickersLayoutProps<any, any, any>) => { return composeClasses(slots, getPickersLayoutUtilityClass, classes); }; -const PickersLayoutRoot = styled('div', { +export const PickersLayoutRoot = styled('div', { name: 'MuiPickersLayout', slot: 'Root', overridesResolver: (props, styles) => styles.root, -})<{ ownerState: { isLandscape: boolean } }>(({ theme }) => ({ +})<{ ownerState: PickersLayoutProps<any, any, any> }>({ display: 'grid', gridAutoColumns: 'max-content auto max-content', gridAutoRows: 'max-content auto max-content', @@ -33,42 +33,40 @@ const PickersLayoutRoot = styled('div', { props: { isLandscape: true }, style: { [`& .${pickersLayoutClasses.toolbar}`]: { - gridColumn: theme.direction === 'rtl' ? 3 : 1, + gridColumn: 1, gridRow: '2 / 3', }, [`.${pickersLayoutClasses.shortcuts}`]: { gridColumn: '2 / 4', gridRow: 1 }, }, }, + { + props: { isLandscape: true, isRtl: true }, + style: { + [`& .${pickersLayoutClasses.toolbar}`]: { + gridColumn: 3, + }, + }, + }, { props: { isLandscape: false }, style: { [`& .${pickersLayoutClasses.toolbar}`]: { gridColumn: '2 / 4', gridRow: 1 }, [`& .${pickersLayoutClasses.shortcuts}`]: { - gridColumn: theme.direction === 'rtl' ? 3 : 1, + gridColumn: 1, gridRow: '2 / 3', }, }, }, + { + props: { isLandscape: false, isRtl: true }, + style: { + [`& .${pickersLayoutClasses.shortcuts}`]: { + gridColumn: 3, + }, + }, + }, ], -})); - -PickersLayoutRoot.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - as: PropTypes.elementType, - ownerState: PropTypes.shape({ - isLandscape: PropTypes.bool.isRequired, - }).isRequired, - sx: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), - PropTypes.func, - PropTypes.object, - ]), -} as any; - -export { PickersLayoutRoot }; +}); export const PickersLayoutContentWrapper = styled('div', { name: 'MuiPickersLayout', @@ -100,15 +98,14 @@ const PickersLayout = function PickersLayout< const { toolbar, content, tabs, actionBar, shortcuts } = usePickerLayout(props); const { sx, className, isLandscape, ref, wrapperVariant } = props; - const ownerState = props; - const classes = useUtilityClasses(ownerState); + const classes = useUtilityClasses(props); return ( <PickersLayoutRoot ref={ref} sx={sx} className={clsx(className, classes.root)} - ownerState={ownerState} + ownerState={props} > {isLandscape ? shortcuts : toolbar} {isLandscape ? toolbar : shortcuts} @@ -133,7 +130,7 @@ const PickersLayout = function PickersLayout< PickersLayout.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, /** @@ -143,6 +140,10 @@ PickersLayout.propTypes = { className: PropTypes.string, disabled: PropTypes.bool, isLandscape: PropTypes.bool.isRequired, + /** + * `true` if the application is in right-to-left direction. + */ + isRtl: PropTypes.bool.isRequired, isValid: PropTypes.func.isRequired, onAccept: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired, diff --git a/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts b/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts index 32cb59af51f4..a4353354226e 100644 --- a/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts +++ b/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts @@ -1,14 +1,17 @@ import * as React from 'react'; import { SxProps, Theme } from '@mui/material/styles'; import { SlotComponentProps } from '@mui/base/utils'; -import { PickersActionBarProps } from '../PickersActionBar'; +import { PickersActionBar, PickersActionBarProps } from '../PickersActionBar'; import { BaseToolbarProps, ExportedBaseToolbarProps } from '../internals/models/props/toolbar'; import { BaseTabsProps, ExportedBaseTabsProps } from '../internals/models/props/tabs'; import { UsePickerLayoutPropsResponseLayoutProps } from '../internals/hooks/usePicker/usePickerLayoutProps'; import { PickersLayoutClasses } from './pickersLayoutClasses'; import { DateOrTimeViewWithMeridiem, WrapperVariant } from '../internals/models/common'; import { PickersShortcutsProps } from '../PickersShortcuts'; -import { ExportedPickersShortcutProps } from '../PickersShortcuts/PickersShortcuts'; +import { + ExportedPickersShortcutProps, + PickersShortcuts, +} from '../PickersShortcuts/PickersShortcuts'; import { PickerValidDate } from '../models'; export interface ExportedPickersLayoutSlots< @@ -56,20 +59,14 @@ export interface ExportedPickersLayoutSlotProps< * Props passed down to the action bar component. */ actionBar?: SlotComponentProps< - React.ComponentType< - Omit<PickersActionBarProps, 'onAccept' | 'onClear' | 'onCancel' | 'onSetToday'> - >, + typeof PickersActionBar, {}, PickersLayoutActionBarOwnerState<TValue, TDate, TView> >; /** * Props passed down to the shortcuts component. */ - shortcuts?: SlotComponentProps< - React.ComponentType<PickersShortcutsProps<TValue>>, - {}, - PickersShortcutsOwnerState<TValue> - >; + shortcuts?: SlotComponentProps<typeof PickersShortcuts, {}, PickersShortcutsOwnerState<TValue>>; /** * Props passed down to the layoutRoot component. */ @@ -137,6 +134,10 @@ export interface PickersLayoutProps< * @default {} */ slotProps?: PickersLayoutSlotProps<TValue, TDate, TView>; + /** + * `true` if the application is in right-to-left direction. + */ + isRtl: boolean; } export interface SubComponents<TValue> { diff --git a/packages/x-date-pickers/src/PickersSectionList/PickersSectionList.tsx b/packages/x-date-pickers/src/PickersSectionList/PickersSectionList.tsx index 64f3ddf16c2f..c9aaac3716cb 100644 --- a/packages/x-date-pickers/src/PickersSectionList/PickersSectionList.tsx +++ b/packages/x-date-pickers/src/PickersSectionList/PickersSectionList.tsx @@ -225,7 +225,7 @@ const PickersSectionList = React.forwardRef(function PickersSectionList( PickersSectionList.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx b/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx index b0b943ef46d1..991a4d5ae7a4 100644 --- a/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx +++ b/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx @@ -105,7 +105,7 @@ function PickersShortcuts<TValue>(props: PickersShortcutsProps<TValue>) { PickersShortcuts.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Importance of the change when picking a shortcut: diff --git a/packages/x-date-pickers/src/PickersTextField/PickersFilledInput/PickersFilledInput.tsx b/packages/x-date-pickers/src/PickersTextField/PickersFilledInput/PickersFilledInput.tsx index e86c0556e22d..74e10a3bd050 100644 --- a/packages/x-date-pickers/src/PickersTextField/PickersFilledInput/PickersFilledInput.tsx +++ b/packages/x-date-pickers/src/PickersTextField/PickersFilledInput/PickersFilledInput.tsx @@ -246,7 +246,7 @@ const PickersFilledInput = React.forwardRef(function PickersFilledInput( PickersFilledInput.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Is `true` if the current values equals the empty value. diff --git a/packages/x-date-pickers/src/PickersTextField/PickersInput/PickersInput.tsx b/packages/x-date-pickers/src/PickersTextField/PickersInput/PickersInput.tsx index a26c819e0286..877d9dde9221 100644 --- a/packages/x-date-pickers/src/PickersTextField/PickersInput/PickersInput.tsx +++ b/packages/x-date-pickers/src/PickersTextField/PickersInput/PickersInput.tsx @@ -161,7 +161,7 @@ const PickersInput = React.forwardRef(function PickersInput( PickersInput.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Is `true` if the current values equals the empty value. diff --git a/packages/x-date-pickers/src/PickersTextField/PickersInputBase/PickersInputBase.tsx b/packages/x-date-pickers/src/PickersTextField/PickersInputBase/PickersInputBase.tsx index 1ec0341917be..7c118ea29b1a 100644 --- a/packages/x-date-pickers/src/PickersTextField/PickersInputBase/PickersInputBase.tsx +++ b/packages/x-date-pickers/src/PickersTextField/PickersInputBase/PickersInputBase.tsx @@ -8,6 +8,7 @@ import composeClasses from '@mui/utils/composeClasses'; import capitalize from '@mui/utils/capitalize'; import { useSlotProps } from '@mui/base/utils'; import visuallyHidden from '@mui/utils/visuallyHidden'; +import { useRtl } from '@mui/system/RtlProvider'; import { pickersInputBaseClasses, getPickersInputBaseUtilityClass, @@ -63,8 +64,13 @@ export const PickersInputBaseSectionsContainer = styled(PickersSectionListRoot, letterSpacing: 'inherit', // Baseline behavior width: '182px', - ...(theme.direction === 'rtl' && { textAlign: 'right /*! @noflip */' as any }), variants: [ + { + props: { isRtl: true }, + style: { + textAlign: 'right /*! @noflip */' as any, + }, + }, { props: { size: 'small' }, style: { @@ -174,7 +180,9 @@ const useUtilityClasses = (ownerState: OwnerStateType) => { interface OwnerStateType extends FormControlState, - Omit<PickersInputBaseProps, keyof FormControlState> {} + Omit<PickersInputBaseProps, keyof FormControlState> { + isRtl: boolean; +} /** * @ignore - internal component. @@ -219,7 +227,7 @@ const PickersInputBase = React.forwardRef(function PickersInputBase( const rootRef = React.useRef<HTMLDivElement>(null); const handleRootRef = useForkRef(ref, rootRef); const handleInputRef = useForkRef(inputProps?.ref, inputRef); - + const isRtl = useRtl(); const muiFormControl = useFormControl(); if (!muiFormControl) { throw new Error( @@ -259,6 +267,7 @@ const PickersInputBase = React.forwardRef(function PickersInputBase( const ownerState: OwnerStateType = { ...(props as Omit<PickersInputBaseProps, keyof FormControlState>), ...muiFormControl, + isRtl, }; const classes = useUtilityClasses(ownerState); @@ -338,7 +347,7 @@ const PickersInputBase = React.forwardRef(function PickersInputBase( PickersInputBase.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Is `true` if the current values equals the empty value. diff --git a/packages/x-date-pickers/src/PickersTextField/PickersOutlinedInput/PickersOutlinedInput.tsx b/packages/x-date-pickers/src/PickersTextField/PickersOutlinedInput/PickersOutlinedInput.tsx index 2dbcec6510a9..9ab29a6dfb61 100644 --- a/packages/x-date-pickers/src/PickersTextField/PickersOutlinedInput/PickersOutlinedInput.tsx +++ b/packages/x-date-pickers/src/PickersTextField/PickersOutlinedInput/PickersOutlinedInput.tsx @@ -57,7 +57,7 @@ const PickersOutlinedInputRoot = styled(PickersInputBaseRoot, { }, variants: Object.keys((theme.vars ?? theme).palette) // @ts-ignore - .filter((key) => (theme.vars ?? theme).palette[key].main) + .filter((key) => (theme.vars ?? theme).palette[key]?.main ?? false) .map((color) => ({ props: { color }, style: { @@ -164,7 +164,7 @@ const PickersOutlinedInput = React.forwardRef(function PickersOutlinedInput( PickersOutlinedInput.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Is `true` if the current values equals the empty value. diff --git a/packages/x-date-pickers/src/PickersTextField/PickersTextField.tsx b/packages/x-date-pickers/src/PickersTextField/PickersTextField.tsx index 2c670bfaf1fe..0303989d847c 100644 --- a/packages/x-date-pickers/src/PickersTextField/PickersTextField.tsx +++ b/packages/x-date-pickers/src/PickersTextField/PickersTextField.tsx @@ -170,7 +170,7 @@ const PickersTextField = React.forwardRef(function PickersTextField( PickersTextField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Is `true` if the current values equals the empty value. diff --git a/packages/x-date-pickers/src/StaticDatePicker/StaticDatePicker.tsx b/packages/x-date-pickers/src/StaticDatePicker/StaticDatePicker.tsx index 02b551d184a9..a26561d9b98e 100644 --- a/packages/x-date-pickers/src/StaticDatePicker/StaticDatePicker.tsx +++ b/packages/x-date-pickers/src/StaticDatePicker/StaticDatePicker.tsx @@ -69,7 +69,7 @@ const StaticDatePicker = React.forwardRef(function StaticDatePicker<TDate extend StaticDatePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * If `true`, the main element is focused during the first mount. diff --git a/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePicker.test.tsx b/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePicker.test.tsx index e199f726387f..4041769edcd6 100644 --- a/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePicker.test.tsx +++ b/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePicker.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { fireEvent, screen } from '@mui-internal/test-utils'; +import { fireEvent, screen } from '@mui/internal-test-utils'; import { StaticDatePicker } from '@mui/x-date-pickers/StaticDatePicker'; import { createPickerRenderer, adapterToUse } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePickerKeyboard.test.tsx b/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePickerKeyboard.test.tsx index d4d71dc9c534..49d7175b1c74 100644 --- a/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePickerKeyboard.test.tsx +++ b/packages/x-date-pickers/src/StaticDatePicker/tests/StaticDatePickerKeyboard.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { act, fireEvent, screen } from '@mui-internal/test-utils'; +import { act, fireEvent, screen } from '@mui/internal-test-utils'; import { StaticDatePicker } from '@mui/x-date-pickers/StaticDatePicker'; import { DateView } from '@mui/x-date-pickers/models'; import { createPickerRenderer, adapterToUse } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/StaticDateTimePicker/StaticDateTimePicker.tsx b/packages/x-date-pickers/src/StaticDateTimePicker/StaticDateTimePicker.tsx index 90c1564ba713..e9a97bcf54df 100644 --- a/packages/x-date-pickers/src/StaticDateTimePicker/StaticDateTimePicker.tsx +++ b/packages/x-date-pickers/src/StaticDateTimePicker/StaticDateTimePicker.tsx @@ -83,7 +83,7 @@ const StaticDateTimePicker = React.forwardRef(function StaticDateTimePicker< StaticDateTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/StaticDateTimePicker/tests/StaticDateTimePicker.test.tsx b/packages/x-date-pickers/src/StaticDateTimePicker/tests/StaticDateTimePicker.test.tsx index 234b51de5d2a..272eec547223 100644 --- a/packages/x-date-pickers/src/StaticDateTimePicker/tests/StaticDateTimePicker.test.tsx +++ b/packages/x-date-pickers/src/StaticDateTimePicker/tests/StaticDateTimePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireEvent, screen } from '@mui-internal/test-utils'; +import { fireEvent, screen } from '@mui/internal-test-utils'; import { StaticDateTimePicker } from '@mui/x-date-pickers/StaticDateTimePicker'; import { createPickerRenderer, adapterToUse } from 'test/utils/pickers'; import { DateTimePickerTabs, DateTimePickerTabsProps } from '../../DateTimePicker'; diff --git a/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.test.tsx b/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.test.tsx index 2707309d065b..7cb2ef91eaae 100644 --- a/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.test.tsx +++ b/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireTouchChangedEvent, screen, getAllByRole, fireEvent } from '@mui-internal/test-utils'; +import { fireTouchChangedEvent, screen, getAllByRole, fireEvent } from '@mui/internal-test-utils'; import { adapterToUse, wrapPickerMount, diff --git a/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.tsx b/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.tsx index fc36aa627a6a..39832d96e2f3 100644 --- a/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.tsx +++ b/packages/x-date-pickers/src/StaticTimePicker/StaticTimePicker.tsx @@ -72,7 +72,7 @@ const StaticTimePicker = React.forwardRef(function StaticTimePicker<TDate extend StaticTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/TimeClock/TimeClock.tsx b/packages/x-date-pickers/src/TimeClock/TimeClock.tsx index d184ffd59879..d810209f3047 100644 --- a/packages/x-date-pickers/src/TimeClock/TimeClock.tsx +++ b/packages/x-date-pickers/src/TimeClock/TimeClock.tsx @@ -389,7 +389,7 @@ export const TimeClock = React.forwardRef(function TimeClock<TDate extends Picke TimeClock.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/TimeClock/tests/TimeClock.test.tsx b/packages/x-date-pickers/src/TimeClock/tests/TimeClock.test.tsx index d3b8669611b4..36bfb4c6597b 100644 --- a/packages/x-date-pickers/src/TimeClock/tests/TimeClock.test.tsx +++ b/packages/x-date-pickers/src/TimeClock/tests/TimeClock.test.tsx @@ -7,7 +7,7 @@ import { screen, within, getAllByRole, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { TimeClock } from '@mui/x-date-pickers/TimeClock'; import { createPickerRenderer, adapterToUse, timeClockHandler } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/TimeClock/tests/describes.TimeClock.test.tsx b/packages/x-date-pickers/src/TimeClock/tests/describes.TimeClock.test.tsx index 1dbba428386e..f2b06f645f4c 100644 --- a/packages/x-date-pickers/src/TimeClock/tests/describes.TimeClock.test.tsx +++ b/packages/x-date-pickers/src/TimeClock/tests/describes.TimeClock.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { clockPointerClasses, TimeClock, diff --git a/packages/x-date-pickers/src/TimeClock/tests/timezone.TimeClock.test.tsx b/packages/x-date-pickers/src/TimeClock/tests/timezone.TimeClock.test.tsx index eb275736c53a..c3886da5774c 100644 --- a/packages/x-date-pickers/src/TimeClock/tests/timezone.TimeClock.test.tsx +++ b/packages/x-date-pickers/src/TimeClock/tests/timezone.TimeClock.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { screen, fireTouchChangedEvent } from '@mui-internal/test-utils'; +import { screen, fireTouchChangedEvent } from '@mui/internal-test-utils'; import { TimeClock } from '@mui/x-date-pickers/TimeClock'; import { getClockTouchEvent, diff --git a/packages/x-date-pickers/src/TimeField/TimeField.tsx b/packages/x-date-pickers/src/TimeField/TimeField.tsx index 36d86491800f..da1ecf38b3f8 100644 --- a/packages/x-date-pickers/src/TimeField/TimeField.tsx +++ b/packages/x-date-pickers/src/TimeField/TimeField.tsx @@ -81,7 +81,7 @@ const TimeField = React.forwardRef(function TimeField< TimeField.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/TimeField/tests/editing.TimeField.test.tsx b/packages/x-date-pickers/src/TimeField/tests/editing.TimeField.test.tsx index 3419e4a726f9..bd0311e210bb 100644 --- a/packages/x-date-pickers/src/TimeField/tests/editing.TimeField.test.tsx +++ b/packages/x-date-pickers/src/TimeField/tests/editing.TimeField.test.tsx @@ -1,7 +1,7 @@ import { expect } from 'chai'; import { spy } from 'sinon'; import { TimeField } from '@mui/x-date-pickers/TimeField'; -import { fireEvent } from '@mui-internal/test-utils'; +import { fireEvent } from '@mui/internal-test-utils'; import { expectFieldValueV7, expectFieldValueV6, @@ -204,6 +204,250 @@ describe('<TimeField /> - Editing', () => { }); }); + describeAdapters('key: PageDown', TimeField, ({ adapter, testFieldKeyPress }) => { + describe('24 hours format (PageDown)', () => { + describe('Hours field', () => { + it('should set hours field to maximal when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours24h, + key: 'PageDown', + expectedValue: '23', + selectedSection: 'hours', + }); + }); + + it('should decrement hours field by 5 when default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours24h, + key: 'PageDown', + defaultValue: adapter.date('2024-06-04T10:25:00'), + expectedValue: '05', + selectedSection: 'hours', + }); + }); + + it('should flip hours field when default value is lower than 5', () => { + testFieldKeyPress({ + format: adapter.formats.hours24h, + key: 'PageDown', + defaultValue: adapter.date('2024-06-04T02:25:00'), + expectedValue: '21', + selectedSection: 'hours', + }); + }); + }); + + describe('Minutes field', () => { + it('should set minutes field to maximal when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.minutes, + key: 'PageDown', + expectedValue: '59', + }); + }); + + it('should decrement minutes field by 5 when default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.minutes, + key: 'PageDown', + defaultValue: adapter.date('2024-06-04T10:59:00'), + expectedValue: '54', + }); + }); + + it('should flip minutes field when default value is lower than 5', () => { + testFieldKeyPress({ + format: adapter.formats.minutes, + key: 'PageDown', + defaultValue: adapter.date('2024-06-04T02:02:00'), + expectedValue: '57', + }); + }); + }); + }); + + describe('12 hours format (PageDown)', () => { + describe('Hours field', () => { + it('should set hours field to maximal when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours12h, + key: 'PageDown', + expectedValue: '12', + }); + }); + + it('should decrement hours field by 5 when default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours12h, + key: 'PageDown', + defaultValue: adapter.date('2024-06-04T10:25:00'), + expectedValue: '05', + }); + }); + + it('should flip hours field when default value is lower than 5', () => { + testFieldKeyPress({ + format: adapter.formats.hours12h, + key: 'PageDown', + defaultValue: adapter.date('2024-06-04T02:25:00'), + expectedValue: '09', + }); + }); + }); + + describe('Meridiem field', () => { + it('should set meridiem to PM when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.meridiem, + key: 'PageDown', + expectedValue: 'PM', + selectedSection: 'meridiem', + }); + }); + + it('should switch between AM and PM when meridiem value is not empty', () => { + testFieldKeyPress({ + format: adapter.formats.meridiem, + defaultValue: adapter.date('2024-05-30T02:12:25'), + key: 'PageDown', + expectedValue: 'PM', + selectedSection: 'meridiem', + }); + testFieldKeyPress({ + format: adapter.formats.meridiem, + defaultValue: adapter.date('2024-05-30T20:12:25'), + key: 'PageDown', + expectedValue: 'AM', + selectedSection: 'meridiem', + }); + }); + }); + }); + }); + + describeAdapters('key: PageUp', TimeField, ({ adapter, testFieldKeyPress }) => { + describe('24 hours format (PageUp)', () => { + describe('Hours field', () => { + it('should set hours field to minimal when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours24h, + key: 'PageUp', + expectedValue: '00', + selectedSection: 'hours', + }); + }); + + it('should increment hours field by 5 when default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours24h, + key: 'PageUp', + defaultValue: adapter.date('2024-06-04T10:25:00'), + expectedValue: '15', + selectedSection: 'hours', + }); + }); + + it('should flip hours field when default value is higher than 19', () => { + testFieldKeyPress({ + format: adapter.formats.hours24h, + key: 'PageUp', + defaultValue: adapter.date('2024-06-04T21:25:00'), + expectedValue: '02', + selectedSection: 'hours', + }); + }); + }); + + describe('Minutes field', () => { + it('should set minutes field to minimal when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours24h, + key: 'PageUp', + expectedValue: '00', + }); + }); + + it('should increment minutes field by 5 when default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.minutes, + key: 'PageUp', + defaultValue: adapter.date('2024-06-04T10:25:00'), + expectedValue: '30', + }); + }); + + it('should flip minutes field when default value is higher than 55', () => { + testFieldKeyPress({ + format: adapter.formats.minutes, + key: 'PageUp', + defaultValue: adapter.date('2024-06-04T21:56:00'), + expectedValue: '01', + }); + }); + }); + }); + describe('12 hours format (PageUp)', () => { + describe('Hours field', () => { + it('should set hours field to minimal when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours12h, + key: 'PageUp', + expectedValue: '01', + selectedSection: 'hours', + }); + }); + + it('should increment hours field by 5 when default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.hours12h, + key: 'PageUp', + defaultValue: adapter.date('2024-06-04T05:25:00'), + expectedValue: '10', + selectedSection: 'hours', + }); + }); + + it('should flip hours field when default value is higher than 07', () => { + testFieldKeyPress({ + format: adapter.formats.hours12h, + key: 'PageUp', + defaultValue: adapter.date('2024-06-04T08:25:00'), + expectedValue: '01', + selectedSection: 'hours', + }); + }); + }); + + describe('Meridiem field', () => { + it('should set meridiem to AM when no default value is provided', () => { + testFieldKeyPress({ + format: adapter.formats.meridiem, + key: 'PageUp', + expectedValue: 'AM', + selectedSection: 'meridiem', + }); + }); + + it('should switch between AM and PM when meridiem value is not empty', () => { + testFieldKeyPress({ + format: adapter.formats.meridiem, + defaultValue: adapter.date('2024-05-30T02:12:25'), + key: 'PageUp', + expectedValue: 'PM', + selectedSection: 'meridiem', + }); + testFieldKeyPress({ + format: adapter.formats.meridiem, + defaultValue: adapter.date('2024-05-30T20:12:25'), + key: 'PageUp', + expectedValue: 'AM', + selectedSection: 'meridiem', + }); + }); + }); + }); + }); + describeAdapters('Digit editing', TimeField, ({ adapter, renderWithProps, testFieldChange }) => { it('should set the minute to the digit pressed when no digit no value is provided', () => { testFieldChange({ diff --git a/packages/x-date-pickers/src/TimePicker/TimePicker.tsx b/packages/x-date-pickers/src/TimePicker/TimePicker.tsx index 00366525a661..096406665d1d 100644 --- a/packages/x-date-pickers/src/TimePicker/TimePicker.tsx +++ b/packages/x-date-pickers/src/TimePicker/TimePicker.tsx @@ -51,7 +51,7 @@ const TimePicker = React.forwardRef(function TimePicker< TimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. diff --git a/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx b/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx index ff2bf30ac5fd..a24f68cf5711 100644 --- a/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx +++ b/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import clsx from 'clsx'; import PropTypes from 'prop-types'; -import { useTheme, styled, Theme, useThemeProps } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; +import { styled, useThemeProps } from '@mui/material/styles'; import { unstable_composeClasses as composeClasses } from '@mui/utils'; import { PickersToolbarText } from '../internals/components/PickersToolbarText'; import { PickersToolbarButton } from '../internals/components/PickersToolbarButton'; @@ -26,6 +27,11 @@ export interface TimePickerToolbarProps<TDate extends PickerValidDate> ampmInClock?: boolean; } +interface TimePickerToolbarOwnerState<TDate extends PickerValidDate> + extends TimePickerToolbarProps<TDate> { + isRtl: boolean; +} + export interface ExportedTimePickerToolbarProps extends ExportedBaseToolbarProps { /** * Override or extend the styles applied to the component. @@ -33,8 +39,8 @@ export interface ExportedTimePickerToolbarProps extends ExportedBaseToolbarProps classes?: Partial<TimePickerToolbarClasses>; } -const useUtilityClasses = (ownerState: TimePickerToolbarProps<any> & { theme: Theme }) => { - const { theme, isLandscape, classes } = ownerState; +const useUtilityClasses = (ownerState: TimePickerToolbarOwnerState<any>) => { + const { isLandscape, classes, isRtl } = ownerState; const slots = { root: ['root'], @@ -42,7 +48,7 @@ const useUtilityClasses = (ownerState: TimePickerToolbarProps<any> & { theme: Th hourMinuteLabel: [ 'hourMinuteLabel', isLandscape && 'hourMinuteLabelLandscape', - theme.direction === 'rtl' && 'hourMinuteLabelReverse', + isRtl && 'hourMinuteLabelReverse', ], ampmSelection: ['ampmSelection', isLandscape && 'ampmLandscape'], ampmLabel: ['ampmLabel'], @@ -80,15 +86,18 @@ const TimePickerToolbarHourMinuteLabel = styled('div', { styles.hourMinuteLabel, ], })<{ - ownerState: TimePickerToolbarProps<any>; -}>(({ theme }) => ({ + ownerState: TimePickerToolbarOwnerState<any>; +}>({ display: 'flex', justifyContent: 'flex-end', alignItems: 'flex-end', - ...(theme.direction === 'rtl' && { - flexDirection: 'row-reverse', - }), variants: [ + { + props: { isRtl: true }, + style: { + flexDirection: 'row-reverse', + }, + }, { props: { isLandscape: true }, style: { @@ -96,21 +105,7 @@ const TimePickerToolbarHourMinuteLabel = styled('div', { }, }, ], -})); - -TimePickerToolbarHourMinuteLabel.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - as: PropTypes.elementType, - ownerState: PropTypes.object.isRequired, - sx: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), - PropTypes.func, - PropTypes.object, - ]), -} as any; +}); const TimePickerToolbarAmPmSelection = styled('div', { name: 'MuiTimePickerToolbar', @@ -143,20 +138,6 @@ const TimePickerToolbarAmPmSelection = styled('div', { ], }); -TimePickerToolbarAmPmSelection.propTypes = { - // ----------------------------- Warning -------------------------------- - // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | - // ---------------------------------------------------------------------- - as: PropTypes.elementType, - ownerState: PropTypes.object.isRequired, - sx: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), - PropTypes.func, - PropTypes.object, - ]), -} as any; - /** * Demos: * @@ -185,16 +166,16 @@ function TimePickerToolbar<TDate extends PickerValidDate>(inProps: TimePickerToo } = props; const utils = useUtils<TDate>(); const localeText = useLocaleText<TDate>(); + const isRtl = useRtl(); - const theme = useTheme(); const showAmPmControl = Boolean(ampm && !ampmInClock && views.includes('hours')); const { meridiemMode, handleMeridiemChange } = useMeridiemMode(value, ampm, onChange); const formatHours = (time: TDate) => ampm ? utils.format(time, 'hours12h') : utils.format(time, 'hours24h'); - const ownerState = props; - const classes = useUtilityClasses({ ...ownerState, theme }); + const ownerState: TimePickerToolbarOwnerState<TDate> = { ...props, isRtl }; + const classes = useUtilityClasses(ownerState); const separator = ( <TimePickerToolbarSeparator @@ -281,7 +262,7 @@ function TimePickerToolbar<TDate extends PickerValidDate>(inProps: TimePickerToo TimePickerToolbar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- ampm: PropTypes.bool, ampmInClock: PropTypes.bool, diff --git a/packages/x-date-pickers/src/TimePicker/tests/TimePicker.test.tsx b/packages/x-date-pickers/src/TimePicker/tests/TimePicker.test.tsx index 8d0c8b82e4f3..11a7ba2bd055 100644 --- a/packages/x-date-pickers/src/TimePicker/tests/TimePicker.test.tsx +++ b/packages/x-date-pickers/src/TimePicker/tests/TimePicker.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { TimePicker } from '@mui/x-date-pickers/TimePicker'; -import { screen } from '@mui-internal/test-utils/createRenderer'; +import { screen } from '@mui/internal-test-utils/createRenderer'; import { expect } from 'chai'; import { createPickerRenderer, stubMatchMedia } from 'test/utils/pickers'; import { pickersInputBaseClasses } from '@mui/x-date-pickers/PickersTextField'; diff --git a/packages/x-date-pickers/src/YearCalendar/YearCalendar.tsx b/packages/x-date-pickers/src/YearCalendar/YearCalendar.tsx index 678c512bad34..bc8b74906503 100644 --- a/packages/x-date-pickers/src/YearCalendar/YearCalendar.tsx +++ b/packages/x-date-pickers/src/YearCalendar/YearCalendar.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; -import { useTheme } from '@mui/system'; +import { useRtl } from '@mui/system/RtlProvider'; import { styled, useThemeProps } from '@mui/material/styles'; import { unstable_useForkRef as useForkRef, @@ -127,7 +127,7 @@ export const YearCalendar = React.forwardRef(function YearCalendar<TDate extends }); const now = useNow<TDate>(timezone); - const theme = useTheme(); + const isRtl = useRtl(); const utils = useUtils<TDate>(); const referenceDate = React.useMemo( @@ -232,11 +232,11 @@ export const YearCalendar = React.forwardRef(function YearCalendar<TDate extends event.preventDefault(); break; case 'ArrowLeft': - focusYear(year + (theme.direction === 'ltr' ? -1 : 1)); + focusYear(year + (isRtl ? 1 : -1)); event.preventDefault(); break; case 'ArrowRight': - focusYear(year + (theme.direction === 'ltr' ? 1 : -1)); + focusYear(year + (isRtl ? -1 : 1)); event.preventDefault(); break; default: @@ -322,7 +322,7 @@ export const YearCalendar = React.forwardRef(function YearCalendar<TDate extends YearCalendar.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- autoFocus: PropTypes.bool, /** diff --git a/packages/x-date-pickers/src/YearCalendar/tests/YearCalendar.test.tsx b/packages/x-date-pickers/src/YearCalendar/tests/YearCalendar.test.tsx index c32b41edee98..1bb8602b313c 100644 --- a/packages/x-date-pickers/src/YearCalendar/tests/YearCalendar.test.tsx +++ b/packages/x-date-pickers/src/YearCalendar/tests/YearCalendar.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { spy } from 'sinon'; import { expect } from 'chai'; -import { act, fireEvent, screen } from '@mui-internal/test-utils'; +import { act, fireEvent, screen } from '@mui/internal-test-utils'; import { YearCalendar } from '@mui/x-date-pickers/YearCalendar'; import { createPickerRenderer, adapterToUse } from 'test/utils/pickers'; diff --git a/packages/x-date-pickers/src/YearCalendar/tests/describes.YearCalendar.test.tsx b/packages/x-date-pickers/src/YearCalendar/tests/describes.YearCalendar.test.tsx index fb032baa4ed0..c93548b4ec59 100644 --- a/packages/x-date-pickers/src/YearCalendar/tests/describes.YearCalendar.test.tsx +++ b/packages/x-date-pickers/src/YearCalendar/tests/describes.YearCalendar.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { userEvent, screen } from '@mui-internal/test-utils'; +import { userEvent, screen } from '@mui/internal-test-utils'; import { YearCalendar, yearCalendarClasses as classes } from '@mui/x-date-pickers/YearCalendar'; import { wrapPickerMount, diff --git a/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.tsx b/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.tsx index 6ade141f2f38..617a71eea6fd 100644 --- a/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.tsx +++ b/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import clsx from 'clsx'; import Typography from '@mui/material/Typography'; -import { useTheme, styled, useThemeProps } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; +import { styled, useThemeProps } from '@mui/material/styles'; import { unstable_composeClasses as composeClasses } from '@mui/utils'; import { useSlotProps } from '@mui/base/utils'; import IconButton from '@mui/material/IconButton'; @@ -62,9 +63,7 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch inProps: PickersArrowSwitcherProps, ref: React.Ref<HTMLDivElement>, ) { - const theme = useTheme(); - const isRTL = theme.direction === 'rtl'; - + const isRtl = useRtl(); const props = useThemeProps({ props: inProps, name: 'MuiPickersArrowSwitcher' }); const { @@ -163,7 +162,7 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch {...other} > <PreviousIconButton {...previousIconButtonProps}> - {isRTL ? ( + {isRtl ? ( <RightArrowIcon {...rightArrowIconProps} /> ) : ( <LeftArrowIcon {...leftArrowIconProps} /> @@ -177,7 +176,7 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch <PickersArrowSwitcherSpacer className={classes.spacer} ownerState={ownerState} /> )} <NextIconButton {...nextIconButtonProps}> - {isRTL ? ( + {isRtl ? ( <LeftArrowIcon {...leftArrowIconProps} /> ) : ( <RightArrowIcon {...rightArrowIconProps} /> diff --git a/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx b/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx index f49ced45e02c..17b44028ca76 100644 --- a/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx +++ b/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx @@ -38,30 +38,32 @@ const PickersToolbarButtonRoot = styled(Button, { textTransform: 'none', }); -export const PickersToolbarButton: React.FunctionComponent<PickersToolbarButtonProps> = - React.forwardRef(function PickersToolbarButton(inProps, ref) { - const props = useThemeProps({ props: inProps, name: 'MuiPickersToolbarButton' }); - const { align, className, selected, typographyClassName, value, variant, width, ...other } = - props; +export const PickersToolbarButton = React.forwardRef(function PickersToolbarButton( + inProps: PickersToolbarButtonProps, + ref: React.Ref<HTMLButtonElement>, +) { + const props = useThemeProps({ props: inProps, name: 'MuiPickersToolbarButton' }); + const { align, className, selected, typographyClassName, value, variant, width, ...other } = + props; - const classes = useUtilityClasses(props); + const classes = useUtilityClasses(props); - return ( - <PickersToolbarButtonRoot - data-mui-test="toolbar-button" - variant="text" - ref={ref} - className={clsx(className, classes.root)} - {...(width ? { sx: { width } } : {})} - {...other} - > - <PickersToolbarText - align={align} - className={typographyClassName} - variant={variant} - value={value} - selected={selected} - /> - </PickersToolbarButtonRoot> - ); - }); + return ( + <PickersToolbarButtonRoot + data-mui-test="toolbar-button" + variant="text" + ref={ref} + className={clsx(className, classes.root)} + {...(width ? { sx: { width } } : {})} + {...other} + > + <PickersToolbarText + align={align} + className={typographyClassName} + variant={variant} + value={value} + selected={selected} + /> + </PickersToolbarButtonRoot> + ); +}); diff --git a/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.tsx b/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.tsx index e2b70dd1421b..3f54c063f181 100644 --- a/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.tsx +++ b/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.tsx @@ -159,13 +159,15 @@ export const useDesktopPicker = < fieldProps.InputProps = { ...fieldProps.InputProps, ref: containerRef, - [`${inputAdornmentProps.position}Adornment`]: ( - <InputAdornment {...inputAdornmentProps}> - <OpenPickerButton {...openPickerButtonProps}> - <OpenPickerIcon {...innerSlotProps?.openPickerIcon} /> - </OpenPickerButton> - </InputAdornment> - ), + ...(!props.disableOpenPicker && { + [`${inputAdornmentProps.position}Adornment`]: ( + <InputAdornment {...inputAdornmentProps}> + <OpenPickerButton {...openPickerButtonProps}> + <OpenPickerIcon {...innerSlotProps?.openPickerIcon} /> + </OpenPickerButton> + </InputAdornment> + ), + }), } as typeof fieldProps.InputProps; } diff --git a/packages/x-date-pickers/src/internals/hooks/useField/buildSectionsFromFormat.ts b/packages/x-date-pickers/src/internals/hooks/useField/buildSectionsFromFormat.ts index 63e05d31e776..40cf9cdb88dd 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/buildSectionsFromFormat.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/buildSectionsFromFormat.ts @@ -12,7 +12,7 @@ interface BuildSectionsFromFormatParams<TDate extends PickerValidDate> { utils: MuiPickersAdapter<TDate>; format: string; formatDensity: 'dense' | 'spacious'; - isRTL: boolean; + isRtl: boolean; timezone: PickersTimezone; shouldRespectLeadingZeros: boolean; localeText: PickersLocaleText<TDate>; @@ -278,7 +278,7 @@ const buildSections = <TDate extends PickerValidDate>( }; const postProcessSections = <TDate extends PickerValidDate>({ - isRTL, + isRtl, formatDensity, sections, }: BuildSectionsFromFormatParams<TDate> & { @@ -287,7 +287,7 @@ const postProcessSections = <TDate extends PickerValidDate>({ return sections.map((section) => { const cleanSeparator = (separator: string) => { let cleanedSeparator = separator; - if (isRTL && cleanedSeparator !== null && cleanedSeparator.includes(' ')) { + if (isRtl && cleanedSeparator !== null && cleanedSeparator.includes(' ')) { cleanedSeparator = `\u2069${cleanedSeparator}\u2066`; } @@ -309,7 +309,7 @@ export const buildSectionsFromFormat = <TDate extends PickerValidDate>( params: BuildSectionsFromFormatParams<TDate>, ) => { let expandedFormat = expandFormat(params); - if (params.isRTL && params.enableAccessibleFieldDOMStructure) { + if (params.isRtl && params.enableAccessibleFieldDOMStructure) { expandedFormat = expandedFormat.split(' ').reverse().join(' '); } diff --git a/packages/x-date-pickers/src/internals/hooks/useField/useField.ts b/packages/x-date-pickers/src/internals/hooks/useField/useField.ts index cad6083d523d..330222121083 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useField.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useField.ts @@ -1,7 +1,7 @@ import * as React from 'react'; import useEnhancedEffect from '@mui/utils/useEnhancedEffect'; import useEventCallback from '@mui/utils/useEventCallback'; -import { useTheme } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; import { useValidation } from '../useValidation'; import { useUtils } from '../useUtils'; import { @@ -64,8 +64,7 @@ export const useField = < validator, } = params; - const theme = useTheme(); - const isRTL = theme.direction === 'rtl'; + const isRtl = useRtl(); const stateResponse = useFieldState(params); const { @@ -104,8 +103,8 @@ export const useField = < ) as UseFieldTextField<TEnableAccessibleFieldDOMStructure>; const sectionOrder = React.useMemo( - () => getSectionOrder(state.sections, isRTL && !enableAccessibleFieldDOMStructure), - [state.sections, isRTL, enableAccessibleFieldDOMStructure], + () => getSectionOrder(state.sections, isRtl && !enableAccessibleFieldDOMStructure), + [state.sections, isRtl, enableAccessibleFieldDOMStructure], ); const { returnedValue, interactions } = useFieldTextField({ diff --git a/packages/x-date-pickers/src/internals/hooks/useField/useField.types.ts b/packages/x-date-pickers/src/internals/hooks/useField/useField.types.ts index 3b05171787ce..df0915e71b7f 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useField.types.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useField.types.ts @@ -309,13 +309,13 @@ export interface FieldValueManager< * @template TSection * @param {TSection[]} sections The current section list. * @param {string} localizedDigits The conversion table from localized to 0-9 digits. - * @param {boolean} isRTL `true` if the current orientation is "right to left" + * @param {boolean} isRtl `true` if the current orientation is "right to left" * @returns {string} The string value to render in the input. */ getV6InputValueFromSections: ( sections: TSection[], localizedDigits: string[], - isRTL: boolean, + isRtl: boolean, ) => string; /** * Creates the string value to render in the input based on the current section list. diff --git a/packages/x-date-pickers/src/internals/hooks/useField/useField.utils.ts b/packages/x-date-pickers/src/internals/hooks/useField/useField.utils.ts index c12ffc2c1ab8..34b84f4fa72d 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useField.utils.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useField.utils.ts @@ -322,9 +322,10 @@ export const adjustSectionValue = <TDate extends PickerValidDate, TSection exten } const currentOptionIndex = options.indexOf(section.value); - const newOptionIndex = (currentOptionIndex + options.length + delta) % options.length; + const newOptionIndex = (currentOptionIndex + delta) % options.length; + const clampedIndex = (newOptionIndex + options.length) % options.length; - return options[newOptionIndex]; + return options[clampedIndex]; }; if (section.contentType === 'digit' || section.contentType === 'digit-with-letter') { @@ -494,12 +495,12 @@ export const createDateStrForV7HiddenInputFromSections = (sections: FieldSection export const createDateStrForV6InputFromSections = ( sections: FieldSection[], localizedDigits: string[], - isRTL: boolean, + isRtl: boolean, ) => { const formattedSections = sections.map((section) => { const dateValue = getSectionVisibleValue( section, - isRTL ? 'input-rtl' : 'input-ltr', + isRtl ? 'input-rtl' : 'input-ltr', localizedDigits, ); @@ -508,7 +509,7 @@ export const createDateStrForV6InputFromSections = ( const dateStr = formattedSections.join(''); - if (!isRTL) { + if (!isRtl) { return dateStr; } diff --git a/packages/x-date-pickers/src/internals/hooks/useField/useFieldState.ts b/packages/x-date-pickers/src/internals/hooks/useField/useFieldState.ts index 3ac32f3912ef..c6fadb4b23d2 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useFieldState.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useFieldState.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import useControlled from '@mui/utils/useControlled'; -import { useTheme } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; import { useUtils, useLocaleText, useLocalizationContext } from '../useUtils'; import { UseFieldInternalProps, @@ -88,8 +88,7 @@ export const useFieldState = < const utils = useUtils<TDate>(); const localeText = useLocaleText<TDate>(); const adapter = useLocalizationContext<TDate>(); - const theme = useTheme(); - const isRTL = theme.direction === 'rtl'; + const isRtl = useRtl(); const { valueManager, @@ -144,7 +143,7 @@ export const useFieldState = < formatDensity, shouldRespectLeadingZeros, enableAccessibleFieldDOMStructure, - isRTL, + isRtl, }), ), [ @@ -152,7 +151,7 @@ export const useFieldState = < format, localeText, localizedDigits, - isRTL, + isRtl, shouldRespectLeadingZeros, utils, formatDensity, @@ -293,7 +292,7 @@ export const useFieldState = < formatDensity, shouldRespectLeadingZeros, enableAccessibleFieldDOMStructure, - isRTL, + isRtl, }); return mergeDateIntoReferenceDate(utils, timezone, date, sections, referenceDate, false); }; @@ -385,7 +384,7 @@ export const useFieldState = < ...prevState, sections, })); - }, [format, utils.locale, isRTL]); // eslint-disable-line react-hooks/exhaustive-deps + }, [format, utils.locale, isRtl]); // eslint-disable-line react-hooks/exhaustive-deps React.useEffect(() => { let shouldUpdate: boolean; diff --git a/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts b/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts index 35da5981c702..f382ec975758 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useTheme } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; import useEventCallback from '@mui/utils/useEventCallback'; import useForkRef from '@mui/utils/useForkRef'; import { UseFieldTextFieldInteractions, UseFieldTextField } from './useField.types'; @@ -33,17 +33,17 @@ const cleanString = (dirtyString: string) => dirtyString.replace(/[\u2066\u2067\ export const addPositionPropertiesToSections = <TSection extends FieldSection>( sections: TSection[], localizedDigits: string[], - isRTL: boolean, + isRtl: boolean, ): FieldSectionWithPositions<TSection>[] => { let position = 0; - let positionInInput = isRTL ? 1 : 0; + let positionInInput = isRtl ? 1 : 0; const newSections: FieldSectionWithPositions<TSection>[] = []; for (let i = 0; i < sections.length; i += 1) { const section = sections[i]; const renderedValue = getSectionVisibleValue( section, - isRTL ? 'input-rtl' : 'input-ltr', + isRtl ? 'input-rtl' : 'input-ltr', localizedDigits, ); const sectionStr = `${section.startSeparator}${renderedValue}${section.endSeparator}`; @@ -75,8 +75,7 @@ export const addPositionPropertiesToSections = <TSection extends FieldSection>( }; export const useFieldV6TextField: UseFieldTextField<false> = (params) => { - const theme = useTheme(); - const isRTL = theme.direction === 'rtl'; + const isRtl = useRtl(); const focusTimeoutRef = React.useRef<ReturnType<typeof setTimeout>>(); const { @@ -111,8 +110,8 @@ export const useFieldV6TextField: UseFieldTextField<false> = (params) => { const handleRef = useForkRef(inputRefProp, inputRef); const sections = React.useMemo( - () => addPositionPropertiesToSections(state.sections, localizedDigits, isRTL), - [state.sections, localizedDigits, isRTL], + () => addPositionPropertiesToSections(state.sections, localizedDigits, isRtl), + [state.sections, localizedDigits, isRtl], ); const interactions = React.useMemo<UseFieldTextFieldInteractions>( @@ -333,7 +332,7 @@ export const useFieldV6TextField: UseFieldTextField<false> = (params) => { keyPressed = cleanValueStr; } else { const prevValueStr = cleanString( - fieldValueManager.getV6InputValueFromSections(sections, localizedDigits, isRTL), + fieldValueManager.getV6InputValueFromSections(sections, localizedDigits, isRtl), ); let startOfDiffIndex = -1; @@ -397,7 +396,7 @@ export const useFieldV6TextField: UseFieldTextField<false> = (params) => { return fieldValueManager.getV6InputValueFromSections( getSectionsFromValue(valueManager.emptyValue), localizedDigits, - isRTL, + isRtl, ); }, [ inPlaceholder, @@ -405,14 +404,14 @@ export const useFieldV6TextField: UseFieldTextField<false> = (params) => { getSectionsFromValue, valueManager.emptyValue, localizedDigits, - isRTL, + isRtl, ]); const valueStr = React.useMemo( () => state.tempValueStrAndroid ?? - fieldValueManager.getV6InputValueFromSections(state.sections, localizedDigits, isRTL), - [state.sections, fieldValueManager, state.tempValueStrAndroid, localizedDigits, isRTL], + fieldValueManager.getV6InputValueFromSections(state.sections, localizedDigits, isRtl), + [state.sections, fieldValueManager, state.tempValueStrAndroid, localizedDigits, isRtl], ); React.useEffect(() => { diff --git a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerLayoutProps.ts b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerLayoutProps.ts index db3a329d9e8f..f4084f8b3222 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerLayoutProps.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerLayoutProps.ts @@ -1,3 +1,4 @@ +import { useRtl } from '@mui/system/RtlProvider'; import { useIsLandscape } from '../useIsLandscape'; import { UsePickerValueLayoutResponse } from './usePickerValue.types'; import { UsePickerViewsLayoutResponse } from './usePickerViews'; @@ -23,6 +24,7 @@ export interface UsePickerLayoutPropsResponseLayoutProps< UsePickerViewsLayoutResponse<TView>, UsePickerLayoutProps { isLandscape: boolean; + isRtl: boolean; wrapperVariant: WrapperVariant; isValid: (value: TValue) => boolean; } @@ -49,11 +51,13 @@ export const usePickerLayoutProps = <TValue, TView extends DateOrTimeViewWithMer }: UsePickerLayoutPropsParams<TValue, TView>): UsePickerLayoutPropsResponse<TValue, TView> => { const { orientation } = props; const isLandscape = useIsLandscape(propsFromPickerViews.views, orientation); + const isRtl = useRtl(); const layoutProps: UsePickerLayoutPropsResponseLayoutProps<TValue, TView> = { ...propsFromPickerViews, ...propsFromPickerValue, isLandscape, + isRtl, wrapperVariant, disabled: props.disabled, readOnly: props.readOnly, diff --git a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerViews.ts b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerViews.ts index 47ff02853868..4ed9a1a87277 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerViews.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerViews.ts @@ -99,8 +99,7 @@ export interface UsePickerViewsProps< TView extends DateOrTimeViewWithMeridiem, TExternalProps extends UsePickerViewsProps<TValue, TDate, TView, any, any>, TAdditionalProps extends {}, -> extends UsePickerViewsBaseProps<TValue, TDate, TView, TExternalProps, TAdditionalProps>, - UsePickerViewsNonStaticProps { +> extends UsePickerViewsBaseProps<TValue, TDate, TView, TExternalProps, TAdditionalProps> { className?: string; sx?: SxProps<Theme>; } @@ -141,8 +140,7 @@ export interface UsePickerViewParams< export interface UsePickerViewsResponse<TView extends DateOrTimeViewWithMeridiem> { /** - * Does the picker have at least one view that should be rendered in UI mode ? - * If not, we can hide the icon to open the picker. + * Indicates if the the picker has at least one view that should be rendered in UI. */ hasUIView: boolean; renderCurrentView: () => React.ReactNode; @@ -185,7 +183,7 @@ export const usePickerViews = < TAdditionalProps >): UsePickerViewsResponse<TView> => { const { onChange, open, onClose } = propsFromPickerValue; - const { views, openTo, onViewChange, disableOpenPicker, viewRenderers, timezone } = props; + const { views, openTo, onViewChange, viewRenderers, timezone } = props; const { className, sx, ...propsToForwardToView } = props; const { view, setView, defaultView, focusedView, setFocusedView, setValueAndGoToNextView } = @@ -203,9 +201,7 @@ export const usePickerViews = < views.reduce( (acc, viewForReduce) => { let viewMode: 'field' | 'UI'; - if (disableOpenPicker) { - viewMode = 'field'; - } else if (viewRenderers[viewForReduce] != null) { + if (viewRenderers[viewForReduce] != null) { viewMode = 'UI'; } else { viewMode = 'field'; @@ -220,7 +216,7 @@ export const usePickerViews = < }, { hasUIView: false, viewModeLookup: {} as Record<TView, 'field' | 'UI'> }, ), - [disableOpenPicker, viewRenderers, views], + [viewRenderers, views], ); const timeViewsCount = React.useMemo( diff --git a/packages/x-date-pickers/src/locales/fiFI.ts b/packages/x-date-pickers/src/locales/fiFI.ts index 7f0ebc0ac98d..905fa4f31ffb 100644 --- a/packages/x-date-pickers/src/locales/fiFI.ts +++ b/packages/x-date-pickers/src/locales/fiFI.ts @@ -25,10 +25,10 @@ const fiFIPickers: Partial<PickersLocaleText<any>> = { // DateRange labels start: 'Alku', end: 'Loppu', - // startDate: 'Start date', - // startTime: 'Start time', - // endDate: 'End date', - // endTime: 'End time', + startDate: 'Alkamispäivämäärä', + startTime: 'Alkamisaika', + endDate: 'Päättymispäivämäärä', + endTime: 'Päättymisaika', // Action bar cancelButtonLabel: 'Peruuta', @@ -47,7 +47,7 @@ const fiFIPickers: Partial<PickersLocaleText<any>> = { `Valitse ${views[view]}. ${time === null ? 'Ei aikaa valittuna' : `Valittu aika on ${adapter.format(time, 'fullTime')}`}`, hoursClockNumberText: (hours) => `${hours} tuntia`, minutesClockNumberText: (minutes) => `${minutes} minuuttia`, - secondsClockNumberText: (seconds) => `${seconds} sekunttia`, + secondsClockNumberText: (seconds) => `${seconds} sekuntia`, // Digital clock labels selectViewText: (view) => `Valitse ${views[view]}`, @@ -67,7 +67,7 @@ const fiFIPickers: Partial<PickersLocaleText<any>> = { value !== null && utils.isValid(value) ? `Valitse aika, valittu aika on ${utils.format(value, 'fullTime')}` : 'Valitse aika', - // fieldClearLabel: 'Clear value', + fieldClearLabel: 'Tyhjennä arvo', // Table labels timeTableLabel: 'valitse aika', @@ -84,17 +84,17 @@ const fiFIPickers: Partial<PickersLocaleText<any>> = { fieldMeridiemPlaceholder: () => 'aa', // View names - // year: 'Year', - // month: 'Month', - // day: 'Day', - // weekDay: 'Week day', - // hours: 'Hours', - // minutes: 'Minutes', - // seconds: 'Seconds', - // meridiem: 'Meridiem', + year: 'Vuosi', + month: 'Kuukausi', + day: 'Päivä', + weekDay: 'Viikonpäivä', + hours: 'Tunnit', + minutes: 'Minuutit', + seconds: 'Sekunnit', + meridiem: 'Iltapäivä', // Common - // empty: 'Empty', + empty: 'Tyhjä', }; export const fiFI = getPickersLocalization(fiFIPickers); diff --git a/packages/x-date-pickers/src/models/adapters.ts b/packages/x-date-pickers/src/models/adapters.ts index 68891ae41b0b..17c58ab20d99 100644 --- a/packages/x-date-pickers/src/models/adapters.ts +++ b/packages/x-date-pickers/src/models/adapters.ts @@ -155,7 +155,7 @@ export type AdapterOptions<TLocale, TInstance> = { locale?: TLocale; } & PropertyIfNotNever<'instance', TInstance>; -export type DateBuilderReturnType<T extends string | null | undefined, TDate> = T extends null +export type DateBuilderReturnType<T extends string | null | undefined, TDate> = [T] extends [null] ? null : TDate; diff --git a/packages/x-date-pickers/src/tests/fieldKeyboardInteraction.test.tsx b/packages/x-date-pickers/src/tests/fieldKeyboardInteraction.test.tsx index f331678eb674..f9a7fc614478 100644 --- a/packages/x-date-pickers/src/tests/fieldKeyboardInteraction.test.tsx +++ b/packages/x-date-pickers/src/tests/fieldKeyboardInteraction.test.tsx @@ -1,7 +1,7 @@ import { expect } from 'chai'; import moment from 'moment/moment'; import jMoment from 'moment-jalaali'; -import { fireEvent } from '@mui-internal/test-utils'; +import { fireEvent } from '@mui/internal-test-utils'; import { buildFieldInteractions, getCleanedSelectedContent, diff --git a/packages/x-date-pickers/tsconfig.json b/packages/x-date-pickers/tsconfig.json index f6f102e58683..679bf256599a 100644 --- a/packages/x-date-pickers/tsconfig.json +++ b/packages/x-date-pickers/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["@mui/material/themeCssVarsAugmentation"], + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha" + ], "noImplicitAny": false }, "include": ["src/**/*", "../../test/utils/addChaiAssertions.ts"] diff --git a/packages/x-license/package.json b/packages/x-license/package.json index 09e946423cd3..3f787148c120 100644 --- a/packages/x-license/package.json +++ b/packages/x-license/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-license", - "version": "7.2.0", + "version": "7.6.1", "description": "MUI X License verification", "author": "MUI Team", "main": "src/index.ts", @@ -34,14 +34,15 @@ "directory": "packages/x-license" }, "dependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@mui/utils": "^5.15.14" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0" }, "devDependencies": { - "rimraf": "^5.0.5" + "@mui/internal-test-utils": "1.0.0", + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.test.tsx b/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.test.tsx index 9d576314bd10..ece7b7567f65 100644 --- a/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.test.tsx +++ b/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { createRenderer, screen } from '@mui-internal/test-utils'; +import { createRenderer, screen } from '@mui/internal-test-utils'; import { useLicenseVerifier, LicenseInfo, diff --git a/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.ts b/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.ts index 8f69e15efa0a..84151d4acc32 100644 --- a/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.ts +++ b/packages/x-license/src/useLicenseVerifier/useLicenseVerifier.ts @@ -17,7 +17,8 @@ export type MuiCommercialPackageName = | 'x-data-grid-pro' | 'x-data-grid-premium' | 'x-date-pickers-pro' - | 'x-tree-view-pro'; + | 'x-tree-view-pro' + | 'x-charts-pro'; export const sharedLicenseStatuses: { [packageName in MuiCommercialPackageName]?: { diff --git a/packages/x-license/tsconfig.json b/packages/x-license/tsconfig.json index 52d43eaaa9b9..f2c43c4db2af 100644 --- a/packages/x-license/tsconfig.json +++ b/packages/x-license/tsconfig.json @@ -1,4 +1,7 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["@mui/internal-test-utils/initMatchers", "chai-dom", "mocha", "node"] + }, "include": ["src/**/*"] } diff --git a/packages/x-tree-view-pro/package.json b/packages/x-tree-view-pro/package.json index 09f9cffaf2f4..0852af6d233e 100644 --- a/packages/x-tree-view-pro/package.json +++ b/packages/x-tree-view-pro/package.json @@ -43,9 +43,9 @@ "directory": "packages/x-tree-view-pro" }, "dependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.14", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@mui/x-license": "workspace:*", "@mui/x-tree-view": "workspace:*", @@ -62,7 +62,8 @@ "react-dom": "^17.0.0 || ^18.0.0" }, "devDependencies": { - "rimraf": "^5.0.5" + "@mui/internal-test-utils": "1.0.0", + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.test.tsx b/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.test.tsx index 5957bddb6c87..b7cd60d885da 100644 --- a/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.test.tsx +++ b/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { RichTreeViewPro, richTreeViewProClasses as classes, diff --git a/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.tsx b/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.tsx index c2699d8d82c2..4294bc362a34 100644 --- a/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.tsx +++ b/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.tsx @@ -1,5 +1,4 @@ import * as React from 'react'; -import { styled, useThemeProps } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; import { useLicenseVerifier, Watermark } from '@mui/x-license'; import { useSlotProps } from '@mui/base/utils'; @@ -10,15 +9,21 @@ import { buildWarning, extractPluginParamsFromProps, } from '@mui/x-tree-view/internals'; +import { styled, createUseThemeProps } from '../internals/zero-styled'; import { getRichTreeViewProUtilityClass } from './richTreeViewProClasses'; import { RichTreeViewProProps, RichTreeViewProSlotProps, RichTreeViewProSlots, } from './RichTreeViewPro.types'; -import { DEFAULT_TREE_VIEW_PRO_PLUGINS } from '../internals/plugins'; +import { + DEFAULT_TREE_VIEW_PRO_PLUGINS, + DefaultTreeViewProPluginSignatures, +} from '../internals/plugins'; import { getReleaseInfo } from '../internals/utils/releaseInfo'; +const useThemeProps = createUseThemeProps('MuiRichTreeViewPro'); + const useUtilityClasses = <R extends {}, Multiple extends boolean | undefined>( ownerState: RichTreeViewProProps<R, Multiple>, ) => { @@ -100,7 +105,7 @@ const RichTreeViewPro = React.forwardRef(function RichTreeViewPro< } const { pluginParams, slots, slotProps, otherProps } = extractPluginParamsFromProps< - typeof DEFAULT_TREE_VIEW_PRO_PLUGINS, + DefaultTreeViewProPluginSignatures, RichTreeViewProSlots, RichTreeViewProSlotProps<R, Multiple>, RichTreeViewProProps<R, Multiple> diff --git a/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.types.ts b/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.types.ts index 5921da69be73..c0df5ad46263 100644 --- a/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.types.ts +++ b/packages/x-tree-view-pro/src/RichTreeViewPro/RichTreeViewPro.types.ts @@ -5,13 +5,13 @@ import { SlotComponentProps } from '@mui/base/utils'; import { TreeItem, TreeItemProps } from '@mui/x-tree-view/TreeItem'; import { TreeItem2Props } from '@mui/x-tree-view/TreeItem2'; import { TreeViewItemId } from '@mui/x-tree-view/models'; -import { TreeViewPublicAPI } from '@mui/x-tree-view/internals'; +import { TreeViewPublicAPI, TreeViewExperimentalFeatures } from '@mui/x-tree-view/internals'; import { RichTreeViewProClasses } from './richTreeViewProClasses'; import { DefaultTreeViewProPluginParameters, DefaultTreeViewProPluginSlotProps, DefaultTreeViewProPluginSlots, - DefaultTreeViewProPlugins, + DefaultTreeViewProPluginSignatures, } from '../internals/plugins/defaultPlugins'; interface RichTreeViewItemProSlotOwnerState { @@ -39,7 +39,7 @@ export interface RichTreeViewProSlotProps<R extends {}, Multiple extends boolean } export type RichTreeViewProApiRef = React.MutableRefObject< - TreeViewPublicAPI<DefaultTreeViewProPlugins> | undefined + TreeViewPublicAPI<DefaultTreeViewProPluginSignatures> | undefined >; export interface RichTreeViewProPropsBase extends React.HTMLAttributes<HTMLUListElement> { @@ -71,4 +71,10 @@ export interface RichTreeViewProProps<R extends {}, Multiple extends boolean | u * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`. */ apiRef?: RichTreeViewProApiRef; + /** + * Unstable features, breaking changes might be introduced. + * For each feature, if the flag is not explicitly set to `true`, + * the feature will be fully disabled and any property / method call will not have any effect. + */ + experimentalFeatures?: TreeViewExperimentalFeatures<DefaultTreeViewProPluginSignatures>; } diff --git a/packages/x-tree-view-pro/src/internals/plugins/defaultPlugins.ts b/packages/x-tree-view-pro/src/internals/plugins/defaultPlugins.ts index 8f12846c5043..d720b6087266 100644 --- a/packages/x-tree-view-pro/src/internals/plugins/defaultPlugins.ts +++ b/packages/x-tree-view-pro/src/internals/plugins/defaultPlugins.ts @@ -13,7 +13,7 @@ import { useTreeViewIcons, UseTreeViewIconsParameters, ConvertPluginsIntoSignatures, - MergePluginsProperty, + MergeSignaturesProperty, } from '@mui/x-tree-view/internals'; export const DEFAULT_TREE_VIEW_PRO_PLUGINS = [ @@ -26,17 +26,17 @@ export const DEFAULT_TREE_VIEW_PRO_PLUGINS = [ useTreeViewIcons, ] as const; -export type DefaultTreeViewProPlugins = ConvertPluginsIntoSignatures< +export type DefaultTreeViewProPluginSignatures = ConvertPluginsIntoSignatures< typeof DEFAULT_TREE_VIEW_PRO_PLUGINS >; -export type DefaultTreeViewProPluginSlots = MergePluginsProperty< - DefaultTreeViewProPlugins, +export type DefaultTreeViewProPluginSlots = MergeSignaturesProperty< + DefaultTreeViewProPluginSignatures, 'slots' >; -export type DefaultTreeViewProPluginSlotProps = MergePluginsProperty< - DefaultTreeViewProPlugins, +export type DefaultTreeViewProPluginSlotProps = MergeSignaturesProperty< + DefaultTreeViewProPluginSignatures, 'slotProps' >; diff --git a/packages/x-tree-view-pro/src/internals/plugins/index.ts b/packages/x-tree-view-pro/src/internals/plugins/index.ts index 43574e246824..96523fc22814 100644 --- a/packages/x-tree-view-pro/src/internals/plugins/index.ts +++ b/packages/x-tree-view-pro/src/internals/plugins/index.ts @@ -1,2 +1,2 @@ export { DEFAULT_TREE_VIEW_PRO_PLUGINS } from './defaultPlugins'; -export type { DefaultTreeViewProPlugins } from './defaultPlugins'; +export type { DefaultTreeViewProPluginSignatures } from './defaultPlugins'; diff --git a/packages/x-tree-view-pro/src/internals/zero-styled/index.ts b/packages/x-tree-view-pro/src/internals/zero-styled/index.ts new file mode 100644 index 000000000000..ac070a82614d --- /dev/null +++ b/packages/x-tree-view-pro/src/internals/zero-styled/index.ts @@ -0,0 +1,8 @@ +import { useThemeProps } from '@mui/material/styles'; + +export { styled } from '@mui/material/styles'; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function createUseThemeProps(name: string) { + return useThemeProps; +} diff --git a/packages/x-tree-view-pro/tsconfig.json b/packages/x-tree-view-pro/tsconfig.json index 0c69aefe6800..8f928a498c68 100644 --- a/packages/x-tree-view-pro/tsconfig.json +++ b/packages/x-tree-view-pro/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["@mui/material/themeCssVarsAugmentation"], + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha" + ], "noImplicitAny": false }, "include": ["src/**/*"] diff --git a/packages/x-tree-view/package.json b/packages/x-tree-view/package.json index 6b78df7746a7..500595266785 100644 --- a/packages/x-tree-view/package.json +++ b/packages/x-tree-view/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-tree-view", - "version": "7.5.0", + "version": "7.6.2", "description": "The community edition of the Tree View components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -43,9 +43,9 @@ "directory": "packages/x-tree-view" }, "dependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@mui/base": "^5.0.0-beta.40", - "@mui/system": "^5.15.14", + "@mui/system": "^5.15.15", "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.1", @@ -60,8 +60,9 @@ "react-dom": "^17.0.0 || ^18.0.0" }, "devDependencies": { + "@mui/internal-test-utils": "1.0.0", "@types/prop-types": "^15.7.12", - "rimraf": "^5.0.5" + "rimraf": "^5.0.7" }, "engines": { "node": ">=14.0.0" diff --git a/packages/x-tree-view/src/RichTreeView/RichTreeView.test.tsx b/packages/x-tree-view/src/RichTreeView/RichTreeView.test.tsx index aac101dd6902..2c1b69bc8c35 100644 --- a/packages/x-tree-view/src/RichTreeView/RichTreeView.test.tsx +++ b/packages/x-tree-view/src/RichTreeView/RichTreeView.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { RichTreeView, richTreeViewClasses as classes } from '@mui/x-tree-view/RichTreeView'; import { describeConformance } from 'test/utils/describeConformance'; diff --git a/packages/x-tree-view/src/RichTreeView/RichTreeView.tsx b/packages/x-tree-view/src/RichTreeView/RichTreeView.tsx index 3e46711dd63e..53f7f2257588 100644 --- a/packages/x-tree-view/src/RichTreeView/RichTreeView.tsx +++ b/packages/x-tree-view/src/RichTreeView/RichTreeView.tsx @@ -1,17 +1,19 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { styled, useThemeProps } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; import { useSlotProps } from '@mui/base/utils'; import { getRichTreeViewUtilityClass } from './richTreeViewClasses'; import { RichTreeViewProps, RichTreeViewSlotProps, RichTreeViewSlots } from './RichTreeView.types'; +import { styled, createUseThemeProps } from '../internals/zero-styled'; import { useTreeView } from '../internals/useTreeView'; import { TreeViewProvider } from '../internals/TreeViewProvider'; -import { DEFAULT_TREE_VIEW_PLUGINS } from '../internals/plugins'; +import { DEFAULT_TREE_VIEW_PLUGINS, DefaultTreeViewPluginSignatures } from '../internals/plugins'; import { TreeItem, TreeItemProps } from '../TreeItem'; import { buildWarning } from '../internals/utils/warning'; import { extractPluginParamsFromProps } from '../internals/utils/extractPluginParamsFromProps'; +const useThemeProps = createUseThemeProps('MuiRichTreeView'); + const useUtilityClasses = <R extends {}, Multiple extends boolean | undefined>( ownerState: RichTreeViewProps<R, Multiple>, ) => { @@ -89,7 +91,7 @@ const RichTreeView = React.forwardRef(function RichTreeView< } const { pluginParams, slots, slotProps, otherProps } = extractPluginParamsFromProps< - typeof DEFAULT_TREE_VIEW_PLUGINS, + DefaultTreeViewPluginSignatures, RichTreeViewSlots, RichTreeViewSlotProps<R, Multiple>, RichTreeViewProps<R, Multiple> @@ -145,7 +147,7 @@ const RichTreeView = React.forwardRef(function RichTreeView< RichTreeView.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`. @@ -194,6 +196,14 @@ RichTreeView.propTypes = { * Used when the item's expansion is controlled. */ expandedItems: PropTypes.arrayOf(PropTypes.string), + /** + * Unstable features, breaking changes might be introduced. + * For each feature, if the flag is not explicitly set to `true`, + * the feature will be fully disabled and any property / method call will not have any effect. + */ + experimentalFeatures: PropTypes.shape({ + indentationAtItemLevel: PropTypes.bool, + }), /** * Used to determine the id of a given item. * @@ -224,6 +234,12 @@ RichTreeView.propTypes = { * @returns {boolean} `true` if the item should be disabled. */ isItemDisabled: PropTypes.func, + /** + * Horizontal indentation between an item and its children. + * Examples: 24, "24px", "2rem", "2em". + * @default 12px + */ + itemChildrenIndentation: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), items: PropTypes.array.isRequired, /** * If `true`, `ctrl` and `shift` will trigger multiselect. diff --git a/packages/x-tree-view/src/RichTreeView/RichTreeView.types.ts b/packages/x-tree-view/src/RichTreeView/RichTreeView.types.ts index a2ffd144c2f8..9b71ae3c7a57 100644 --- a/packages/x-tree-view/src/RichTreeView/RichTreeView.types.ts +++ b/packages/x-tree-view/src/RichTreeView/RichTreeView.types.ts @@ -7,12 +7,16 @@ import { DefaultTreeViewPluginParameters, DefaultTreeViewPluginSlotProps, DefaultTreeViewPluginSlots, - DefaultTreeViewPlugins, + DefaultTreeViewPluginSignatures, } from '../internals/plugins/defaultPlugins'; import { TreeItemProps } from '../TreeItem'; import { TreeItem2Props } from '../TreeItem2'; import { TreeViewItemId } from '../models'; -import { SlotComponentPropsFromProps, TreeViewPublicAPI } from '../internals/models'; +import { + SlotComponentPropsFromProps, + TreeViewExperimentalFeatures, + TreeViewPublicAPI, +} from '../internals/models'; interface RichTreeViewItemSlotOwnerState { itemId: TreeViewItemId; @@ -43,7 +47,7 @@ export interface RichTreeViewSlotProps<R extends {}, Multiple extends boolean | } export type RichTreeViewApiRef = React.MutableRefObject< - TreeViewPublicAPI<DefaultTreeViewPlugins> | undefined + TreeViewPublicAPI<DefaultTreeViewPluginSignatures> | undefined >; export interface RichTreeViewPropsBase extends React.HTMLAttributes<HTMLUListElement> { @@ -75,4 +79,10 @@ export interface RichTreeViewProps<R extends {}, Multiple extends boolean | unde * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`. */ apiRef?: RichTreeViewApiRef; + /** + * Unstable features, breaking changes might be introduced. + * For each feature, if the flag is not explicitly set to `true`, + * the feature will be fully disabled and any property / method call will not have any effect. + */ + experimentalFeatures?: TreeViewExperimentalFeatures<DefaultTreeViewPluginSignatures>; } diff --git a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.plugins.ts b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.plugins.ts index 7d2cabef636f..f380f55d4cda 100644 --- a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.plugins.ts +++ b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.plugins.ts @@ -12,7 +12,9 @@ export const SIMPLE_TREE_VIEW_PLUGINS = [ useTreeViewJSXItems, ] as const; -export type SimpleTreeViewPlugins = ConvertPluginsIntoSignatures<typeof SIMPLE_TREE_VIEW_PLUGINS>; +export type SimpleTreeViewPluginSignatures = ConvertPluginsIntoSignatures< + typeof SIMPLE_TREE_VIEW_PLUGINS +>; export type SimpleTreeViewPluginSlots = DefaultTreeViewPluginSlots; diff --git a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.test.tsx b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.test.tsx index 1d18084b46f4..c520da155e47 100644 --- a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.test.tsx +++ b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.test.tsx @@ -1,10 +1,6 @@ import * as React from 'react'; -import { expect } from 'chai'; -import { spy } from 'sinon'; -import { act, createRenderer, ErrorBoundary, fireEvent, screen } from '@mui-internal/test-utils'; -import Portal from '@mui/material/Portal'; +import { createRenderer } from '@mui/internal-test-utils'; import { SimpleTreeView, simpleTreeViewClasses as classes } from '@mui/x-tree-view/SimpleTreeView'; -import { TreeItem } from '@mui/x-tree-view/TreeItem'; import { describeConformance } from 'test/utils/describeConformance'; describe('<SimpleTreeView />', () => { @@ -18,235 +14,4 @@ describe('<SimpleTreeView />', () => { muiName: 'MuiSimpleTreeView', skip: ['componentProp', 'componentsProp', 'themeVariants'], })); - - describe('warnings', () => { - it('should not crash when shift clicking a clean tree', () => { - render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" /> - <TreeItem itemId="two" label="two" /> - </SimpleTreeView>, - ); - - fireEvent.click(screen.getByText('one'), { shiftKey: true }); - }); - - it('should not crash when selecting multiple items in a deeply nested tree', () => { - render( - <SimpleTreeView multiSelect defaultExpandedItems={['1', '1.1', '2']}> - <TreeItem itemId="1" label="Item 1"> - <TreeItem itemId="1.1" label="Item 1.1"> - <TreeItem itemId="1.1.1" data-testid="item-1.1.1" label="Item 1.1.1" /> - </TreeItem> - </TreeItem> - <TreeItem itemId="2" data-testid="item-2" label="Item 2" /> - </SimpleTreeView>, - ); - fireEvent.click(screen.getByText('Item 1.1.1')); - fireEvent.click(screen.getByText('Item 2'), { shiftKey: true }); - - expect(screen.getByTestId('item-1.1.1')).to.have.attribute('aria-selected', 'true'); - expect(screen.getByTestId('item-2')).to.have.attribute('aria-selected', 'true'); - }); - - it('should not crash when unmounting with duplicate ids', () => { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - function CustomTreeItem(props: any) { - return <TreeItem itemId="iojerogj" />; - } - function App() { - const [isVisible, hideTreeView] = React.useReducer(() => false, true); - - return ( - <React.Fragment> - <button onClick={hideTreeView} type="button"> - Toggle - </button> - {isVisible && ( - <SimpleTreeView> - <TreeItem itemId="a" label="b"> - <CustomTreeItem itemId="a" /> - </TreeItem> - </SimpleTreeView> - )} - </React.Fragment> - ); - } - const errorRef = React.createRef<ErrorBoundary>(); - render( - <ErrorBoundary ref={errorRef}> - <App /> - </ErrorBoundary>, - ); - - expect(() => { - act(() => { - screen.getByRole('button').click(); - }); - }).not.toErrorDev(); - }); - }); - - it('should call onKeyDown when a key is pressed', () => { - const handleTreeViewKeyDown = spy(); - const handleTreeItemKeyDown = spy(); - - const { getByTestId } = render( - <SimpleTreeView onKeyDown={handleTreeViewKeyDown}> - <TreeItem itemId="one" data-testid="one" onKeyDown={handleTreeItemKeyDown} /> - </SimpleTreeView>, - ); - - const itemOne = getByTestId('one'); - act(() => { - itemOne.focus(); - }); - - fireEvent.keyDown(itemOne, { key: 'Enter' }); - fireEvent.keyDown(itemOne, { key: 'A' }); - fireEvent.keyDown(itemOne, { key: ']' }); - - expect(handleTreeViewKeyDown.callCount).to.equal(3); - expect(handleTreeItemKeyDown.callCount).to.equal(3); - }); - - it('should select item when Enter key is pressed ', () => { - const handleKeyDown = spy(); - - const { getByTestId } = render( - <SimpleTreeView onKeyDown={handleKeyDown}> - <TreeItem itemId="one" data-testid="one" /> - </SimpleTreeView>, - ); - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).not.to.have.attribute('aria-selected'); - - fireEvent.keyDown(getByTestId('one'), { key: 'Enter' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected'); - }); - - it('should not error when component state changes', () => { - function MyComponent() { - const [, setState] = React.useState(1); - - return ( - <SimpleTreeView - defaultExpandedItems={['one']} - onItemFocus={() => { - setState(Math.random); - }} - > - <TreeItem itemId="one" data-testid="one"> - <TreeItem itemId="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView> - ); - } - - const { getByTestId } = render(<MyComponent />); - - fireEvent.focus(getByTestId('one')); - fireEvent.focus(getByTestId('one')); - expect(getByTestId('one')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - - expect(getByTestId('two')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowUp' }); - - expect(getByTestId('one')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - - expect(getByTestId('two')).toHaveFocus(); - }); - - it('should support conditional rendered tree items', () => { - function TestComponent() { - const [hide, setState] = React.useState(false); - - return ( - <React.Fragment> - <button type="button" onClick={() => setState(true)}> - Hide - </button> - <SimpleTreeView>{!hide && <TreeItem itemId="test" label="test" />}</SimpleTreeView> - </React.Fragment> - ); - } - - const { getByText, queryByText } = render(<TestComponent />); - - expect(getByText('test')).not.to.equal(null); - fireEvent.click(getByText('Hide')); - expect(queryByText('test')).to.equal(null); - }); - - it('should work in a portal', () => { - const { getByTestId } = render( - <Portal> - <SimpleTreeView> - <TreeItem itemId="one" data-testid="one" /> - <TreeItem itemId="two" data-testid="two" /> - <TreeItem itemId="three" data-testid="three" /> - <TreeItem itemId="four" data-testid="four" /> - </SimpleTreeView> - </Portal>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - - expect(getByTestId('two')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowDown' }); - - expect(getByTestId('three')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowDown' }); - - expect(getByTestId('four')).toHaveFocus(); - }); - - it('should update indexes when two items are swapped', () => { - const onSelectedItemsChange = spy(); - - function TestComponent() { - const [items, setItems] = React.useState(['1', '2', '3']); - - return ( - <React.Fragment> - <button type="button" onClick={() => setItems(['1', '3', '2'])}> - Swap items - </button> - <SimpleTreeView onSelectedItemsChange={onSelectedItemsChange} multiSelect> - {items.map((itemId) => ( - <TreeItem key={itemId} itemId={itemId} label={itemId} /> - ))} - </SimpleTreeView> - </React.Fragment> - ); - } - - const { getByText } = render(<TestComponent />); - fireEvent.click(getByText('Swap items')); - fireEvent.click(getByText('1')); - fireEvent.click(getByText('3'), { shiftKey: true }); - expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal(['1', '3']); - }); - - describe('Accessibility', () => { - it('(TreeView) should have the role `tree`', () => { - const { getByRole } = render(<SimpleTreeView />); - - expect(getByRole('tree')).not.to.equal(null); - }); - }); }); diff --git a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.tsx b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.tsx index f25515f22472..7a159b1eda55 100644 --- a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.tsx +++ b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.tsx @@ -1,20 +1,22 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { styled, useThemeProps } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; import { useSlotProps } from '@mui/base/utils'; +import { styled, createUseThemeProps } from '../internals/zero-styled'; import { getSimpleTreeViewUtilityClass } from './simpleTreeViewClasses'; import { SimpleTreeViewProps, - SimpleTreeViewSlotProps, SimpleTreeViewSlots, + SimpleTreeViewSlotProps, } from './SimpleTreeView.types'; import { useTreeView } from '../internals/useTreeView'; import { TreeViewProvider } from '../internals/TreeViewProvider'; -import { SIMPLE_TREE_VIEW_PLUGINS } from './SimpleTreeView.plugins'; +import { SIMPLE_TREE_VIEW_PLUGINS, SimpleTreeViewPluginSignatures } from './SimpleTreeView.plugins'; import { buildWarning } from '../internals/utils/warning'; import { extractPluginParamsFromProps } from '../internals/utils/extractPluginParamsFromProps'; +const useThemeProps = createUseThemeProps('MuiSimpleTreeView'); + const useUtilityClasses = <Multiple extends boolean | undefined>( ownerState: SimpleTreeViewProps<Multiple>, ) => { @@ -74,7 +76,7 @@ const SimpleTreeView = React.forwardRef(function SimpleTreeView< } const { pluginParams, slots, slotProps, otherProps } = extractPluginParamsFromProps< - typeof SIMPLE_TREE_VIEW_PLUGINS, + SimpleTreeViewPluginSignatures, SimpleTreeViewSlots, SimpleTreeViewSlotProps, SimpleTreeViewProps<Multiple> & { items: any } @@ -108,7 +110,7 @@ const SimpleTreeView = React.forwardRef(function SimpleTreeView< SimpleTreeView.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`. @@ -161,11 +163,25 @@ SimpleTreeView.propTypes = { * Used when the item's expansion is controlled. */ expandedItems: PropTypes.arrayOf(PropTypes.string), + /** + * Unstable features, breaking changes might be introduced. + * For each feature, if the flag is not explicitly set to `true`, + * the feature will be fully disabled and any property / method call will not have any effect. + */ + experimentalFeatures: PropTypes.shape({ + indentationAtItemLevel: PropTypes.bool, + }), /** * This prop is used to help implement the accessibility logic. * If you don't provide this prop. It falls back to a randomly generated id. */ id: PropTypes.string, + /** + * Horizontal indentation between an item and its children. + * Examples: 24, "24px", "2rem", "2em". + * @default 12px + */ + itemChildrenIndentation: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), /** * If `true`, `ctrl` and `shift` will trigger multiselect. * @default false diff --git a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.types.ts b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.types.ts index b5be79437a15..958dbcbf8348 100644 --- a/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.types.ts +++ b/packages/x-tree-view/src/SimpleTreeView/SimpleTreeView.types.ts @@ -7,9 +7,9 @@ import { SimpleTreeViewPluginParameters, SimpleTreeViewPluginSlotProps, SimpleTreeViewPluginSlots, - SimpleTreeViewPlugins, + SimpleTreeViewPluginSignatures, } from './SimpleTreeView.plugins'; -import { TreeViewPublicAPI } from '../internals/models'; +import { TreeViewExperimentalFeatures, TreeViewPublicAPI } from '../internals/models'; export interface SimpleTreeViewSlots extends SimpleTreeViewPluginSlots { /** @@ -24,7 +24,7 @@ export interface SimpleTreeViewSlotProps extends SimpleTreeViewPluginSlotProps { } export type SimpleTreeViewApiRef = React.MutableRefObject< - TreeViewPublicAPI<SimpleTreeViewPlugins> | undefined + TreeViewPublicAPI<SimpleTreeViewPluginSignatures> | undefined >; export interface SimpleTreeViewProps<Multiple extends boolean | undefined> @@ -55,4 +55,10 @@ export interface SimpleTreeViewProps<Multiple extends boolean | undefined> * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`. */ apiRef?: SimpleTreeViewApiRef; + /** + * Unstable features, breaking changes might be introduced. + * For each feature, if the flag is not explicitly set to `true`, + * the feature will be fully disabled and any property / method call will not have any effect. + */ + experimentalFeatures?: TreeViewExperimentalFeatures<SimpleTreeViewPluginSignatures>; } diff --git a/packages/x-tree-view/src/TreeItem/TreeItem.test.tsx b/packages/x-tree-view/src/TreeItem/TreeItem.test.tsx index 064574e54c52..49a9702b6f23 100644 --- a/packages/x-tree-view/src/TreeItem/TreeItem.test.tsx +++ b/packages/x-tree-view/src/TreeItem/TreeItem.test.tsx @@ -1,16 +1,15 @@ import * as React from 'react'; import { expect } from 'chai'; import PropTypes from 'prop-types'; -import { spy } from 'sinon'; -import { act, createEvent, createRenderer, fireEvent } from '@mui-internal/test-utils'; -import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; -import { SimpleTreeViewPlugins } from '@mui/x-tree-view/SimpleTreeView/SimpleTreeView.plugins'; +import { createRenderer } from '@mui/internal-test-utils'; +import { SimpleTreeViewPluginSignatures } from '@mui/x-tree-view/SimpleTreeView/SimpleTreeView.plugins'; import { TreeItem, treeItemClasses as classes } from '@mui/x-tree-view/TreeItem'; import { TreeViewContextValue } from '@mui/x-tree-view/internals/TreeViewProvider'; import { TreeViewContext } from '@mui/x-tree-view/internals/TreeViewProvider/TreeViewContext'; import { describeConformance } from 'test/utils/describeConformance'; +import { describeTreeView } from 'test/utils/tree-view/describeTreeView'; -const TEST_TREE_VIEW_CONTEXT_VALUE: TreeViewContextValue<SimpleTreeViewPlugins> = { +const TEST_TREE_VIEW_CONTEXT_VALUE: TreeViewContextValue<SimpleTreeViewPluginSignatures> = { instance: { isItemExpandable: () => false, isItemExpanded: () => false, @@ -30,6 +29,7 @@ const TEST_TREE_VIEW_CONTEXT_VALUE: TreeViewContextValue<SimpleTreeViewPlugins> wrapItem: ({ children }) => children, wrapRoot: ({ children }) => children, disabledItemsFocusable: false, + indentationAtItemLevel: false, icons: { slots: {}, slotProps: {}, @@ -44,6 +44,48 @@ const TEST_TREE_VIEW_CONTEXT_VALUE: TreeViewContextValue<SimpleTreeViewPlugins> }, }; +describeTreeView<[]>('TreeItem component', ({ render, treeItemComponentName }) => { + describe('ContentComponent / ContentProps props (TreeItem only)', () => { + it('should use the ContentComponent prop when defined', function test() { + if (treeItemComponentName === 'TreeItem2') { + this.skip(); + } + + const ContentComponent = React.forwardRef((props: any, ref: React.Ref<HTMLDivElement>) => ( + <div className={props.classes.root} ref={ref}> + MOCK CONTENT COMPONENT + </div> + )); + + const response = render({ + items: [{ id: '1' }], + slotProps: { item: { ContentComponent } }, + }); + + expect(response.getItemContent('1').textContent).to.equal('MOCK CONTENT COMPONENT'); + }); + + it('should use the ContentProps prop when defined', function test() { + if (treeItemComponentName === 'TreeItem2') { + this.skip(); + } + + const ContentComponent = React.forwardRef((props: any, ref: React.Ref<HTMLDivElement>) => ( + <div className={props.classes.root} ref={ref}> + {props.customProp} + </div> + )); + + const response = render({ + items: [{ id: '1' }], + slotProps: { item: { ContentComponent, ContentProps: { customProp: 'ABCDEF' } as any } }, + }); + + expect(response.getItemContent('1').textContent).to.equal('ABCDEF'); + }); + }); +}); + describe('<TreeItem />', () => { const { render } = createRenderer(); @@ -70,7 +112,7 @@ describe('<TreeItem />', () => { skip: ['reactTestRenderer', 'componentProp', 'componentsProp', 'themeVariants'], })); - describe('warnings', () => { + describe('PropTypes warnings', () => { beforeEach(() => { PropTypes.resetWarningCache(); }); @@ -97,1557 +139,4 @@ describe('<TreeItem />', () => { }).toErrorDev('Expected an element type that can hold a ref.'); }); }); - - it('should call onClick when clicked', () => { - const handleClick = spy(); - - const { getByText } = render( - <SimpleTreeView> - <TreeItem itemId="test" label="test" onClick={handleClick} /> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('test')); - - expect(handleClick.callCount).to.equal(1); - }); - - it('should allow conditional child', () => { - function TestComponent() { - const [hide, setState] = React.useState(false); - - return ( - <React.Fragment> - <button data-testid="button" type="button" onClick={() => setState(true)}> - Hide - </button> - <SimpleTreeView defaultExpandedItems={['1']}> - <TreeItem itemId="1" data-testid="1"> - {!hide && <TreeItem itemId="2" data-testid="2" />} - </TreeItem> - </SimpleTreeView> - </React.Fragment> - ); - } - const { getByTestId, queryByTestId } = render(<TestComponent />); - - expect(getByTestId('1')).to.have.attribute('aria-expanded', 'true'); - expect(getByTestId('2')).not.to.equal(null); - fireEvent.click(getByTestId('button')); - expect(getByTestId('1')).not.to.have.attribute('aria-expanded'); - expect(queryByTestId('2')).to.equal(null); - }); - - it('should treat an empty array equally to no children', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['1']}> - <TreeItem itemId="1" label="1" data-testid="1"> - <TreeItem itemId="2" label="2" data-testid="2"> - {[]} - </TreeItem> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('2')).not.to.have.attribute('aria-expanded'); - }); - - it('should treat multiple empty conditional arrays as empty', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['1']}> - <TreeItem itemId="1" label="1" data-testid="1"> - <TreeItem itemId="2" label="2" data-testid="2"> - {[].map((_, index) => ( - <React.Fragment key={index}>a child</React.Fragment> - ))} - {[].map((_, index) => ( - <React.Fragment key={index}>a child</React.Fragment> - ))} - </TreeItem> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('2')).not.to.have.attribute('aria-expanded'); - }); - - it('should treat one conditional empty and one conditional with results as expandable', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['1', '2']}> - <TreeItem itemId="1" label="1" data-testid="1"> - <TreeItem itemId="2" label="2" data-testid="2"> - {[]} - {[1].map((_, index) => ( - <React.Fragment key={index}>a child</React.Fragment> - ))} - </TreeItem> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('2')).to.have.attribute('aria-expanded', 'true'); - }); - - it('should handle edge case of nested array of array', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['1', '2']}> - <TreeItem itemId="1" label="1" data-testid="1"> - <TreeItem itemId="2" label="2" data-testid="2"> - {[[]]} - </TreeItem> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('2')).not.to.have.attribute('aria-expanded'); - }); - - it('should not call onClick when children are clicked', () => { - const handleClick = spy(); - - const { getByText } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" onClick={handleClick}> - <TreeItem itemId="two" label="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('two')); - - expect(handleClick.callCount).to.equal(0); - }); - - it('should be able to use a custom id', () => { - const { getByRole } = render( - <SimpleTreeView> - <TreeItem id="customId" itemId="one" data-testid="one" /> - </SimpleTreeView>, - ); - - expect(getByRole('treeitem')).to.have.attribute('id', 'customId'); - }); - - describe('Accessibility', () => { - it('should have the role `treeitem`', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="test" label="test" data-testid="test" /> - </SimpleTreeView>, - ); - - expect(getByTestId('test')).to.have.attribute('role', 'treeitem'); - }); - - it('should add the role `group` to a component containing children', () => { - const { getByRole, getByText } = render( - <SimpleTreeView defaultExpandedItems={['test']}> - <TreeItem itemId="test" label="test"> - <TreeItem itemId="test2" label="test2" /> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByRole('group')).to.contain(getByText('test2')); - }); - - describe('aria-disabled', () => { - it('should not have the attribute `aria-disabled` if disabled is false', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).not.to.have.attribute('aria-disabled'); - }); - - it('should have the attribute `aria-disabled={true}` if disabled', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" disabled data-testid="one" /> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-disabled', 'true'); - }); - }); - - describe('Navigation', () => { - describe('right arrow interaction', () => { - it('should open the item and not move the focus if focus is on a closed item', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'false'); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowRight' }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - expect(getByTestId('one')).toHaveFocus(); - }); - - it('should move focus to the first child if focus is on an open item', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowRight' }); - - expect(getByTestId('two')).toHaveFocus(); - }); - - it('should do nothing if focus is on an end item', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('two').focus(); - }); - - expect(getByTestId('two')).toHaveFocus(); - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowRight' }); - - expect(getByTestId('two')).toHaveFocus(); - }); - }); - - describe('left arrow interaction', () => { - it('should close the item if focus is on an open item', () => { - const { getByTestId, getByText } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('one')); - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowLeft' }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'false'); - expect(getByTestId('one')).toHaveFocus(); - }); - - it("should move focus to the item's parent item if focus is on a child item that is an end item", () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - act(() => { - getByTestId('two').focus(); - }); - - expect(getByTestId('two')).toHaveFocus(); - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowLeft' }); - - expect(getByTestId('one')).toHaveFocus(); - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - }); - - it("should move focus to the item's parent item if focus is on a child item that is closed", () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two"> - <TreeItem itemId="three" label="three" /> - </TreeItem> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - act(() => { - getByTestId('two').focus(); - }); - - expect(getByTestId('two')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowLeft' }); - - expect(getByTestId('one')).toHaveFocus(); - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - }); - - it('should do nothing if focus is on a root item that is closed', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'false'); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowLeft' }); - expect(getByTestId('one')).toHaveFocus(); - }); - - it('should do nothing if focus is on a root item that is an end item', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowLeft' }); - - expect(getByTestId('one')).toHaveFocus(); - }); - }); - - describe('down arrow interaction', () => { - it('moves focus to a sibling item', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - - expect(getByTestId('two')).toHaveFocus(); - }); - - it('moves focus to a child item', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - - expect(getByTestId('two')).toHaveFocus(); - }); - - it('moves focus to a child item works with a dynamic tree', () => { - function TestComponent() { - const [hide, setState] = React.useState(false); - - return ( - <React.Fragment> - <button - data-testid="button" - type="button" - onClick={() => setState((value) => !value)} - > - Toggle Hide - </button> - <SimpleTreeView defaultExpandedItems={['one']}> - {!hide && ( - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - )} - <TreeItem itemId="three" label="three" /> - </SimpleTreeView> - </React.Fragment> - ); - } - - const { queryByTestId, getByTestId, getByText } = render(<TestComponent />); - - expect(getByTestId('one')).not.to.equal(null); - fireEvent.click(getByText('Toggle Hide')); - expect(queryByTestId('one')).to.equal(null); - fireEvent.click(getByText('Toggle Hide')); - expect(getByTestId('one')).not.to.equal(null); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - - expect(getByTestId('two')).toHaveFocus(); - }); - - it("moves focus to a parent's sibling", () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - <TreeItem itemId="three" label="three" data-testid="three" /> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - act(() => { - getByTestId('two').focus(); - }); - - expect(getByTestId('two')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowDown' }); - - expect(getByTestId('three')).toHaveFocus(); - }); - }); - - describe('up arrow interaction', () => { - it('moves focus to a sibling item', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('two').focus(); - }); - - expect(getByTestId('two')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowUp' }); - - expect(getByTestId('one')).toHaveFocus(); - }); - - it('moves focus to a parent', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - act(() => { - getByTestId('two').focus(); - }); - - expect(getByTestId('two')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowUp' }); - - expect(getByTestId('one')).toHaveFocus(); - }); - - it("moves focus to a sibling's child", () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - <TreeItem itemId="three" label="three" data-testid="three" /> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - act(() => { - getByTestId('three').focus(); - }); - - expect(getByTestId('three')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowUp' }); - - expect(getByTestId('two')).toHaveFocus(); - }); - }); - - describe('home key interaction', () => { - it('moves focus to the first item in the tree', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('four').focus(); - }); - - expect(getByTestId('four')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('four'), { key: 'Home' }); - - expect(getByTestId('one')).toHaveFocus(); - }); - }); - - describe('end key interaction', () => { - it('moves focus to the last item in the tree without expanded items', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('one'), { key: 'End' }); - - expect(getByTestId('four')).toHaveFocus(); - }); - - it('moves focus to the last item in the tree with expanded items', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['four', 'five']}> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four"> - <TreeItem itemId="five" label="five" data-testid="five"> - <TreeItem itemId="six" label="six" data-testid="six" /> - </TreeItem> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('one'), { key: 'End' }); - - expect(getByTestId('six')).toHaveFocus(); - }); - }); - - describe('asterisk key interaction', () => { - it('expands all siblings that are at the same level as the current item', () => { - const onExpandedItemsChange = spy(); - - const { getByTestId } = render( - <SimpleTreeView onExpandedItemsChange={onExpandedItemsChange}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - <TreeItem itemId="three" label="three" data-testid="three"> - <TreeItem itemId="four" label="four" data-testid="four" /> - </TreeItem> - <TreeItem itemId="five" label="five" data-testid="five"> - <TreeItem itemId="six" label="six" data-testid="six"> - <TreeItem itemId="seven" label="seven" data-testid="seven" /> - </TreeItem> - </TreeItem> - <TreeItem itemId="eight" label="eight" data-testid="eight" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'false'); - expect(getByTestId('three')).to.have.attribute('aria-expanded', 'false'); - expect(getByTestId('five')).to.have.attribute('aria-expanded', 'false'); - - fireEvent.keyDown(getByTestId('one'), { key: '*' }); - - expect(onExpandedItemsChange.args[0][1]).to.have.length(3); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-expanded', 'true'); - expect(getByTestId('five')).to.have.attribute('aria-expanded', 'true'); - expect(getByTestId('six')).to.have.attribute('aria-expanded', 'false'); - expect(getByTestId('eight')).not.to.have.attribute('aria-expanded'); - }); - }); - }); - - describe('Expansion', () => { - describe('enter key interaction', () => { - it('expands an item with children', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'false'); - - fireEvent.keyDown(getByTestId('one'), { key: 'Enter' }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - }); - - it('collapses an item with children', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'false'); - - fireEvent.keyDown(getByTestId('one'), { key: 'Enter' }); - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'true'); - - fireEvent.keyDown(getByTestId('one'), { key: 'Enter' }); - expect(getByTestId('one')).to.have.attribute('aria-expanded', 'false'); - }); - }); - }); - - describe('Single Selection', () => { - describe('keyboard', () => { - it('should select an item when space is pressed', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).not.to.have.attribute('aria-selected'); - - fireEvent.keyDown(getByTestId('one'), { key: ' ' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - }); - - it('should not deselect an item when space is pressed on a selected item', () => { - const { getByTestId } = render( - <SimpleTreeView defaultSelectedItems="one"> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).toHaveFocus(); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - - fireEvent.keyDown(getByTestId('one'), { key: ' ' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - }); - - it('should not select an node when space is pressed and disableSelection', () => { - const { getByTestId } = render( - <SimpleTreeView disableSelection> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: ' ' }); - - expect(getByTestId('one')).not.to.have.attribute('aria-selected'); - }); - - it('should select an item when Enter is pressed and the item is not selected', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'Enter' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected'); - }); - - it('should not un-select an item when Enter is pressed and the item is selected', () => { - const { getByTestId } = render( - <SimpleTreeView defaultSelectedItems="one"> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'Enter' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected'); - }); - }); - }); - - describe('Multi Selection', () => { - describe('deselection', () => { - it('should deselect the item when pressing space on a selected item', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect defaultSelectedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).toHaveFocus(); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - fireEvent.keyDown(getByTestId('one'), { key: ' ' }); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'false'); - }); - }); - - describe('range selection', () => { - it('keyboard arrow', () => { - const { getByTestId, queryAllByRole, getByText } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('three')); - act(() => { - getByTestId('three').focus(); - }); - - expect(getByTestId('three')).to.have.attribute('aria-selected', 'true'); - - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowDown', shiftKey: true }); - - expect(getByTestId('four')).toHaveFocus(); - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(2); - - fireEvent.keyDown(getByTestId('four'), { key: 'ArrowDown', shiftKey: true }); - - expect(getByTestId('three')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('four')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(3); - - fireEvent.keyDown(getByTestId('five'), { key: 'ArrowUp', shiftKey: true }); - - expect(getByTestId('four')).toHaveFocus(); - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(2); - - fireEvent.keyDown(getByTestId('four'), { key: 'ArrowUp', shiftKey: true }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(1); - - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowUp', shiftKey: true }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(2); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowUp', shiftKey: true }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('four')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('five')).to.have.attribute('aria-selected', 'false'); - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(3); - }); - - it('keyboard arrow does not select when selectionDisabled', () => { - const { getByTestId, queryAllByRole } = render( - <SimpleTreeView disableSelection multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown', shiftKey: true }); - - expect(getByTestId('two')).toHaveFocus(); - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(0); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowUp', shiftKey: true }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(0); - }); - - it('keyboard arrow merge', () => { - const { getByTestId, getByText, queryAllByRole } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - <TreeItem itemId="six" label="six" data-testid="six" /> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('three')); - act(() => { - getByTestId('three').focus(); - }); - - expect(getByTestId('three')).to.have.attribute('aria-selected', 'true'); - - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowUp', shiftKey: true }); - fireEvent.click(getByText('six'), { ctrlKey: true }); - fireEvent.keyDown(getByTestId('six'), { key: 'ArrowUp', shiftKey: true }); - fireEvent.keyDown(getByTestId('five'), { key: 'ArrowUp', shiftKey: true }); - fireEvent.keyDown(getByTestId('four'), { key: 'ArrowUp', shiftKey: true }); - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowUp', shiftKey: true }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(5); - - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowDown', shiftKey: true }); - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowDown', shiftKey: true }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(3); - }); - - it('keyboard space', () => { - const { getByTestId, getByText } = render( - <SimpleTreeView multiSelect defaultExpandedItems={['two']}> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two"> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - </TreeItem> - <TreeItem itemId="five" label="five" data-testid="five"> - <TreeItem itemId="six" label="six" data-testid="six" /> - <TreeItem itemId="seven" label="seven" data-testid="seven" /> - </TreeItem> - <TreeItem itemId="eight" label="eight" data-testid="eight" /> - <TreeItem itemId="nine" label="nine" data-testid="nine" /> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('five')); - act(() => { - getByTestId('five').focus(); - }); - - fireEvent.keyDown(getByTestId('five'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('six'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('seven'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('eight'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('nine'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('nine'), { key: ' ', shiftKey: true }); - - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('six')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('seven')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('eight')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('nine')).to.have.attribute('aria-selected', 'true'); - - fireEvent.keyDown(getByTestId('nine'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('eight'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('seven'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('six'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('five'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('four'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('three'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowUp' }); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowUp' }); - - fireEvent.keyDown(getByTestId('one'), { key: ' ', shiftKey: true }); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('four')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('six')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('seven')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('eight')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('nine')).to.have.attribute('aria-selected', 'false'); - }); - - it('keyboard home and end', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect defaultExpandedItems={['two', 'five']}> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two"> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - </TreeItem> - <TreeItem itemId="five" label="five" data-testid="five"> - <TreeItem itemId="six" label="six" data-testid="six" /> - <TreeItem itemId="seven" label="seven" data-testid="seven" /> - </TreeItem> - <TreeItem itemId="eight" label="eight" data-testid="eight" /> - <TreeItem itemId="nine" label="nine" data-testid="nine" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('five').focus(); - }); - - fireEvent.keyDown(getByTestId('five'), { - key: 'End', - shiftKey: true, - ctrlKey: true, - }); - - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('six')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('seven')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('eight')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('nine')).to.have.attribute('aria-selected', 'true'); - - fireEvent.keyDown(getByTestId('five'), { - key: 'Home', - shiftKey: true, - ctrlKey: true, - }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('four')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('six')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('seven')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('eight')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('nine')).to.have.attribute('aria-selected', 'false'); - }); - - it('keyboard home and end do not select when selectionDisabled', () => { - const { getByTestId, getByText, queryAllByRole } = render( - <SimpleTreeView disableSelection multiSelect defaultExpandedItems={['two', 'five']}> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two"> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - </TreeItem> - <TreeItem itemId="five" label="five" data-testid="five"> - <TreeItem itemId="six" label="six" data-testid="six" /> - <TreeItem itemId="seven" label="seven" data-testid="seven" /> - </TreeItem> - <TreeItem itemId="eight" label="eight" data-testid="eight" /> - <TreeItem itemId="nine" label="nine" data-testid="nine" /> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('five')); - act(() => { - getByTestId('five').focus(); - }); - fireEvent.keyDown(getByTestId('five'), { - key: 'End', - shiftKey: true, - ctrlKey: true, - }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(0); - - fireEvent.keyDown(getByTestId('nine'), { - key: 'Home', - shiftKey: true, - ctrlKey: true, - }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(0); - }); - }); - - describe('multi selection', () => { - it('keyboard', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'false'); - - fireEvent.keyDown(getByTestId('one'), { key: ' ' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'false'); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('two'), { key: ' ' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - }); - - it('keyboard holding ctrl', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'false'); - - fireEvent.keyDown(getByTestId('one'), { key: ' ' }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'false'); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('two'), { key: ' ', ctrlKey: true }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - }); - }); - - it('ctrl + a selects all', () => { - const { getByTestId, queryAllByRole } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'a', ctrlKey: true }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(5); - }); - - it('ctrl + a does not select all when disableSelection', () => { - const { getByTestId, queryAllByRole } = render( - <SimpleTreeView disableSelection multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - fireEvent.keyDown(getByTestId('one'), { key: 'a', ctrlKey: true }); - - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(0); - }); - }); - }); - - describe('prop: disabled', () => { - describe('selection', () => { - describe('keyboard', () => { - describe('`disabledItemsFocusable={true}`', () => { - it('should prevent selection by keyboard', () => { - const { getByTestId } = render( - <SimpleTreeView disabledItemsFocusable> - <TreeItem itemId="one" label="one" disabled data-testid="one" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - expect(getByTestId('one')).toHaveFocus(); - fireEvent.keyDown(getByTestId('one'), { key: ' ' }); - expect(getByTestId('one')).not.to.have.attribute('aria-selected'); - }); - - it('should not prevent next item being range selected by keyboard', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect disabledItemsFocusable> - <TreeItem itemId="one" label="one" disabled data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - expect(getByTestId('one')).toHaveFocus(); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown', shiftKey: true }); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).toHaveFocus(); - }); - - it('should prevent range selection by keyboard + arrow down', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect disabledItemsFocusable> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" disabled data-testid="two" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - expect(getByTestId('one')).toHaveFocus(); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown', shiftKey: true }); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('two')).toHaveFocus(); - }); - }); - - describe('`disabledItemsFocusable={false}`', () => { - it('should select the next non disabled item by keyboard + arrow down', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" disabled data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - expect(getByTestId('one')).toHaveFocus(); - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown', shiftKey: true }); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('three')).toHaveFocus(); - expect(getByTestId('one')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('three')).to.have.attribute('aria-selected', 'true'); - }); - }); - - it('should prevent range selection by keyboard + space', () => { - const { getByTestId, getByText } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" disabled data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('one')); - act(() => { - getByTestId('one').focus(); - }); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowDown' }); - fireEvent.keyDown(getByTestId('four'), { key: 'ArrowDown' }); - - fireEvent.keyDown(getByTestId('five'), { key: ' ', shiftKey: true }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('four')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - }); - - it('should prevent selection by ctrl + a', () => { - const { getByTestId, queryAllByRole } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" disabled data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - fireEvent.keyDown(getByTestId('one'), { key: 'a', ctrlKey: true }); - expect(queryAllByRole('treeitem', { selected: true })).to.have.length(4); - }); - - it('should prevent selection by keyboard end', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" disabled data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - expect(getByTestId('one')).toHaveFocus(); - fireEvent.keyDown(getByTestId('one'), { - key: 'End', - shiftKey: true, - ctrlKey: true, - }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('four')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - }); - - it('should prevent selection by keyboard home', () => { - const { getByTestId } = render( - <SimpleTreeView multiSelect> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" disabled data-testid="three" /> - <TreeItem itemId="four" label="four" data-testid="four" /> - <TreeItem itemId="five" label="five" data-testid="five" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('five').focus(); - }); - expect(getByTestId('five')).toHaveFocus(); - fireEvent.keyDown(getByTestId('five'), { - key: 'Home', - shiftKey: true, - ctrlKey: true, - }); - - expect(getByTestId('one')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-selected', 'false'); - expect(getByTestId('four')).to.have.attribute('aria-selected', 'true'); - expect(getByTestId('five')).to.have.attribute('aria-selected', 'true'); - }); - }); - }); - - describe('focus', () => { - describe('`disabledItemsFocusable={true}`', () => { - it('should not prevent focus by arrow keys', () => { - const { getByTestId } = render( - <SimpleTreeView disabledItemsFocusable> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" disabled data-testid="two" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - expect(getByTestId('two')).toHaveFocus(); - }); - }); - - describe('`disabledItemsFocusable=false`', () => { - it('should be skipped on navigation with arrow keys', () => { - const { getByTestId } = render( - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - <TreeItem itemId="two" label="two" disabled data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('one').focus(); - }); - - expect(getByTestId('one')).toHaveFocus(); - - fireEvent.keyDown(getByTestId('one'), { key: 'ArrowDown' }); - expect(getByTestId('three')).toHaveFocus(); - }); - }); - }); - - describe('expansion', () => { - describe('`disabledItemsFocusable={true}`', () => { - it('should prevent expansion on Enter', () => { - const { getByTestId } = render( - <SimpleTreeView disabledItemsFocusable> - <TreeItem itemId="one" label="one" /> - <TreeItem itemId="two" label="two" disabled data-testid="two"> - <TreeItem itemId="three" label="three" /> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('two').focus(); - }); - expect(getByTestId('two')).toHaveFocus(); - expect(getByTestId('two')).to.have.attribute('aria-expanded', 'false'); - fireEvent.keyDown(getByTestId('two'), { key: 'Enter' }); - expect(getByTestId('two')).to.have.attribute('aria-expanded', 'false'); - }); - - it('should prevent expansion on right arrow', () => { - const { getByTestId } = render( - <SimpleTreeView disabledItemsFocusable> - <TreeItem itemId="one" label="one" /> - <TreeItem itemId="two" label="two" disabled data-testid="two"> - <TreeItem itemId="three" label="three" /> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('two').focus(); - }); - expect(getByTestId('two')).toHaveFocus(); - expect(getByTestId('two')).to.have.attribute('aria-expanded', 'false'); - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowRight' }); - expect(getByTestId('two')).to.have.attribute('aria-expanded', 'false'); - }); - - it('should prevent collapse on left arrow', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['two']} disabledItemsFocusable> - <TreeItem itemId="one" label="one" /> - <TreeItem itemId="two" label="two" disabled data-testid="two"> - <TreeItem itemId="three" label="three" /> - </TreeItem> - </SimpleTreeView>, - ); - - act(() => { - getByTestId('two').focus(); - }); - expect(getByTestId('two')).toHaveFocus(); - expect(getByTestId('two')).to.have.attribute('aria-expanded', 'true'); - fireEvent.keyDown(getByTestId('two'), { key: 'ArrowLeft' }); - expect(getByTestId('two')).to.have.attribute('aria-expanded', 'true'); - }); - }); - }); - - describe('event bindings', () => { - it('should not prevent onClick being fired', () => { - const handleClick = spy(); - - const { getByText } = render( - <SimpleTreeView> - <TreeItem itemId="test" label="test" disabled onClick={handleClick} /> - </SimpleTreeView>, - ); - - fireEvent.click(getByText('test')); - - expect(handleClick.callCount).to.equal(1); - }); - }); - - it('should disable child items when parent item is disabled', () => { - const { getByTestId } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" disabled data-testid="one"> - <TreeItem itemId="two" label="two" data-testid="two" /> - <TreeItem itemId="three" label="three" data-testid="three" /> - </TreeItem> - </SimpleTreeView>, - ); - - expect(getByTestId('one')).to.have.attribute('aria-disabled', 'true'); - expect(getByTestId('two')).to.have.attribute('aria-disabled', 'true'); - expect(getByTestId('three')).to.have.attribute('aria-disabled', 'true'); - }); - }); - - describe('content customisation', () => { - it('should allow a custom ContentComponent', () => { - const mockContent = React.forwardRef((props: {}, ref: React.Ref<HTMLDivElement>) => ( - <div ref={ref}>MOCK CONTENT COMPONENT</div> - )); - const { container } = render( - <SimpleTreeView> - <TreeItem itemId="one" ContentComponent={mockContent as any} /> - </SimpleTreeView>, - ); - expect(container.textContent).to.equal('MOCK CONTENT COMPONENT'); - }); - - it('should allow props to be passed to a custom ContentComponent', () => { - const mockContent = React.forwardRef((props: any, ref: React.Ref<HTMLDivElement>) => ( - <div ref={ref}>{props.customProp}</div> - )); - const { container } = render( - <SimpleTreeView> - <TreeItem - itemId="one" - ContentComponent={mockContent as any} - ContentProps={{ customProp: 'ABCDEF' } as any} - /> - </SimpleTreeView>, - ); - expect(container.textContent).to.equal('ABCDEF'); - }); - }); - - it('should be able to type in an child input', () => { - const { getByRole } = render( - <SimpleTreeView defaultExpandedItems={['one']}> - <TreeItem itemId="one" label="one" data-testid="one"> - <TreeItem - itemId="two" - label={ - <div> - <input type="text" /> - </div> - } - data-testid="two" - /> - </TreeItem> - </SimpleTreeView>, - ); - const input = getByRole('textbox'); - const keydownEvent = createEvent.keyDown(input, { - key: 'a', - }); - - const handlePreventDefault = spy(); - keydownEvent.preventDefault = handlePreventDefault; - fireEvent(input, keydownEvent); - expect(handlePreventDefault.callCount).to.equal(0); - }); - - it('should not focus steal', () => { - let setActiveItemMounted; - // a TreeItem whose mounted state we can control with `setActiveItemMounted` - function ControlledTreeItem(props) { - const [mounted, setMounted] = React.useState(true); - setActiveItemMounted = setMounted; - - if (!mounted) { - return null; - } - return <TreeItem {...props} />; - } - const { getByText, getByTestId, getByRole } = render( - <React.Fragment> - <button type="button">Some focusable element</button> - <SimpleTreeView> - <TreeItem itemId="one" label="one" data-testid="one" /> - <ControlledTreeItem itemId="two" label="two" data-testid="two" /> - </SimpleTreeView> - </React.Fragment>, - ); - - fireEvent.click(getByText('two')); - act(() => { - getByTestId('two').focus(); - }); - - expect(getByTestId('two')).toHaveFocus(); - - act(() => { - getByRole('button').focus(); - }); - - expect(getByRole('button')).toHaveFocus(); - - act(() => { - setActiveItemMounted(false); - }); - act(() => { - setActiveItemMounted(true); - }); - - expect(getByRole('button')).toHaveFocus(); - }); }); diff --git a/packages/x-tree-view/src/TreeItem/TreeItem.tsx b/packages/x-tree-view/src/TreeItem/TreeItem.tsx index 0087510d43da..7f6a19725ab9 100644 --- a/packages/x-tree-view/src/TreeItem/TreeItem.tsx +++ b/packages/x-tree-view/src/TreeItem/TreeItem.tsx @@ -4,18 +4,23 @@ import clsx from 'clsx'; import Collapse from '@mui/material/Collapse'; import { resolveComponentProps, useSlotProps } from '@mui/base/utils'; import useForkRef from '@mui/utils/useForkRef'; -import { alpha, styled, useThemeProps } from '@mui/material/styles'; +import { shouldForwardProp } from '@mui/system/createStyled'; +import { alpha } from '@mui/material/styles'; import { TransitionProps } from '@mui/material/transitions'; import unsupportedProp from '@mui/utils/unsupportedProp'; import elementTypeAcceptingRef from '@mui/utils/elementTypeAcceptingRef'; import { unstable_composeClasses as composeClasses } from '@mui/base'; +import { styled, createUseThemeProps } from '../internals/zero-styled'; import { TreeItemContent } from './TreeItemContent'; import { treeItemClasses, getTreeItemUtilityClass } from './treeItemClasses'; import { TreeItemOwnerState, TreeItemProps } from './TreeItem.types'; import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext'; -import { DefaultTreeViewPlugins } from '../internals/plugins'; +import { DefaultTreeViewPluginSignatures } from '../internals/plugins'; import { TreeViewCollapseIcon, TreeViewExpandIcon } from '../icons'; import { TreeItem2Provider } from '../TreeItem2Provider'; +import { TreeViewItemDepthContext } from '../internals/TreeViewItemDepthContext'; + +const useThemeProps = createUseThemeProps('MuiTreeItem'); const useUtilityClasses = (ownerState: TreeItemOwnerState) => { const { classes } = ownerState; @@ -61,6 +66,7 @@ const StyledTreeItemContent = styled(TreeItemContent, { }, ]; }, + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'indentationAtItemLevel', })<{ ownerState: TreeItemOwnerState }>(({ theme }) => ({ padding: theme.spacing(0.5, 1), borderRadius: theme.shape.borderRadius, @@ -132,16 +138,31 @@ const StyledTreeItemContent = styled(TreeItemContent, { [`& .${treeItemClasses.checkbox}`]: { padding: 0, }, + variants: [ + { + props: { indentationAtItemLevel: true }, + style: { + paddingLeft: `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`, + }, + }, + ], })); const TreeItemGroup = styled(Collapse, { name: 'MuiTreeItem', slot: 'GroupTransition', overridesResolver: (props, styles) => styles.groupTransition, + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'indentationAtItemLevel', })({ margin: 0, padding: 0, - paddingLeft: 12, + paddingLeft: 'var(--TreeView-itemChildrenIndentation)', + variants: [ + { + props: { indentationAtItemLevel: true }, + style: { paddingLeft: 0 }, + }, + ], }); /** @@ -163,8 +184,10 @@ export const TreeItem = React.forwardRef(function TreeItem( runItemPlugins, selection: { multiSelect }, disabledItemsFocusable, + indentationAtItemLevel, instance, - } = useTreeViewContext<DefaultTreeViewPlugins>(); + } = useTreeViewContext<DefaultTreeViewPluginSignatures>(); + const depthContext = React.useContext(TreeViewItemDepthContext); const props = useThemeProps({ props: inProps, name: 'MuiTreeItem' }); @@ -216,6 +239,7 @@ export const TreeItem = React.forwardRef(function TreeItem( focused, selected, disabled, + indentationAtItemLevel, }; const classes = useUtilityClasses(ownerState); @@ -230,6 +254,7 @@ export const TreeItem = React.forwardRef(function TreeItem( in: expanded, component: 'ul', role: 'group', + ...(indentationAtItemLevel ? { indentationAtItemLevel: true } : {}), }, className: classes.groupTransition, }); @@ -329,6 +354,15 @@ export const TreeItem = React.forwardRef(function TreeItem( onBlur={handleBlur} onKeyDown={handleKeyDown} ref={handleRootRef} + style={ + indentationAtItemLevel + ? ({ + ...other.style, + '--TreeView-itemDepth': + typeof depthContext === 'function' ? depthContext(itemId) : depthContext, + } as React.CSSProperties) + : other.style + } > <StyledTreeItemContent as={ContentComponent} @@ -366,7 +400,7 @@ export const TreeItem = React.forwardRef(function TreeItem( TreeItem.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The content of the component. diff --git a/packages/x-tree-view/src/TreeItem/TreeItem.types.ts b/packages/x-tree-view/src/TreeItem/TreeItem.types.ts index d05021398eeb..b9fa0319a12e 100644 --- a/packages/x-tree-view/src/TreeItem/TreeItem.types.ts +++ b/packages/x-tree-view/src/TreeItem/TreeItem.types.ts @@ -103,4 +103,5 @@ export interface TreeItemOwnerState extends TreeItemProps { focused: boolean; selected: boolean; disabled: boolean; + indentationAtItemLevel: boolean; } diff --git a/packages/x-tree-view/src/TreeItem/TreeItemContent.tsx b/packages/x-tree-view/src/TreeItem/TreeItemContent.tsx index 161d3d3afef6..11c31e401cee 100644 --- a/packages/x-tree-view/src/TreeItem/TreeItemContent.tsx +++ b/packages/x-tree-view/src/TreeItem/TreeItemContent.tsx @@ -145,7 +145,7 @@ const TreeItemContent = React.forwardRef(function TreeItemContent( TreeItemContent.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * Override or extend the styles applied to the component. diff --git a/packages/x-tree-view/src/TreeItem/useTreeItemState.ts b/packages/x-tree-view/src/TreeItem/useTreeItemState.ts index f429ac981d20..0da618865f95 100644 --- a/packages/x-tree-view/src/TreeItem/useTreeItemState.ts +++ b/packages/x-tree-view/src/TreeItem/useTreeItemState.ts @@ -1,12 +1,12 @@ import * as React from 'react'; import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext'; -import { DefaultTreeViewPlugins } from '../internals/plugins'; +import { DefaultTreeViewPluginSignatures } from '../internals/plugins'; export function useTreeItemState(itemId: string) { const { instance, selection: { multiSelect, checkboxSelection, disableSelection }, - } = useTreeViewContext<DefaultTreeViewPlugins>(); + } = useTreeViewContext<DefaultTreeViewPluginSignatures>(); const expandable = instance.isItemExpandable(itemId); const expanded = instance.isItemExpanded(itemId); diff --git a/packages/x-tree-view/src/TreeItem2/TreeItem2.tsx b/packages/x-tree-view/src/TreeItem2/TreeItem2.tsx index e2fab41653d9..3f429e6a5860 100644 --- a/packages/x-tree-view/src/TreeItem2/TreeItem2.tsx +++ b/packages/x-tree-view/src/TreeItem2/TreeItem2.tsx @@ -2,21 +2,25 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; import unsupportedProp from '@mui/utils/unsupportedProp'; -import { alpha, styled, useThemeProps } from '@mui/material/styles'; +import { alpha } from '@mui/material/styles'; import Collapse from '@mui/material/Collapse'; import MuiCheckbox, { CheckboxProps } from '@mui/material/Checkbox'; import { useSlotProps } from '@mui/base/utils'; -import { shouldForwardProp } from '@mui/system'; +import { shouldForwardProp } from '@mui/system/createStyled'; import composeClasses from '@mui/utils/composeClasses'; +import { styled, createUseThemeProps } from '../internals/zero-styled'; import { TreeItem2Props, TreeItem2OwnerState } from './TreeItem2.types'; import { unstable_useTreeItem2 as useTreeItem2, UseTreeItem2ContentSlotOwnProps, + UseTreeItem2Status, } from '../useTreeItem2'; -import { getTreeItemUtilityClass, treeItemClasses } from '../TreeItem'; +import { getTreeItemUtilityClass } from '../TreeItem'; import { TreeItem2Icon } from '../TreeItem2Icon'; import { TreeItem2Provider } from '../TreeItem2Provider'; +const useThemeProps = createUseThemeProps('MuiTreeItem2'); + export const TreeItem2Root = styled('li', { name: 'MuiTreeItem2', slot: 'Root', @@ -32,8 +36,9 @@ export const TreeItem2Content = styled('div', { name: 'MuiTreeItem2', slot: 'Content', overridesResolver: (props, styles) => styles.content, - shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'status', -})(({ theme }) => ({ + shouldForwardProp: (prop) => + shouldForwardProp(prop) && prop !== 'status' && prop !== 'indentationAtItemLevel', +})<{ status: UseTreeItem2Status; indentationAtItemLevel?: true }>(({ theme }) => ({ padding: theme.spacing(0.5, 1), borderRadius: theme.shape.borderRadius, width: '100%', @@ -50,12 +55,13 @@ export const TreeItem2Content = styled('div', { backgroundColor: 'transparent', }, }, - [`& .${treeItemClasses.groupTransition}`]: { - margin: 0, - padding: 0, - paddingLeft: 12, - }, variants: [ + { + props: { indentationAtItemLevel: true }, + style: { + paddingLeft: `calc(${theme.spacing(1)} + var(--TreeView-itemChildrenIndentation) * var(--TreeView-itemDepth))`, + }, + }, { props: ({ status }: UseTreeItem2ContentSlotOwnProps) => status.disabled, style: { @@ -134,10 +140,17 @@ export const TreeItem2GroupTransition = styled(Collapse, { name: 'MuiTreeItem2', slot: 'GroupTransition', overridesResolver: (props, styles) => styles.groupTransition, -})({ + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'indentationAtItemLevel', +})<{ indentationAtItemLevel?: true }>({ margin: 0, padding: 0, - paddingLeft: 12, + paddingLeft: 'var(--TreeView-itemChildrenIndentation)', + variants: [ + { + props: { indentationAtItemLevel: true }, + style: { paddingLeft: 0 }, + }, + ], }); export const TreeItem2Checkbox = styled( @@ -250,7 +263,6 @@ export const TreeItem2 = React.forwardRef(function TreeItem2( [classes.disabled]: status.disabled, }), }); - const IconContainer: React.ElementType = slots.iconContainer ?? TreeItem2IconContainer; const iconContainerProps = useSlotProps({ elementType: IconContainer, @@ -306,7 +318,7 @@ export const TreeItem2 = React.forwardRef(function TreeItem2( TreeItem2.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The content of the component. diff --git a/packages/x-tree-view/src/TreeItem2Icon/TreeItem2Icon.tsx b/packages/x-tree-view/src/TreeItem2Icon/TreeItem2Icon.tsx index adce86de3c11..6247cbb4dcab 100644 --- a/packages/x-tree-view/src/TreeItem2Icon/TreeItem2Icon.tsx +++ b/packages/x-tree-view/src/TreeItem2Icon/TreeItem2Icon.tsx @@ -56,7 +56,7 @@ function TreeItem2Icon(props: TreeItem2IconProps) { TreeItem2Icon.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The props used for each component slot. diff --git a/packages/x-tree-view/src/TreeItem2Provider/TreeItem2Provider.tsx b/packages/x-tree-view/src/TreeItem2Provider/TreeItem2Provider.tsx index 29e07517d822..2b5387522cef 100644 --- a/packages/x-tree-view/src/TreeItem2Provider/TreeItem2Provider.tsx +++ b/packages/x-tree-view/src/TreeItem2Provider/TreeItem2Provider.tsx @@ -4,15 +4,15 @@ import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewCon function TreeItem2Provider(props: TreeItem2ProviderProps) { const { children, itemId } = props; - const { wrapItem } = useTreeViewContext<[]>(); + const { wrapItem, instance } = useTreeViewContext<[]>(); - return wrapItem({ children, itemId }); + return wrapItem({ children, itemId, instance }); } TreeItem2Provider.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- children: PropTypes.node, itemId: PropTypes.string.isRequired, diff --git a/packages/x-tree-view/src/TreeView/TreeView.test.tsx b/packages/x-tree-view/src/TreeView/TreeView.test.tsx index ebe98365f4e3..56a029a5e61c 100644 --- a/packages/x-tree-view/src/TreeView/TreeView.test.tsx +++ b/packages/x-tree-view/src/TreeView/TreeView.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer } from '@mui-internal/test-utils'; +import { createRenderer } from '@mui/internal-test-utils'; import { TreeView, treeViewClasses as classes } from '@mui/x-tree-view/TreeView'; import { describeConformance } from 'test/utils/describeConformance'; diff --git a/packages/x-tree-view/src/TreeView/TreeView.tsx b/packages/x-tree-view/src/TreeView/TreeView.tsx index 1d21ae575b05..2149524f39fd 100644 --- a/packages/x-tree-view/src/TreeView/TreeView.tsx +++ b/packages/x-tree-view/src/TreeView/TreeView.tsx @@ -1,11 +1,13 @@ import * as React from 'react'; import PropTypes from 'prop-types'; -import { styled, useThemeProps } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; +import { styled, createUseThemeProps } from '../internals/zero-styled'; import { getTreeViewUtilityClass } from './treeViewClasses'; import { TreeViewProps } from './TreeView.types'; import { SimpleTreeView, SimpleTreeViewRoot } from '../SimpleTreeView'; +const useThemeProps = createUseThemeProps('MuiTreeView'); + const useUtilityClasses = <Multiple extends boolean | undefined>( ownerState: TreeViewProps<Multiple>, ) => { @@ -84,7 +86,7 @@ const TreeView = React.forwardRef(function TreeView< TreeView.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | - // | To update them edit the TypeScript types and run "yarn proptypes" | + // | To update them edit the TypeScript types and run "pnpm proptypes" | // ---------------------------------------------------------------------- /** * The ref object that allows Tree View manipulation. Can be instantiated with `useTreeViewApiRef()`. @@ -137,11 +139,25 @@ TreeView.propTypes = { * Used when the item's expansion is controlled. */ expandedItems: PropTypes.arrayOf(PropTypes.string), + /** + * Unstable features, breaking changes might be introduced. + * For each feature, if the flag is not explicitly set to `true`, + * the feature will be fully disabled and any property / method call will not have any effect. + */ + experimentalFeatures: PropTypes.shape({ + indentationAtItemLevel: PropTypes.bool, + }), /** * This prop is used to help implement the accessibility logic. * If you don't provide this prop. It falls back to a randomly generated id. */ id: PropTypes.string, + /** + * Horizontal indentation between an item and its children. + * Examples: 24, "24px", "2rem", "2em". + * @default 12px + */ + itemChildrenIndentation: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), /** * If `true`, `ctrl` and `shift` will trigger multiselect. * @default false diff --git a/packages/x-tree-view/src/hooks/useTreeItem2Utils/useTreeItem2Utils.tsx b/packages/x-tree-view/src/hooks/useTreeItem2Utils/useTreeItem2Utils.tsx index b76e3fcf96aa..deff0a1d89e5 100644 --- a/packages/x-tree-view/src/hooks/useTreeItem2Utils/useTreeItem2Utils.tsx +++ b/packages/x-tree-view/src/hooks/useTreeItem2Utils/useTreeItem2Utils.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { useTreeViewContext } from '../../internals/TreeViewProvider/useTreeViewContext'; -import { DefaultTreeViewPlugins } from '../../internals/plugins'; +import { DefaultTreeViewPluginSignatures } from '../../internals/plugins'; import type { UseTreeItem2Status } from '../../useTreeItem2'; interface UseTreeItem2Interactions { @@ -14,6 +14,13 @@ interface UseTreeItem2UtilsReturnValue { status: UseTreeItem2Status; } +const isItemExpandable = (reactChildren: React.ReactNode) => { + if (Array.isArray(reactChildren)) { + return reactChildren.length > 0 && reactChildren.some(isItemExpandable); + } + return Boolean(reactChildren); +}; + export const useTreeItem2Utils = ({ itemId, children, @@ -24,10 +31,10 @@ export const useTreeItem2Utils = ({ const { instance, selection: { multiSelect }, - } = useTreeViewContext<DefaultTreeViewPlugins>(); + } = useTreeViewContext<DefaultTreeViewPluginSignatures>(); const status: UseTreeItem2Status = { - expandable: Boolean(Array.isArray(children) ? children.length : children), + expandable: isItemExpandable(children), expanded: instance.isItemExpanded(itemId), focused: instance.isItemFocused(itemId), selected: instance.isItemSelected(itemId), diff --git a/packages/x-tree-view/src/hooks/useTreeViewApiRef.tsx b/packages/x-tree-view/src/hooks/useTreeViewApiRef.tsx index 8ef984c57796..b27410f75737 100644 --- a/packages/x-tree-view/src/hooks/useTreeViewApiRef.tsx +++ b/packages/x-tree-view/src/hooks/useTreeViewApiRef.tsx @@ -1,10 +1,11 @@ import * as React from 'react'; import { TreeViewAnyPluginSignature, TreeViewPublicAPI } from '../internals/models'; -import { DefaultTreeViewPlugins } from '../internals'; +import { DefaultTreeViewPluginSignatures } from '../internals'; /** * Hook that instantiates a [[TreeViewApiRef]]. */ export const useTreeViewApiRef = < - TPlugins extends readonly TreeViewAnyPluginSignature[] = DefaultTreeViewPlugins, ->() => React.useRef(undefined) as React.MutableRefObject<TreeViewPublicAPI<TPlugins> | undefined>; + TSignatures extends readonly TreeViewAnyPluginSignature[] = DefaultTreeViewPluginSignatures, +>() => + React.useRef(undefined) as React.MutableRefObject<TreeViewPublicAPI<TSignatures> | undefined>; diff --git a/packages/x-tree-view/src/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.ts b/packages/x-tree-view/src/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.ts new file mode 100644 index 000000000000..e06f1da34038 --- /dev/null +++ b/packages/x-tree-view/src/internals/TreeViewItemDepthContext/TreeViewItemDepthContext.ts @@ -0,0 +1,10 @@ +import * as React from 'react'; +import { TreeViewItemId } from '../../models'; + +export const TreeViewItemDepthContext = React.createContext< + number | ((itemId: TreeViewItemId) => number) +>(() => -1); + +if (process.env.NODE_ENV !== 'production') { + TreeViewItemDepthContext.displayName = 'TreeViewItemDepthContext'; +} diff --git a/packages/x-tree-view/src/internals/TreeViewItemDepthContext/index.ts b/packages/x-tree-view/src/internals/TreeViewItemDepthContext/index.ts new file mode 100644 index 000000000000..aefec1d8a5c5 --- /dev/null +++ b/packages/x-tree-view/src/internals/TreeViewItemDepthContext/index.ts @@ -0,0 +1 @@ +export { TreeViewItemDepthContext } from './TreeViewItemDepthContext'; diff --git a/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.tsx b/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.tsx index de246ec61ea3..d85512736950 100644 --- a/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.tsx +++ b/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.tsx @@ -8,8 +8,8 @@ import { TreeViewAnyPluginSignature } from '../models'; * * @ignore - do not document. */ -export function TreeViewProvider<TPlugins extends readonly TreeViewAnyPluginSignature[]>( - props: TreeViewProviderProps<TPlugins>, +export function TreeViewProvider<TSignatures extends readonly TreeViewAnyPluginSignature[]>( + props: TreeViewProviderProps<TSignatures>, ) { const { value, children } = props; diff --git a/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts b/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts index 9ff9f5af735e..f0af466f0f21 100644 --- a/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts +++ b/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import { - MergePluginsProperty, + MergeSignaturesProperty, TreeItemWrapper, TreeRootWrapper, TreeViewAnyPluginSignature, @@ -9,17 +9,21 @@ import { TreeViewPublicAPI, } from '../models'; -export type TreeViewContextValue<TPlugins extends readonly TreeViewAnyPluginSignature[]> = - MergePluginsProperty<TPlugins, 'contextValue'> & { - instance: TreeViewInstance<TPlugins>; - publicAPI: TreeViewPublicAPI<TPlugins>; +export type TreeViewItemPluginsRunner = <TProps extends {}>( + props: TProps, +) => Required<TreeViewItemPluginResponse>; + +export type TreeViewContextValue<TSignatures extends readonly TreeViewAnyPluginSignature[]> = + MergeSignaturesProperty<TSignatures, 'contextValue'> & { + instance: TreeViewInstance<TSignatures>; + publicAPI: TreeViewPublicAPI<TSignatures>; rootRef: React.RefObject<HTMLUListElement>; - wrapItem: TreeItemWrapper; - wrapRoot: TreeRootWrapper; - runItemPlugins: <TProps extends {}>(props: TProps) => Required<TreeViewItemPluginResponse>; + wrapItem: TreeItemWrapper<TSignatures>; + wrapRoot: TreeRootWrapper<TSignatures>; + runItemPlugins: TreeViewItemPluginsRunner; }; -export interface TreeViewProviderProps<TPlugins extends readonly TreeViewAnyPluginSignature[]> { - value: TreeViewContextValue<TPlugins>; +export interface TreeViewProviderProps<TSignatures extends readonly TreeViewAnyPluginSignature[]> { + value: TreeViewContextValue<TSignatures>; children: React.ReactNode; } diff --git a/packages/x-tree-view/src/internals/TreeViewProvider/index.ts b/packages/x-tree-view/src/internals/TreeViewProvider/index.ts index 28aff7c61d46..ffee8fb725aa 100644 --- a/packages/x-tree-view/src/internals/TreeViewProvider/index.ts +++ b/packages/x-tree-view/src/internals/TreeViewProvider/index.ts @@ -1,2 +1,6 @@ export { TreeViewProvider } from './TreeViewProvider'; -export type { TreeViewProviderProps, TreeViewContextValue } from './TreeViewProvider.types'; +export type { + TreeViewProviderProps, + TreeViewContextValue, + TreeViewItemPluginsRunner, +} from './TreeViewProvider.types'; diff --git a/packages/x-tree-view/src/internals/TreeViewProvider/useTreeViewContext.ts b/packages/x-tree-view/src/internals/TreeViewProvider/useTreeViewContext.ts index 8da83b9b56eb..62fbce3ad739 100644 --- a/packages/x-tree-view/src/internals/TreeViewProvider/useTreeViewContext.ts +++ b/packages/x-tree-view/src/internals/TreeViewProvider/useTreeViewContext.ts @@ -3,8 +3,8 @@ import { TreeViewAnyPluginSignature } from '../models'; import { TreeViewContext } from './TreeViewContext'; import { TreeViewContextValue } from './TreeViewProvider.types'; -export const useTreeViewContext = <TPlugins extends readonly TreeViewAnyPluginSignature[]>() => { - const context = React.useContext(TreeViewContext) as TreeViewContextValue<TPlugins>; +export const useTreeViewContext = <TSignatures extends readonly TreeViewAnyPluginSignature[]>() => { + const context = React.useContext(TreeViewContext) as TreeViewContextValue<TSignatures>; if (context == null) { throw new Error( [ diff --git a/packages/x-tree-view/src/internals/corePlugins/corePlugins.ts b/packages/x-tree-view/src/internals/corePlugins/corePlugins.ts index feb26ae78c80..0d55e29829ab 100644 --- a/packages/x-tree-view/src/internals/corePlugins/corePlugins.ts +++ b/packages/x-tree-view/src/internals/corePlugins/corePlugins.ts @@ -1,5 +1,5 @@ import { useTreeViewInstanceEvents } from './useTreeViewInstanceEvents'; -import { ConvertPluginsIntoSignatures, MergePlugins } from '../models'; +import { ConvertPluginsIntoSignatures } from '../models'; /** * Internal plugins that create the tools used by the other plugins. @@ -7,6 +7,6 @@ import { ConvertPluginsIntoSignatures, MergePlugins } from '../models'; */ export const TREE_VIEW_CORE_PLUGINS = [useTreeViewInstanceEvents] as const; -export type TreeViewCorePluginsSignature = MergePlugins< - ConvertPluginsIntoSignatures<typeof TREE_VIEW_CORE_PLUGINS> +export type TreeViewCorePluginSignatures = ConvertPluginsIntoSignatures< + typeof TREE_VIEW_CORE_PLUGINS >; diff --git a/packages/x-tree-view/src/internals/corePlugins/index.ts b/packages/x-tree-view/src/internals/corePlugins/index.ts index 556277c739ce..55cb778e2bd9 100644 --- a/packages/x-tree-view/src/internals/corePlugins/index.ts +++ b/packages/x-tree-view/src/internals/corePlugins/index.ts @@ -1,2 +1,2 @@ export { TREE_VIEW_CORE_PLUGINS } from './corePlugins'; -export type { TreeViewCorePluginsSignature } from './corePlugins'; +export type { TreeViewCorePluginSignatures } from './corePlugins'; diff --git a/packages/x-tree-view/src/internals/index.ts b/packages/x-tree-view/src/internals/index.ts index c1ddf24a8274..752818a77fa0 100644 --- a/packages/x-tree-view/src/internals/index.ts +++ b/packages/x-tree-view/src/internals/index.ts @@ -7,14 +7,15 @@ export type { TreeViewPlugin, TreeViewPluginSignature, ConvertPluginsIntoSignatures, - MergePluginsProperty, + MergeSignaturesProperty, TreeViewPublicAPI, + TreeViewExperimentalFeatures, } from './models'; // Plugins export { DEFAULT_TREE_VIEW_PLUGINS } from './plugins/defaultPlugins'; export type { - DefaultTreeViewPlugins, + DefaultTreeViewPluginSignatures, DefaultTreeViewPluginSlots, DefaultTreeViewPluginSlotProps, } from './plugins/defaultPlugins'; diff --git a/packages/x-tree-view/src/internals/models/helpers.ts b/packages/x-tree-view/src/internals/models/helpers.ts index e3ee527a4d1f..f404e670cd90 100644 --- a/packages/x-tree-view/src/internals/models/helpers.ts +++ b/packages/x-tree-view/src/internals/models/helpers.ts @@ -22,32 +22,31 @@ export type OptionalIfEmpty<A extends string, B> = keyof B extends never ? Partial<Record<A, B>> : Record<A, B>; -export type MergePluginsProperty< - TPlugins extends readonly any[], +export type MergeSignaturesProperty< + TSignatures extends readonly any[], TProperty extends keyof TreeViewAnyPluginSignature, -> = TPlugins extends readonly [plugin: infer P, ...otherPlugin: infer R] +> = TSignatures extends readonly [plugin: infer P, ...otherPlugin: infer R] ? P extends TreeViewAnyPluginSignature - ? P[TProperty] & MergePluginsProperty<R, TProperty> + ? P[TProperty] & MergeSignaturesProperty<R, TProperty> : {} : {}; -export type ConvertPluginsIntoSignatures<TPlugins extends readonly any[]> = - TPlugins extends readonly [plugin: infer P, ...otherPlugin: infer R] - ? P extends TreeViewPlugin<infer TSignature> - ? [TSignature, ...ConvertPluginsIntoSignatures<R>] - : ConvertPluginsIntoSignatures<R> - : []; +export type ConvertPluginsIntoSignatures< + TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[], +> = TPlugins extends readonly [plugin: infer TPlugin, ...otherPlugin: infer R] + ? R extends readonly TreeViewPlugin<any>[] + ? TPlugin extends TreeViewPlugin<infer TSignature> + ? readonly [TSignature, ...ConvertPluginsIntoSignatures<R>] + : never + : never + : []; -export interface MergePlugins<TPlugins extends readonly any[]> { - state: MergePluginsProperty<TPlugins, 'state'>; - instance: MergePluginsProperty<TPlugins, 'instance'>; - publicAPI: MergePluginsProperty<TPlugins, 'publicAPI'>; - params: MergePluginsProperty<TPlugins, 'params'>; - defaultizedParams: MergePluginsProperty<TPlugins, 'defaultizedParams'>; - dependantPlugins: MergePluginsProperty<TPlugins, 'dependantPlugins'>; - contextValue: MergePluginsProperty<TPlugins, 'contextValue'>; - slots: MergePluginsProperty<TPlugins, 'slots'>; - slotProps: MergePluginsProperty<TPlugins, 'slotProps'>; - events: MergePluginsProperty<TPlugins, 'events'>; - models: MergePluginsProperty<TPlugins, 'models'>; -} +export type ConvertSignaturesIntoPlugins< + TSignatures extends readonly TreeViewAnyPluginSignature[], +> = TSignatures extends readonly [signature: infer TSignature, ...otherSignatures: infer R] + ? R extends readonly TreeViewAnyPluginSignature[] + ? TSignature extends TreeViewAnyPluginSignature + ? readonly [TreeViewPlugin<TSignature>, ...ConvertSignaturesIntoPlugins<R>] + : never + : never + : []; diff --git a/packages/x-tree-view/src/internals/models/plugin.ts b/packages/x-tree-view/src/internals/models/plugin.ts index 009c43d511f7..fd26dd4c42d7 100644 --- a/packages/x-tree-view/src/internals/models/plugin.ts +++ b/packages/x-tree-view/src/internals/models/plugin.ts @@ -1,9 +1,9 @@ import * as React from 'react'; import { EventHandlers } from '@mui/base/utils'; -import { TreeViewModel } from './treeView'; -import type { MergePluginsProperty, OptionalIfEmpty } from './helpers'; +import { TreeViewExperimentalFeatures, TreeViewInstance, TreeViewModel } from './treeView'; +import type { MergeSignaturesProperty, OptionalIfEmpty } from './helpers'; import { TreeViewEventLookupElement } from './events'; -import type { TreeViewCorePluginsSignature } from '../corePlugins'; +import type { TreeViewCorePluginSignatures } from '../corePlugins'; import { TreeViewItemId } from '../../models'; export interface TreeViewPluginOptions<TSignature extends TreeViewAnyPluginSignature> { @@ -12,6 +12,7 @@ export interface TreeViewPluginOptions<TSignature extends TreeViewAnyPluginSigna state: TreeViewUsedState<TSignature>; slots: TSignature['slots']; slotProps: TSignature['slotProps']; + experimentalFeatures: TreeViewUsedExperimentalFeatures<TSignature>; models: TreeViewUsedModels<TSignature>; setState: React.Dispatch<React.SetStateAction<TreeViewUsedState<TSignature>>>; rootRef: React.RefObject<HTMLUListElement>; @@ -45,6 +46,7 @@ export type TreeViewPluginSignature< slots?: { [key in keyof T['slots']]: React.ElementType }; slotProps?: { [key in keyof T['slotProps']]: {} | (() => {}) }; modelNames?: keyof T['defaultizedParams']; + experimentalFeatures?: string; dependantPlugins?: readonly TreeViewAnyPluginSignature[]; }, > = { @@ -64,6 +66,7 @@ export type TreeViewPluginSignature< >; } : {}; + experimentalFeatures: T['experimentalFeatures']; dependantPlugins: T extends { dependantPlugins: Array<any> } ? T['dependantPlugins'] : []; }; @@ -78,24 +81,25 @@ export type TreeViewAnyPluginSignature = { slots: any; slotProps: any; models: any; + experimentalFeatures: any; publicAPI: any; }; type TreeViewUsedPlugins<TSignature extends TreeViewAnyPluginSignature> = [ - TreeViewCorePluginsSignature, + ...TreeViewCorePluginSignatures, ...TSignature['dependantPlugins'], ]; export type TreeViewUsedParams<TSignature extends TreeViewAnyPluginSignature> = - TSignature['params'] & MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'params'>; + TSignature['params'] & MergeSignaturesProperty<TreeViewUsedPlugins<TSignature>, 'params'>; type TreeViewUsedDefaultizedParams<TSignature extends TreeViewAnyPluginSignature> = TSignature['defaultizedParams'] & - MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'defaultizedParams'>; + MergeSignaturesProperty<TreeViewUsedPlugins<TSignature>, 'defaultizedParams'>; export type TreeViewUsedInstance<TSignature extends TreeViewAnyPluginSignature> = TSignature['instance'] & - MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'instance'> & { + MergeSignaturesProperty<TreeViewUsedPlugins<TSignature>, 'instance'> & { /** * Private property only defined in TypeScript to be able to access the plugin signature from the instance object. */ @@ -103,7 +107,10 @@ export type TreeViewUsedInstance<TSignature extends TreeViewAnyPluginSignature> }; type TreeViewUsedState<TSignature extends TreeViewAnyPluginSignature> = TSignature['state'] & - MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'state'>; + MergeSignaturesProperty<TreeViewUsedPlugins<TSignature>, 'state'>; + +type TreeViewUsedExperimentalFeatures<TSignature extends TreeViewAnyPluginSignature> = + TreeViewExperimentalFeatures<[TSignature, ...TSignature['dependantPlugins']]>; type RemoveSetValue<Models extends Record<string, TreeViewModel<any>>> = { [K in keyof Models]: Omit<Models[K], 'setValue'>; @@ -111,10 +118,10 @@ type RemoveSetValue<Models extends Record<string, TreeViewModel<any>>> = { export type TreeViewUsedModels<TSignature extends TreeViewAnyPluginSignature> = TSignature['models'] & - RemoveSetValue<MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'models'>>; + RemoveSetValue<MergeSignaturesProperty<TreeViewUsedPlugins<TSignature>, 'models'>>; export type TreeViewUsedEvents<TSignature extends TreeViewAnyPluginSignature> = - TSignature['events'] & MergePluginsProperty<TreeViewUsedPlugins<TSignature>, 'events'>; + TSignature['events'] & MergeSignaturesProperty<TreeViewUsedPlugins<TSignature>, 'events'>; export interface TreeViewItemPluginOptions<TProps extends {}> extends TreeViewItemPluginResponse { props: TProps; @@ -135,12 +142,16 @@ export type TreeViewItemPlugin<TProps extends {}> = ( options: TreeViewItemPluginOptions<TProps>, ) => void | TreeViewItemPluginResponse; -export type TreeItemWrapper = (params: { +export type TreeItemWrapper<TSignatures extends readonly TreeViewAnyPluginSignature[]> = (params: { itemId: TreeViewItemId; children: React.ReactNode; + instance: TreeViewInstance<TSignatures>; }) => React.ReactNode; -export type TreeRootWrapper = (params: { children: React.ReactNode }) => React.ReactNode; +export type TreeRootWrapper<TSignatures extends readonly TreeViewAnyPluginSignature[]> = (params: { + children: React.ReactNode; + instance: TreeViewInstance<TSignatures>; +}) => React.ReactNode; export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = { (options: TreeViewPluginOptions<TSignature>): TreeViewResponse<TSignature>; @@ -156,11 +167,11 @@ export type TreeViewPlugin<TSignature extends TreeViewAnyPluginSignature> = { * @param {{ nodeId: TreeViewItemId; children: React.ReactNode; }} params The params of the item. * @returns {React.ReactNode} The wrapped item. */ - wrapItem?: TreeItemWrapper; + wrapItem?: TreeItemWrapper<[TSignature, ...TSignature['dependantPlugins']]>; /** * Render function used to add React wrappers around the TreeView. * @param {{ children: React.ReactNode; }} params The params of the root. * @returns {React.ReactNode} The wrapped root. */ - wrapRoot?: TreeRootWrapper; + wrapRoot?: TreeRootWrapper<[TSignature, ...TSignature['dependantPlugins']]>; }; diff --git a/packages/x-tree-view/src/internals/models/treeView.ts b/packages/x-tree-view/src/internals/models/treeView.ts index 552dd29bf7e2..e513e0f8bff5 100644 --- a/packages/x-tree-view/src/internals/models/treeView.ts +++ b/packages/x-tree-view/src/internals/models/treeView.ts @@ -1,5 +1,6 @@ import type { TreeViewAnyPluginSignature } from './plugin'; -import type { MergePluginsProperty } from './helpers'; +import type { MergeSignaturesProperty } from './helpers'; +import type { TreeViewCorePluginSignatures } from '../corePlugins'; export interface TreeViewItemMeta { id: string; @@ -8,7 +9,11 @@ export interface TreeViewItemMeta { expandable: boolean; disabled: boolean; /** - * Only defined for `RichTreeView`. + * Only defined for `RichTreeView` and `RichTreeViewPro`. + */ + depth?: number; + /** + * Only defined for `RichTreeView` and `RichTreeViewPro`. */ label?: string; } @@ -20,7 +25,11 @@ export interface TreeViewModel<TValue> { } export type TreeViewInstance<TSignatures extends readonly TreeViewAnyPluginSignature[]> = - MergePluginsProperty<TSignatures, 'instance'>; + MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'instance'>; export type TreeViewPublicAPI<TSignatures extends readonly TreeViewAnyPluginSignature[]> = - MergePluginsProperty<TSignatures, 'publicAPI'>; + MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'publicAPI'>; + +export type TreeViewExperimentalFeatures< + TSignatures extends readonly TreeViewAnyPluginSignature[], +> = { [key in MergeSignaturesProperty<TSignatures, 'experimentalFeatures'>]?: boolean }; diff --git a/packages/x-tree-view/src/internals/plugins/defaultPlugins.ts b/packages/x-tree-view/src/internals/plugins/defaultPlugins.ts index f737c5dcc8c9..c6b376aac744 100644 --- a/packages/x-tree-view/src/internals/plugins/defaultPlugins.ts +++ b/packages/x-tree-view/src/internals/plugins/defaultPlugins.ts @@ -5,7 +5,7 @@ import { useTreeViewSelection, UseTreeViewSelectionParameters } from './useTreeV import { useTreeViewFocus, UseTreeViewFocusParameters } from './useTreeViewFocus'; import { useTreeViewKeyboardNavigation } from './useTreeViewKeyboardNavigation'; import { useTreeViewIcons, UseTreeViewIconsParameters } from './useTreeViewIcons'; -import { ConvertPluginsIntoSignatures, MergePluginsProperty } from '../models'; +import { ConvertPluginsIntoSignatures, MergeSignaturesProperty } from '../models'; export const DEFAULT_TREE_VIEW_PLUGINS = [ useTreeViewId, @@ -17,12 +17,17 @@ export const DEFAULT_TREE_VIEW_PLUGINS = [ useTreeViewIcons, ] as const; -export type DefaultTreeViewPlugins = ConvertPluginsIntoSignatures<typeof DEFAULT_TREE_VIEW_PLUGINS>; +export type DefaultTreeViewPluginSignatures = ConvertPluginsIntoSignatures< + typeof DEFAULT_TREE_VIEW_PLUGINS +>; -export type DefaultTreeViewPluginSlots = MergePluginsProperty<DefaultTreeViewPlugins, 'slots'>; +export type DefaultTreeViewPluginSlots = MergeSignaturesProperty< + DefaultTreeViewPluginSignatures, + 'slots' +>; -export type DefaultTreeViewPluginSlotProps = MergePluginsProperty< - DefaultTreeViewPlugins, +export type DefaultTreeViewPluginSlotProps = MergeSignaturesProperty< + DefaultTreeViewPluginSignatures, 'slotProps' >; diff --git a/packages/x-tree-view/src/internals/plugins/index.ts b/packages/x-tree-view/src/internals/plugins/index.ts index 8b18e513cab0..75445ff5057c 100644 --- a/packages/x-tree-view/src/internals/plugins/index.ts +++ b/packages/x-tree-view/src/internals/plugins/index.ts @@ -1,2 +1,2 @@ export { DEFAULT_TREE_VIEW_PLUGINS } from './defaultPlugins'; -export type { DefaultTreeViewPlugins } from './defaultPlugins'; +export type { DefaultTreeViewPluginSignatures } from './defaultPlugins'; diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.test.tsx b/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.test.tsx index f0b18b58c1f5..418a8c459674 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.test.tsx +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.test.tsx @@ -3,7 +3,7 @@ import { expect } from 'chai'; import { spy } from 'sinon'; import { describeTreeView } from 'test/utils/tree-view/describeTreeView'; import { UseTreeViewExpansionSignature } from '@mui/x-tree-view/internals'; -import { act, fireEvent } from '@mui-internal/test-utils'; +import { act, fireEvent } from '@mui/internal-test-utils'; import { TreeItem2, TreeItem2Props } from '@mui/x-tree-view/TreeItem2'; import { UseTreeItem2ContentSlotOwnProps } from '@mui/x-tree-view/useTreeItem2'; import { useTreeItem2Utils } from '@mui/x-tree-view/hooks'; @@ -22,7 +22,7 @@ describeTreeView<[UseTreeViewExpansionSignature]>( }); expect(response.isItemExpanded('1')).to.equal(false); - expect(response.getAllItemRoots()).to.have.length(2); + expect(response.getAllTreeItemIds()).to.deep.equal(['1', '2']); }); it('should use the default state when defined', () => { @@ -32,7 +32,7 @@ describeTreeView<[UseTreeViewExpansionSignature]>( }); expect(response.isItemExpanded('1')).to.equal(true); - expect(response.getAllItemRoots()).to.have.length(3); + expect(response.getAllTreeItemIds()).to.deep.equal(['1', '1.1', '2']); }); it('should use the controlled state when defined', () => { diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.ts index 3b993255789e..d463f24e85bb 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.ts @@ -18,7 +18,7 @@ export const useTreeViewExpansion: TreeViewPlugin<UseTreeViewExpansionSignature> return temp; }, [models.expandedItems.value]); - const setExpandedItems = (event: React.SyntheticEvent, value: string[]) => { + const setExpandedItems = (event: React.SyntheticEvent, value: TreeViewItemId[]) => { params.onExpandedItemsChange?.(event, value); models.expandedItems.setControlledValue(value); }; @@ -33,13 +33,15 @@ export const useTreeViewExpansion: TreeViewPlugin<UseTreeViewExpansionSignature> [instance], ); - const toggleItemExpansion = useEventCallback((event: React.SyntheticEvent, itemId: string) => { - const isExpandedBefore = instance.isItemExpanded(itemId); - instance.setItemExpansion(event, itemId, !isExpandedBefore); - }); + const toggleItemExpansion = useEventCallback( + (event: React.SyntheticEvent, itemId: TreeViewItemId) => { + const isExpandedBefore = instance.isItemExpanded(itemId); + instance.setItemExpansion(event, itemId, !isExpandedBefore); + }, + ); const setItemExpansion = useEventCallback( - (event: React.SyntheticEvent, itemId: string, isExpanded: boolean) => { + (event: React.SyntheticEvent, itemId: TreeViewItemId, isExpanded: boolean) => { const isExpandedBefore = instance.isItemExpanded(itemId); if (isExpandedBefore === isExpanded) { return; @@ -60,7 +62,7 @@ export const useTreeViewExpansion: TreeViewPlugin<UseTreeViewExpansionSignature> }, ); - const expandAllSiblings = (event: React.KeyboardEvent, itemId: string) => { + const expandAllSiblings = (event: React.KeyboardEvent, itemId: TreeViewItemId) => { const itemMeta = instance.getItemMeta(itemId); const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId); diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.ts index 0116e7d722eb..1eabf3ce9daf 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewExpansion/useTreeViewExpansion.types.ts @@ -1,6 +1,7 @@ import * as React from 'react'; import { DefaultizedProps, TreeViewPluginSignature } from '../../models'; import { UseTreeViewItemsSignature } from '../useTreeViewItems'; +import { TreeViewItemId } from '../../../models'; export interface UseTreeViewExpansionPublicAPI { /** @@ -13,10 +14,33 @@ export interface UseTreeViewExpansionPublicAPI { } export interface UseTreeViewExpansionInstance extends UseTreeViewExpansionPublicAPI { - isItemExpanded: (itemId: string) => boolean; - isItemExpandable: (itemId: string) => boolean; - toggleItemExpansion: (event: React.SyntheticEvent, itemId: string) => void; - expandAllSiblings: (event: React.KeyboardEvent, itemId: string) => void; + /** + * Check if an item is expanded. + * @param {TreeViewItemId} itemId The id of the item to check. + * @returns {boolean} `true` if the item is expanded, `false` otherwise. + */ + isItemExpanded: (itemId: TreeViewItemId) => boolean; + /** + * Check if an item is expandable. + * Currently, an item is expandable if it has children. + * In the future, the user should be able to flag an item as expandable even if it has no loaded children to support children lazy loading. + * @param {TreeViewItemId} itemId The id of the item to check. + * @returns {boolean} `true` if the item can be expanded, `false` otherwise. + */ + isItemExpandable: (itemId: TreeViewItemId) => boolean; + /** + * Toggle the current expansion of an item. + * If it is expanded, it will be collapsed, and vice versa. + * @param {React.SyntheticEvent} event The UI event that triggered the change. + * @param {TreeViewItemId} itemId The id of the item to toggle. + */ + toggleItemExpansion: (event: React.SyntheticEvent, itemId: TreeViewItemId) => void; + /** + * Expand all the siblings (i.e.: the items that have the same parent) of a given item. + * @param {React.SyntheticEvent} event The UI event that triggered the change. + * @param {TreeViewItemId} itemId The id of the item whose siblings will be expanded. + */ + expandAllSiblings: (event: React.KeyboardEvent, itemId: TreeViewItemId) => void; } export interface UseTreeViewExpansionParameters { diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.test.tsx b/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.test.tsx index 4bb14892757c..6bd9dc244893 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.test.tsx +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.test.tsx @@ -1,6 +1,7 @@ +import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { act, fireEvent } from '@mui-internal/test-utils'; +import { act, fireEvent } from '@mui/internal-test-utils'; import { describeTreeView } from 'test/utils/tree-view/describeTreeView'; import { UseTreeViewFocusSignature, @@ -14,176 +15,231 @@ import { */ describeTreeView< [UseTreeViewFocusSignature, UseTreeViewSelectionSignature, UseTreeViewItemsSignature] ->('useTreeViewFocus plugin', ({ render }) => { - describe('basic behavior', () => { - it('should allow to focus an item', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - }); +>( + 'useTreeViewFocus plugin', + ({ render, renderFromJSX, TreeItemComponent, treeViewComponentName, TreeViewComponent }) => { + describe('basic behavior', () => { + it('should allow to focus an item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); - fireEvent.focus(response.getItemRoot('2')); - expect(response.getFocusedItemId()).to.equal('2'); + fireEvent.focus(response.getItemRoot('2')); + expect(response.getFocusedItemId()).to.equal('2'); - fireEvent.focus(response.getItemRoot('1')); - expect(response.getFocusedItemId()).to.equal('1'); - }); - - it('should move the focus when the focused item is removed', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], + fireEvent.focus(response.getItemRoot('1')); + expect(response.getFocusedItemId()).to.equal('1'); }); - fireEvent.focus(response.getItemRoot('2')); - expect(response.getFocusedItemId()).to.equal('2'); + it('should move the focus when the focused item is removed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); - response.setItems([{ id: '1' }]); - expect(response.getFocusedItemId()).to.equal('1'); - }); - }); + fireEvent.focus(response.getItemRoot('2')); + expect(response.getFocusedItemId()).to.equal('2'); - describe('tabIndex HTML attribute', () => { - it('should set tabIndex={0} on the first item if none are selected', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], + response.setItems([{ id: '1' }]); + expect(response.getFocusedItemId()).to.equal('1'); }); - - expect(response.getItemRoot('1').tabIndex).to.equal(0); - expect(response.getItemRoot('2').tabIndex).to.equal(-1); }); - it('should set tabIndex={0} on the selected item (single selection)', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - selectedItems: '2', - }); - - expect(response.getItemRoot('1').tabIndex).to.equal(-1); - expect(response.getItemRoot('2').tabIndex).to.equal(0); - }); + describe('tabIndex HTML attribute', () => { + it('should set tabIndex={0} on the first item if none are selected', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); - it('should set tabIndex={0} on the first selected item (multi selection)', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }, { id: '3' }], - selectedItems: ['2', '3'], - multiSelect: true, + expect(response.getItemRoot('1').tabIndex).to.equal(0); + expect(response.getItemRoot('2').tabIndex).to.equal(-1); }); - expect(response.getItemRoot('1').tabIndex).to.equal(-1); - expect(response.getItemRoot('2').tabIndex).to.equal(0); - expect(response.getItemRoot('3').tabIndex).to.equal(-1); - }); + it('should set tabIndex={0} on the selected item (single selection)', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + selectedItems: '2', + }); - it('should set tabIndex={0} on the first item if the selected item is not visible', () => { - const response = render({ - items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }] }], - selectedItems: '2.1', + expect(response.getItemRoot('1').tabIndex).to.equal(-1); + expect(response.getItemRoot('2').tabIndex).to.equal(0); }); - expect(response.getItemRoot('1').tabIndex).to.equal(0); - expect(response.getItemRoot('2').tabIndex).to.equal(-1); - }); + it('should set tabIndex={0} on the first selected item (multi selection)', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }], + selectedItems: ['2', '3'], + multiSelect: true, + }); - it('should set tabIndex={0} on the first item if the no selected item is visible', () => { - const response = render({ - items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }, { id: '2.2' }] }], - selectedItems: ['2.1', '2.2'], - multiSelect: true, + expect(response.getItemRoot('1').tabIndex).to.equal(-1); + expect(response.getItemRoot('2').tabIndex).to.equal(0); + expect(response.getItemRoot('3').tabIndex).to.equal(-1); }); - expect(response.getItemRoot('1').tabIndex).to.equal(0); - expect(response.getItemRoot('2').tabIndex).to.equal(-1); - }); - }); - - describe('focusItem api method', () => { - it('should focus the item', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - }); + it('should set tabIndex={0} on the first item if the selected item is not visible', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }] }], + selectedItems: '2.1', + }); - act(() => { - response.apiRef.current.focusItem({} as any, '2'); + expect(response.getItemRoot('1').tabIndex).to.equal(0); + expect(response.getItemRoot('2').tabIndex).to.equal(-1); }); - expect(response.getFocusedItemId()).to.equal('2'); - }); - - it('should not focus item if parent is collapsed', () => { - const response = render({ - items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }] }], - }); + it('should set tabIndex={0} on the first item if the no selected item is visible', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }, { id: '2.2' }] }], + selectedItems: ['2.1', '2.2'], + multiSelect: true, + }); - act(() => { - response.apiRef.current.focusItem({} as any, '2.1'); + expect(response.getItemRoot('1').tabIndex).to.equal(0); + expect(response.getItemRoot('2').tabIndex).to.equal(-1); }); - - expect(response.getFocusedItemId()).to.equal(null); }); - }); - describe('onItemFocus prop', () => { - it('should be called when an item is focused', () => { - const onItemFocus = spy(); + describe('focusItem api method', () => { + it('should focus the item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); - const response = render({ - items: [{ id: '1' }], - onItemFocus, - }); + act(() => { + response.apiRef.current.focusItem({} as any, '2'); + }); - act(() => { - response.getItemRoot('1').focus(); + expect(response.getFocusedItemId()).to.equal('2'); }); - expect(onItemFocus.callCount).to.equal(1); - expect(onItemFocus.lastCall.lastArg).to.equal('1'); - }); - }); - - describe('disabledItemsFocusable prop', () => { - describe('disabledItemFocusable={false}', () => { - it('should prevent focus by mouse', () => { + it('should not focus item if parent is collapsed', () => { const response = render({ - items: [{ id: '1', disabled: true }], - disabledItemsFocusable: false, + items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }] }], + }); + + act(() => { + response.apiRef.current.focusItem({} as any, '2.1'); }); - fireEvent.click(response.getItemContent('1')); expect(response.getFocusedItemId()).to.equal(null); }); + }); + + describe('onItemFocus prop', () => { + it('should be called when an item is focused', () => { + const onItemFocus = spy(); - it('should tab tabIndex={-1} on the disabled item and tabIndex={0} on the first non-disabled item', () => { const response = render({ - items: [{ id: '1', disabled: true }, { id: '2' }, { id: '3' }], - disabledItemsFocusable: false, + items: [{ id: '1' }], + onItemFocus, }); - expect(response.getItemRoot('1').tabIndex).to.equal(-1); - expect(response.getItemRoot('2').tabIndex).to.equal(0); - expect(response.getItemRoot('3').tabIndex).to.equal(-1); + act(() => { + response.getItemRoot('1').focus(); + }); + + expect(onItemFocus.callCount).to.equal(1); + expect(onItemFocus.lastCall.lastArg).to.equal('1'); }); }); - describe('disabledItemFocusable={true}', () => { - it('should prevent focus by mouse', () => { - const response = render({ - items: [{ id: '1', disabled: true }], - disabledItemsFocusable: true, + describe('disabledItemsFocusable prop', () => { + describe('disabledItemFocusable={false}', () => { + it('should prevent focus by mouse', () => { + const response = render({ + items: [{ id: '1', disabled: true }], + disabledItemsFocusable: false, + }); + + fireEvent.click(response.getItemContent('1')); + expect(response.getFocusedItemId()).to.equal(null); }); - fireEvent.click(response.getItemContent('1')); - expect(response.getFocusedItemId()).to.equal(null); + it('should tab tabIndex={-1} on the disabled item and tabIndex={0} on the first non-disabled item', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }, { id: '3' }], + disabledItemsFocusable: false, + }); + + expect(response.getItemRoot('1').tabIndex).to.equal(-1); + expect(response.getItemRoot('2').tabIndex).to.equal(0); + expect(response.getItemRoot('3').tabIndex).to.equal(-1); + }); }); - it('should tab tabIndex={0} on the disabled item and tabIndex={-1} on the other items', () => { - const response = render({ - items: [{ id: '1', disabled: true }, { id: '2' }, { id: '3' }], - disabledItemsFocusable: true, + describe('disabledItemFocusable={true}', () => { + it('should prevent focus by mouse', () => { + const response = render({ + items: [{ id: '1', disabled: true }], + disabledItemsFocusable: true, + }); + + fireEvent.click(response.getItemContent('1')); + expect(response.getFocusedItemId()).to.equal(null); }); - expect(response.getItemRoot('1').tabIndex).to.equal(0); - expect(response.getItemRoot('2').tabIndex).to.equal(-1); - expect(response.getItemRoot('3').tabIndex).to.equal(-1); + it('should tab tabIndex={0} on the disabled item and tabIndex={-1} on the other items', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }, { id: '3' }], + disabledItemsFocusable: true, + }); + + expect(response.getItemRoot('1').tabIndex).to.equal(0); + expect(response.getItemRoot('2').tabIndex).to.equal(-1); + expect(response.getItemRoot('3').tabIndex).to.equal(-1); + }); }); }); - }); -}); + + it('should not error when component state changes', () => { + const items = [{ id: '1', children: [{ id: '1.1' }] }]; + const getItemLabel = (item) => item.id; + + function MyComponent() { + const [, setState] = React.useState(1); + + if (treeViewComponentName === 'SimpleTreeView') { + return ( + <TreeViewComponent + defaultExpandedItems={['1']} + onItemFocus={() => { + setState(Math.random); + }} + > + <TreeItemComponent itemId="1" data-testid="1"> + <TreeItemComponent itemId="1.1" data-testid="1.1" /> + </TreeItemComponent> + </TreeViewComponent> + ); + } + + return ( + <TreeViewComponent + items={items} + defaultExpandedItems={['1']} + onItemFocus={() => { + setState(Math.random); + }} + slotProps={{ + item: (ownerState) => ({ 'data-testid': ownerState.itemId }) as any, + }} + getItemLabel={getItemLabel} + /> + ); + } + + const response = renderFromJSX(<MyComponent />); + + fireEvent.focus(response.getItemRoot('1')); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('1.1'); + + fireEvent.keyDown(response.getItemRoot('1.1'), { key: 'ArrowUp' }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('1.1'); + }); + }, +); diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.ts index 698d7fffa06b..2bec87a29de3 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.ts @@ -8,22 +8,20 @@ import { useInstanceEventHandler } from '../../hooks/useInstanceEventHandler'; import { getActiveElement } from '../../utils/utils'; import { getFirstNavigableItem } from '../../utils/tree'; import { MuiCancellableEvent } from '../../models/MuiCancellableEvent'; +import { convertSelectedItemsToArray } from '../useTreeViewSelection/useTreeViewSelection.utils'; -const useTabbableItemId = ( +const useDefaultFocusableItemId = ( instance: TreeViewUsedInstance<UseTreeViewFocusSignature>, selectedItems: string | string[] | null, -) => { - const isItemVisible = (itemId: string) => { +): string => { + let tabbableItemId = convertSelectedItemsToArray(selectedItems).find((itemId) => { + if (!instance.isItemNavigable(itemId)) { + return false; + } + const itemMeta = instance.getItemMeta(itemId); return itemMeta && (itemMeta.parentId == null || instance.isItemExpanded(itemMeta.parentId)); - }; - - let tabbableItemId: string | null | undefined; - if (Array.isArray(selectedItems)) { - tabbableItemId = selectedItems.find(isItemVisible); - } else if (selectedItems != null && isItemVisible(selectedItems)) { - tabbableItemId = selectedItems; - } + }); if (tabbableItemId == null) { tabbableItemId = getFirstNavigableItem(instance); @@ -40,7 +38,7 @@ export const useTreeViewFocus: TreeViewPlugin<UseTreeViewFocusSignature> = ({ models, rootRef, }) => { - const tabbableItemId = useTabbableItemId(instance, models.selectedItems.value); + const defaultFocusableItemId = useDefaultFocusableItemId(instance, models.selectedItems.value); const setFocusedItemId = useEventCallback((itemId: React.SetStateAction<string | null>) => { const cleanItemId = typeof itemId === 'function' ? itemId(state.focusedItemId) : itemId; @@ -88,21 +86,6 @@ export const useTreeViewFocus: TreeViewPlugin<UseTreeViewFocusSignature> = ({ } }); - const focusDefaultItem = useEventCallback((event: React.SyntheticEvent | null) => { - let itemToFocusId: string | null | undefined; - if (Array.isArray(models.selectedItems.value)) { - itemToFocusId = models.selectedItems.value.find(isItemVisible); - } else if (models.selectedItems.value != null && isItemVisible(models.selectedItems.value)) { - itemToFocusId = models.selectedItems.value; - } - - if (itemToFocusId == null) { - itemToFocusId = getFirstNavigableItem(instance); - } - - innerFocusItem(event, itemToFocusId); - }); - const removeFocusedItem = useEventCallback(() => { if (state.focusedItemId == null) { return; @@ -121,11 +104,11 @@ export const useTreeViewFocus: TreeViewPlugin<UseTreeViewFocusSignature> = ({ setFocusedItemId(null); }); - const canItemBeTabbed = (itemId: string) => itemId === tabbableItemId; + const canItemBeTabbed = (itemId: string) => itemId === defaultFocusableItemId; useInstanceEventHandler(instance, 'removeItem', ({ id }) => { if (state.focusedItemId === id) { - instance.focusDefaultItem(null); + innerFocusItem(null, defaultFocusableItemId); } }); @@ -139,7 +122,7 @@ export const useTreeViewFocus: TreeViewPlugin<UseTreeViewFocusSignature> = ({ // if the event bubbled (which is React specific) we don't want to steal focus if (event.target === event.currentTarget) { - instance.focusDefaultItem(event); + innerFocusItem(event, defaultFocusableItemId); } }; @@ -154,7 +137,6 @@ export const useTreeViewFocus: TreeViewPlugin<UseTreeViewFocusSignature> = ({ isItemFocused, canItemBeTabbed, focusItem, - focusDefaultItem, removeFocusedItem, }, }; diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.ts index 0cb0c7e69fde..993487fcf86d 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewFocus/useTreeViewFocus.types.ts @@ -4,23 +4,38 @@ import { UseTreeViewIdSignature } from '../useTreeViewId/useTreeViewId.types'; import type { UseTreeViewItemsSignature } from '../useTreeViewItems'; import type { UseTreeViewSelectionSignature } from '../useTreeViewSelection'; import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion'; +import { TreeViewItemId } from '../../../models'; export interface UseTreeViewFocusPublicAPI { /** - * Focuses the item with the given id. + * Focus the item with the given id. * * If the item is the child of a collapsed item, then this method will do nothing. * Make sure to expand the ancestors of the item before calling this method if needed. * @param {React.SyntheticEvent} event The event source of the action. - * @param {string} itemId The id of the item to focus. + * @param {TreeViewItemId} itemId The id of the item to focus. */ focusItem: (event: React.SyntheticEvent, itemId: string) => void; } export interface UseTreeViewFocusInstance extends UseTreeViewFocusPublicAPI { - isItemFocused: (itemId: string) => boolean; - canItemBeTabbed: (itemId: string) => boolean; - focusDefaultItem: (event: React.SyntheticEvent | null) => void; + /** + * Check if an item is the currently focused item. + * @param {TreeViewItemId} itemId The id of the item to check. + * @returns {boolean} `true` if the item is focused, `false` otherwise. + */ + isItemFocused: (itemId: TreeViewItemId) => boolean; + /** + * Check if an item should be sequentially focusable (usually with the Tab key). + * At any point in time, there is a single item that can be sequentially focused in the Tree View. + * This item is the first selected item (that is both visible and navigable), if any, or the first navigable item if no item is selected. + * @param {TreeViewItemId} itemId The id of the item to check. + * @returns {boolean} `true` if the item can be sequentially focusable, `false` otherwise. + */ + canItemBeTabbed: (itemId: TreeViewItemId) => boolean; + /** + * Remove the focus from the currently focused item (both from the internal state and the DOM). + */ removeFocusedItem: () => void; } diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewIcons/useTreeViewIcons.test.tsx b/packages/x-tree-view/src/internals/plugins/useTreeViewIcons/useTreeViewIcons.test.tsx index a866127ab3cd..ac5880d8b71f 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewIcons/useTreeViewIcons.test.tsx +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewIcons/useTreeViewIcons.test.tsx @@ -13,7 +13,7 @@ describeTreeView<[UseTreeViewIconsSignature, UseTreeViewExpansionSignature]>( 'useTreeViewIcons plugin', ({ render }) => { describe('slots (expandIcon, collapseIcon, endIcon, icon)', () => { - const getIconTestId = (response: DescribeTreeViewRendererReturnValue<[]>, itemId: string) => + const getIconTestId = (response: DescribeTreeViewRendererReturnValue<any>, itemId: string) => response.getItemIconContainer(itemId).querySelector(`div`)?.dataset.testid; it('should render the expandIcon slot defined on the tree if no icon slot is defined on the item and the item is collapsed', () => { diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewId/useTreeViewId.types.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewId/useTreeViewId.types.ts index aafd09a0949b..0ef27d1f37db 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewId/useTreeViewId.types.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewId/useTreeViewId.types.ts @@ -1,7 +1,16 @@ import { TreeViewPluginSignature } from '../../models'; +import { TreeViewItemId } from '../../../models'; export interface UseTreeViewIdInstance { - getTreeItemIdAttribute: (itemId: string, idAttribute: string | undefined) => string; + /** + * Get the id attribute (i.e.: the `id` attribute passed to the DOM element) of a tree item. + * If the user explicitly defined an id attribute, it will be returned. + * Otherwise, the method created a unique id for the item based on the Tree View id attribute and the item `itemId` + * @param {TreeViewItemId} itemId The id of the item to get the id attribute of. + * @param {string | undefined} idAttribute The id attribute of the item if explicitly defined by the user. + * @returns {string} The id attribute of the item. + */ + getTreeItemIdAttribute: (itemId: TreeViewItemId, idAttribute: string | undefined) => string; } export interface UseTreeViewIdParameters { diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.test.tsx b/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.test.tsx index 98e161d10f2c..cc112b345834 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.test.tsx +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.test.tsx @@ -1,24 +1,186 @@ +import * as React from 'react'; import { expect } from 'chai'; +import { spy } from 'sinon'; +import { fireEvent } from '@mui/internal-test-utils'; import { describeTreeView } from 'test/utils/tree-view/describeTreeView'; +import { + UseTreeViewExpansionSignature, + UseTreeViewItemsSignature, + UseTreeViewSelectionSignature, +} from '@mui/x-tree-view/internals'; -describeTreeView('useTreeViewItems plugin', ({ render, treeViewComponent }) => { - it('should throw an error when two items have the same ID', function test() { - // TODO is this fixed? - if (!/jsdom/.test(window.navigator.userAgent)) { - // can't catch render errors in the browser for unknown reason - // tried try-catch + error boundary + window onError preventDefault - this.skip(); - } - - expect(() => render({ items: [{ id: '1' }, { id: '1' }], withErrorBoundary: true })).toErrorDev( - [ - ...(treeViewComponent === 'SimpleTreeView' +describeTreeView< + [UseTreeViewItemsSignature, UseTreeViewExpansionSignature, UseTreeViewSelectionSignature] +>( + 'useTreeViewItems plugin', + ({ render, renderFromJSX, treeViewComponentName, TreeViewComponent, TreeItemComponent }) => { + it('should throw an error when two items have the same ID', function test() { + // TODO is this fixed? + if (!/jsdom/.test(window.navigator.userAgent)) { + // can't catch render errors in the browser for unknown reason + // tried try-catch + error boundary + window onError preventDefault + this.skip(); + } + + expect(() => + render({ items: [{ id: '1' }, { id: '1' }], withErrorBoundary: true }), + ).toErrorDev([ + ...(treeViewComponentName === 'SimpleTreeView' ? ['Encountered two children with the same key'] : []), 'MUI X: The Tree View component requires all items to have a unique `id` property.', 'MUI X: The Tree View component requires all items to have a unique `id` property.', - `The above error occurred in the <ForwardRef(${treeViewComponent})> component`, - ], - ); - }); -}); + `The above error occurred in the <ForwardRef(${treeViewComponentName})> component`, + ]); + }); + + it('should be able to use a custom id attribute', function test() { + // For now, only SimpleTreeView can use custom id attributes + if (treeViewComponentName.startsWith('RichTreeView')) { + this.skip(); + } + + const response = render({ + items: [{ id: '1' }], + slotProps: { + item: { + id: 'customId', + }, + }, + }); + + expect(response.getItemRoot('1')).to.have.attribute('id', 'customId'); + }); + + describe('items prop / JSX Tree Item', () => { + it('should support removing an item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); + + response.setItems([{ id: '1' }]); + expect(response.getAllTreeItemIds()).to.deep.equal(['1']); + }); + + it('should support adding an item at the end', () => { + const response = render({ + items: [{ id: '1' }], + }); + + response.setItems([{ id: '1' }, { id: '2' }]); + expect(response.getAllTreeItemIds()).to.deep.equal(['1', '2']); + }); + + it('should support adding an item at the beginning', () => { + const response = render({ + items: [{ id: '2' }], + }); + + response.setItems([{ id: '1' }, { id: '2' }]); + expect(response.getAllTreeItemIds()).to.deep.equal(['1', '2']); + }); + + it('should update indexes when two items are swapped', () => { + const onSelectedItemsChange = spy(); + + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }], + multiSelect: true, + onSelectedItemsChange, + }); + + response.setItems([{ id: '1' }, { id: '3' }, { id: '2' }]); + expect(response.getAllTreeItemIds()).to.deep.equal(['1', '3', '2']); + + // Check if the internal state is updated by running a range selection + fireEvent.click(response.getItemContent('1')); + fireEvent.click(response.getItemContent('3'), { shiftKey: true }); + expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal(['1', '3']); + }); + + it('should not mark an item as expandable if its children is an empty array', () => { + const response = render({ + items: [{ id: '1', children: [] }], + defaultExpandedItems: ['1'], + }); + + expect(response.getItemRoot('1')).not.to.have.attribute('aria-expanded'); + }); + + it('should mark an item as not expandable if it has only empty conditional arrays', function test() { + if (treeViewComponentName.startsWith('RichTreeView')) { + this.skip(); + } + + const response = renderFromJSX( + <TreeViewComponent defaultExpandedItems={['1']}> + <TreeItemComponent itemId="1" label="1" data-testid="1"> + {[]} + {[]} + </TreeItemComponent> + </TreeViewComponent>, + ); + + expect(response.isItemExpanded('1')).to.equal(false); + }); + + it('should mark an item as expandable if it has two array as children, one of which is empty (SimpleTreeView only)', function test() { + if (treeViewComponentName.startsWith('RichTreeView')) { + this.skip(); + } + + const response = renderFromJSX( + <TreeViewComponent defaultExpandedItems={['1']}> + <TreeItemComponent itemId="1" label="1" data-testid="1"> + {[]} + {[<TreeItemComponent key="1.1" itemId="1.1" />]} + </TreeItemComponent> + </TreeViewComponent>, + ); + + expect(response.isItemExpanded('1')).to.equal(true); + }); + + it('should mark an item as not expandable if it has one array containing an empty array as a children (SimpleTreeView only)', function test() { + if (treeViewComponentName.startsWith('RichTreeView')) { + this.skip(); + } + + const response = renderFromJSX( + <TreeViewComponent defaultExpandedItems={['1']}> + <TreeItemComponent itemId="1" label="1" data-testid="1"> + {[[]]} + </TreeItemComponent> + </TreeViewComponent>, + ); + + expect(response.isItemExpanded('1')).to.equal(false); + }); + }); + + describe('disabled prop', () => { + it('should not have the attribute `aria-disabled` if disabled is not defined', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: false }, { id: '3', disabled: true }], + }); + + expect(response.getItemRoot('1')).not.to.have.attribute('aria-disabled'); + expect(response.getItemRoot('2')).not.to.have.attribute('aria-disabled'); + expect(response.getItemRoot('3')).to.have.attribute('aria-disabled'); + }); + + it('should disable all descendants of a disabled item', () => { + const response = render({ + items: [ + { id: '1', disabled: true, children: [{ id: '1.1', children: [{ id: '1.1.1' }] }] }, + ], + defaultExpandedItems: ['1', '1.1'], + }); + + expect(response.getItemRoot('1')).to.have.attribute('aria-disabled', 'true'); + expect(response.getItemRoot('1.1')).to.have.attribute('aria-disabled', 'true'); + expect(response.getItemRoot('1.1.1')).to.have.attribute('aria-disabled', 'true'); + }); + }); + }, +); diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.tsx similarity index 86% rename from packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.ts rename to packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.tsx index 25f4d660487d..c2a77e35bd97 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.tsx @@ -8,6 +8,7 @@ import { import { publishTreeViewEvent } from '../../utils/publishTreeViewEvent'; import { TreeViewBaseItem, TreeViewItemId } from '../../../models'; import { buildSiblingIndexes, TREE_VIEW_ROOT_PARENT_ID } from './useTreeViewItems.utils'; +import { TreeViewItemDepthContext } from '../../TreeViewItemDepthContext'; interface UpdateNodesStateParameters extends Pick< @@ -28,7 +29,7 @@ const updateItemsState = ({ [TREE_VIEW_ROOT_PARENT_ID]: [], }; - const processItem = (item: TreeViewBaseItem, parentId: string | null) => { + const processItem = (item: TreeViewBaseItem, depth: number, parentId: string | null) => { const id: string = getItemId ? getItemId(item) : (item as any).id; if (id == null) { @@ -71,6 +72,7 @@ const updateItemsState = ({ idAttribute: undefined, expandable: !!item.children?.length, disabled: isItemDisabled ? isItemDisabled(item) : false, + depth, }; itemMap[id] = item; @@ -81,10 +83,10 @@ const updateItemsState = ({ } itemOrderedChildrenIds[parentIdWithDefault].push(id); - item.children?.forEach((child) => processItem(child, id)); + item.children?.forEach((child) => processItem(child, depth + 1, id)); }; - items.forEach((item) => processItem(item, null)); + items.forEach((item) => processItem(item, 0, null)); const itemChildrenIndexes: State['itemChildrenIndexes'] = {}; Object.keys(itemOrderedChildrenIds).forEach((parentId) => { @@ -104,6 +106,7 @@ export const useTreeViewItems: TreeViewPlugin<UseTreeViewItemsSignature> = ({ params, state, setState, + experimentalFeatures, }) => { const getItemMeta = React.useCallback( (itemId: string) => state.items.itemMetaMap[itemId], @@ -219,6 +222,14 @@ export const useTreeViewItems: TreeViewPlugin<UseTreeViewItemsSignature> = ({ }; return { + getRootProps: () => ({ + style: { + '--TreeView-itemChildrenIndentation': + typeof params.itemChildrenIndentation === 'number' + ? `${params.itemChildrenIndentation}px` + : params.itemChildrenIndentation, + } as React.CSSProperties, + }), publicAPI: { getItem, }, @@ -233,7 +244,10 @@ export const useTreeViewItems: TreeViewPlugin<UseTreeViewItemsSignature> = ({ preventItemUpdates, areItemUpdatesPrevented, }, - contextValue: { disabledItemsFocusable: params.disabledItemsFocusable }, + contextValue: { + disabledItemsFocusable: params.disabledItemsFocusable, + indentationAtItemLevel: experimentalFeatures.indentationAtItemLevel ?? false, + }, }; }; @@ -249,12 +263,22 @@ useTreeViewItems.getInitialState = (params) => ({ useTreeViewItems.getDefaultizedParams = (params) => ({ ...params, disabledItemsFocusable: params.disabledItemsFocusable ?? false, + itemChildrenIndentation: params.itemChildrenIndentation ?? '12px', }); +useTreeViewItems.wrapRoot = ({ children, instance }) => { + return ( + <TreeViewItemDepthContext.Provider value={(itemId) => instance.getItemMeta(itemId)?.depth ?? 0}> + {children} + </TreeViewItemDepthContext.Provider> + ); +}; + useTreeViewItems.params = { disabledItemsFocusable: true, items: true, isItemDisabled: true, getItemLabel: true, getItemId: true, + itemChildrenIndentation: true, }; diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.types.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.types.ts index 3862f2d5d51d..dc234010c855 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.types.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewItems/useTreeViewItems.types.ts @@ -11,19 +11,55 @@ interface TreeViewItemProps { export interface UseTreeViewItemsPublicAPI<R extends {}> { /** * Get the item with the given id. + * When used in the `SimpleTreeView`, it returns an object with the `id` and `label` properties. * @param {string} itemId The id of the item to return. * @returns {R} The item with the given id. */ - getItem: (itemId: string) => R; + getItem: (itemId: TreeViewItemId) => R; } export interface UseTreeViewItemsInstance<R extends {}> extends UseTreeViewItemsPublicAPI<R> { - getItemMeta: (itemId: string) => TreeViewItemMeta; + /** + * Get the meta-information of an item. + * Check the `TreeViewItemMeta` type for more information. + * @param {TreeViewItemId} itemId The id of the item to get the meta-information of. + * @returns {TreeViewItemMeta} The meta-information of the item. + */ + getItemMeta: (itemId: TreeViewItemId) => TreeViewItemMeta; + /** + * Get the item that should be rendered. + * This method is only used on Rich Tree View components. + * Check the `TreeViewItemProps` type for more information. + * @returns {TreeViewItemProps[]} The items to render. + */ getItemsToRender: () => TreeViewItemProps[]; - getItemOrderedChildrenIds: (parentId: string | null) => string[]; - isItemDisabled: (itemId: string) => itemId is string; - isItemNavigable: (itemId: string) => boolean; - getItemIndex: (itemId: string) => number; + /** + * Get the ids of a given item's children. + * Those ids are returned in the order they should be rendered. + * @param {TreeViewItemId | null} itemId The id of the item to get the children of. + * @returns {TreeViewItemId[]} The ids of the item's children. + */ + getItemOrderedChildrenIds: (itemId: TreeViewItemId | null) => TreeViewItemId[]; + /** + * Check if a given item is disabled. + * An item is disabled if it was marked as disabled or if one of its ancestors is disabled. + * @param {TreeViewItemId} itemId The id of the item to check. + * @returns {boolean} `true` if the item is disabled, `false` otherwise. + */ + isItemDisabled: (itemId: TreeViewItemId) => boolean; + /** + * Check if a given item is navigable (i.e.: if it can be accessed through keyboard navigation). + * An item is navigable if it is not disabled or if the `disabledItemsFocusable` prop is `true`. + * @param {TreeViewItemId} itemId The id of the item to check. + * @returns {boolean} `true` if the item is navigable, `false` otherwise. + */ + isItemNavigable: (itemId: TreeViewItemId) => boolean; + /** + * Get the index of a given item in its parent's children list. + * @param {TreeViewItemId} itemId The id of the item to get the index of. + * @returns {number} The index of the item in its parent's children list. + */ + getItemIndex: (itemId: TreeViewItemId) => number; /** * Freeze any future update to the state based on the `items` prop. * This is useful when `useTreeViewJSXItems` is used to avoid having conflicting sources of truth. @@ -69,11 +105,17 @@ export interface UseTreeViewItemsParameters<R extends {}> { * @default (item) => item.id */ getItemId?: (item: R) => TreeViewItemId; + /** + * Horizontal indentation between an item and its children. + * Examples: 24, "24px", "2rem", "2em". + * @default 12px + */ + itemChildrenIndentation?: string | number; } export type UseTreeViewItemsDefaultizedParameters<R extends {}> = DefaultizedProps< UseTreeViewItemsParameters<R>, - 'disabledItemsFocusable' + 'disabledItemsFocusable' | 'itemChildrenIndentation' >; interface UseTreeViewItemsEventLookup { @@ -92,7 +134,9 @@ export interface UseTreeViewItemsState<R extends {}> { } interface UseTreeViewItemsContextValue - extends Pick<UseTreeViewItemsDefaultizedParameters<any>, 'disabledItemsFocusable'> {} + extends Pick<UseTreeViewItemsDefaultizedParameters<any>, 'disabledItemsFocusable'> { + indentationAtItemLevel: boolean; +} export type UseTreeViewItemsSignature = TreeViewPluginSignature<{ params: UseTreeViewItemsParameters<any>; @@ -102,6 +146,7 @@ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{ events: UseTreeViewItemsEventLookup; state: UseTreeViewItemsState<any>; contextValue: UseTreeViewItemsContextValue; + experimentalFeatures: 'indentationAtItemLevel'; }>; export type TreeViewItemMetaMap = { [itemId: string]: TreeViewItemMeta }; diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.tsx b/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.tsx index e28b703fbed8..c65cbe41913f 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.tsx +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.tsx @@ -17,6 +17,7 @@ import { import type { TreeItemProps } from '../../../TreeItem'; import type { TreeItem2Props } from '../../../TreeItem2'; import { UseTreeViewIdSignature } from '../useTreeViewId'; +import { TreeViewItemDepthContext } from '../../TreeViewItemDepthContext'; export const useTreeViewJSXItems: TreeViewPlugin<UseTreeViewJSXItemsSignature> = ({ instance, @@ -46,6 +47,24 @@ export const useTreeViewJSXItems: TreeViewPlugin<UseTreeViewJSXItemsSignature> = }, }; }); + + return () => { + setState((prevState) => { + const newItemMetaMap = { ...prevState.items.itemMetaMap }; + const newItemMap = { ...prevState.items.itemMap }; + delete newItemMetaMap[item.id]; + delete newItemMap[item.id]; + return { + ...prevState, + items: { + ...prevState.items, + itemMetaMap: newItemMetaMap, + itemMap: newItemMap, + }, + }; + }); + publishTreeViewEvent(instance, 'removeItem', { id: item.id }); + }; }); const setJSXItemsOrderedChildrenIds = (parentId: string | null, orderedChildrenIds: string[]) => { @@ -67,24 +86,6 @@ export const useTreeViewJSXItems: TreeViewPlugin<UseTreeViewJSXItemsSignature> = })); }; - const removeJSXItem = useEventCallback((itemId: string) => { - setState((prevState) => { - const newItemMetaMap = { ...prevState.items.itemMetaMap }; - const newItemMap = { ...prevState.items.itemMap }; - delete newItemMetaMap[itemId]; - delete newItemMap[itemId]; - return { - ...prevState, - items: { - ...prevState.items, - itemMetaMap: newItemMetaMap, - itemMap: newItemMap, - }, - }; - }); - publishTreeViewEvent(instance, 'removeItem', { id: itemId }); - }); - const mapFirstCharFromJSX = useEventCallback((itemId: string, firstChar: string) => { instance.updateFirstCharMap((firstCharMap) => { firstCharMap[itemId] = firstChar; @@ -103,7 +104,6 @@ export const useTreeViewJSXItems: TreeViewPlugin<UseTreeViewJSXItemsSignature> = return { instance: { insertJSXItem, - removeJSXItem, setJSXItemsOrderedChildrenIds, mapFirstCharFromJSX, }, @@ -152,15 +152,13 @@ const useTreeViewJSXItemsItemPlugin: TreeViewItemPlugin<TreeItemProps | TreeItem }, [instance, registerChild, unregisterChild, itemId, id]); React.useEffect(() => { - instance.insertJSXItem({ + return instance.insertJSXItem({ id: itemId, idAttribute: id, parentId, expandable, disabled, }); - - return () => instance.removeJSXItem(itemId); }, [instance, parentId, itemId, expandable, disabled, id]); React.useEffect(() => { @@ -181,12 +179,23 @@ const useTreeViewJSXItemsItemPlugin: TreeViewItemPlugin<TreeItemProps | TreeItem useTreeViewJSXItems.itemPlugin = useTreeViewJSXItemsItemPlugin; -useTreeViewJSXItems.wrapItem = ({ children, itemId }) => ( - <TreeViewChildrenItemProvider itemId={itemId}>{children}</TreeViewChildrenItemProvider> -); +useTreeViewJSXItems.wrapItem = ({ children, itemId }) => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const depthContext = React.useContext(TreeViewItemDepthContext); + + return ( + <TreeViewChildrenItemProvider itemId={itemId}> + <TreeViewItemDepthContext.Provider value={(depthContext as number) + 1}> + {children} + </TreeViewItemDepthContext.Provider> + </TreeViewChildrenItemProvider> + ); +}; useTreeViewJSXItems.wrapRoot = ({ children }) => ( - <TreeViewChildrenItemProvider>{children}</TreeViewChildrenItemProvider> + <TreeViewChildrenItemProvider> + <TreeViewItemDepthContext.Provider value={0}>{children}</TreeViewItemDepthContext.Provider> + </TreeViewChildrenItemProvider> ); useTreeViewJSXItems.params = {}; diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.ts index 87f7f4a07baa..3f613428603e 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewJSXItems/useTreeViewJSXItems.types.ts @@ -1,12 +1,33 @@ import { TreeViewItemMeta, TreeViewPluginSignature } from '../../models'; import { UseTreeViewItemsSignature } from '../useTreeViewItems'; import { UseTreeViewKeyboardNavigationSignature } from '../useTreeViewKeyboardNavigation'; +import { TreeViewItemId } from '../../../models'; export interface UseTreeViewItemsInstance { - insertJSXItem: (item: TreeViewItemMeta) => void; - removeJSXItem: (itemId: string) => void; - mapFirstCharFromJSX: (itemId: string, firstChar: string) => () => void; - setJSXItemsOrderedChildrenIds: (parentId: string | null, orderedChildrenIds: string[]) => void; + /** + * Insert a new item in the state from a Tree Item component. + * @param {TreeViewItemMeta} item The meta-information of the item to insert. + * @returns {() => void} A function to remove the item from the state. + */ + insertJSXItem: (item: TreeViewItemMeta) => () => void; + /** + * Updates the `firstCharMap` to register the first character of the given item's label. + * This map is used to navigate the tree using type-ahead search. + * @param {TreeViewItemId} itemId The id of the item to map the first character of. + * @param {string} firstChar The first character of the item's label. + * @returns {() => void} A function to remove the item from the `firstCharMap`. + */ + mapFirstCharFromJSX: (itemId: TreeViewItemId, firstChar: string) => () => void; + /** + * Store the ids of a given item's children in the state. + * Those ids must be passed in the order they should be rendered. + * @param {TreeViewItemId | null} parentId The id of the item to store the children of. + * @param {TreeViewItemId[]} orderedChildrenIds The ids of the item's children. + */ + setJSXItemsOrderedChildrenIds: ( + parentId: TreeViewItemId | null, + orderedChildrenIds: TreeViewItemId[], + ) => void; } export interface UseTreeViewJSXItemsParameters {} diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.test.tsx b/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.test.tsx index 5b5c7a4990f5..790fc886213b 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.test.tsx +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.test.tsx @@ -1,208 +1,1279 @@ import * as React from 'react'; import { expect } from 'chai'; -import { act, fireEvent } from '@mui-internal/test-utils'; +import { spy } from 'sinon'; +import { act, fireEvent } from '@mui/internal-test-utils'; import { describeTreeView } from 'test/utils/tree-view/describeTreeView'; import { + UseTreeViewExpansionSignature, UseTreeViewItemsSignature, UseTreeViewKeyboardNavigationSignature, + UseTreeViewSelectionSignature, } from '@mui/x-tree-view/internals'; -describeTreeView<[UseTreeViewKeyboardNavigationSignature, UseTreeViewItemsSignature]>( - 'useTreeViewKeyboardNavigation', - ({ render, treeViewComponent }) => { - describe('Type-ahead', () => { - it('should move the focus to the next item with a name that starts with the typed character', () => { - const { getFocusedItemId, getItemRoot } = render({ - items: [ - { id: '1', label: 'one' }, - { id: '2', label: 'two' }, - { id: '3', label: 'three' }, - { id: '4', label: 'four' }, - ], +describeTreeView< + [ + UseTreeViewKeyboardNavigationSignature, + UseTreeViewItemsSignature, + UseTreeViewExpansionSignature, + UseTreeViewSelectionSignature, + ] +>('useTreeViewKeyboardNavigation', ({ render, treeViewComponentName }) => { + describe('Navigation (focus and expansion)', () => { + describe('key: ArrowDown', () => { + it('should move the focus to a sibling item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], }); act(() => { - getItemRoot('1').focus(); + response.getItemRoot('1').focus(); }); - expect(getFocusedItemId()).to.equal('1'); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('2'); + }); - fireEvent.keyDown(getItemRoot('1'), { key: 't' }); - expect(getFocusedItemId()).to.equal('2'); + it('should move the focus to a child item', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); - fireEvent.keyDown(getItemRoot('2'), { key: 'f' }); - expect(getFocusedItemId()).to.equal('4'); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('1.1'); + }); + + it('should move the focus to a child item with a dynamic tree', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }, { id: '2' }], + defaultExpandedItems: ['1'], + }); - fireEvent.keyDown(getItemRoot('4'), { key: 'o' }); - expect(getFocusedItemId()).to.equal('1'); + response.setItems([{ id: '2' }]); + response.setItems([{ id: '1', children: [{ id: '1.1' }] }, { id: '2' }]); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('1.1'); }); - it('should move to the next item in the displayed order when typing the same starting character', () => { - const { getFocusedItemId, getItemRoot } = render({ - items: [{ id: 'A1' }, { id: 'B1' }, { id: 'A2' }, { id: 'B3' }, { id: 'B2' }], + it("should move the focus to a parent's sibling", () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }, { id: '2' }] }], + defaultExpandedItems: ['1'], }); act(() => { - getItemRoot('A1').focus(); + response.getItemRoot('1.1').focus(); }); - expect(getFocusedItemId()).to.equal('A1'); + fireEvent.keyDown(response.getItemRoot('1.1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('2'); + }); - fireEvent.keyDown(getItemRoot('A1'), { key: 'b' }); - expect(getFocusedItemId()).to.equal('B1'); + it('should skip disabled items', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + }); - fireEvent.keyDown(getItemRoot('B1'), { key: 'b' }); - expect(getFocusedItemId()).to.equal('B3'); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('3'); + }); - fireEvent.keyDown(getItemRoot('B3'), { key: 'b' }); - expect(getFocusedItemId()).to.equal('B2'); + it('should not skip disabled items if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + disabledItemsFocusable: true, + }); - fireEvent.keyDown(getItemRoot('B2'), { key: 'b' }); - expect(getFocusedItemId()).to.equal('B1'); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('2'); }); + }); - it('should work with capitalized label', () => { - const { getFocusedItemId, getItemRoot } = render({ - items: [ - { id: '1', label: 'One' }, - { id: '2', label: 'Two' }, - { id: '3', label: 'Three' }, - { id: '4', label: 'Four' }, - ], + describe('key: ArrowUp', () => { + it('should move the focus to a sibling item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], }); act(() => { - getItemRoot('1').focus(); + response.getItemRoot('2').focus(); }); - expect(getFocusedItemId()).to.equal('1'); + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowUp' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); - fireEvent.keyDown(getItemRoot('1'), { key: 't' }); - expect(getFocusedItemId()).to.equal('2'); + it('should move the focus to a parent', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); - fireEvent.keyDown(getItemRoot('2'), { key: 'f' }); - expect(getFocusedItemId()).to.equal('4'); + act(() => { + response.getItemRoot('1.1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1.1'), { key: 'ArrowUp' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); + + it("should move the focus to a sibling's child", () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }, { id: '2' }], + defaultExpandedItems: ['1'], + }); - fireEvent.keyDown(getItemRoot('4'), { key: 'o' }); - expect(getFocusedItemId()).to.equal('1'); + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowUp' }); + expect(response.getFocusedItemId()).to.equal('1.1'); }); - it('should work with ReactElement label', function test() { - // Only the SimpleTreeView can have React Element labels. - if (treeViewComponent !== 'SimpleTreeView') { - this.skip(); - } + it('should skip disabled items', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + }); - const { getFocusedItemId, getItemRoot } = render({ - items: [ - { id: '1', label: <span>one</span> }, - { id: '2', label: <span>two</span> }, - { id: '3', label: <span>three</span> }, - { id: '4', label: <span>four</span> }, - ], + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); + + it('should not skip disabled items if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + disabledItemsFocusable: true, }); act(() => { - getItemRoot('1').focus(); + response.getItemRoot('3').focus(); }); - expect(getFocusedItemId()).to.equal('1'); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp' }); + expect(response.getFocusedItemId()).to.equal('2'); + }); + }); - fireEvent.keyDown(getItemRoot('1'), { key: 't' }); - expect(getFocusedItemId()).to.equal('2'); + describe('key: ArrowRight', () => { + it('should open the item and not move the focus if the focus is on a closed item', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowRight' }); + expect(response.isItemExpanded('1')).to.equal(true); + expect(response.getFocusedItemId()).to.equal('1'); + }); - fireEvent.keyDown(getItemRoot('2'), { key: 'f' }); - expect(getFocusedItemId()).to.equal('4'); + it('should move the focus to the first child if the focus is on an open item', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); - fireEvent.keyDown(getItemRoot('4'), { key: 'o' }); - expect(getFocusedItemId()).to.equal('1'); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowRight' }); + expect(response.getFocusedItemId()).to.equal('1.1'); }); - it('should work after adding / removing items', () => { - const { getFocusedItemId, getItemRoot, setItems } = render({ - items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + it('should do nothing if the focus is on a leaf', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1.1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1.1'), { key: 'ArrowRight' }); + expect(response.getFocusedItemId()).to.equal('1.1'); + }); + + it('should not expand an item with children if it is collapsed but disabled even if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1', disabled: true, children: [{ id: '1.1' }] }], + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowRight' }); + expect(response.isItemExpanded('1')).to.equal(false); + }); + }); + + describe('key: ArrowLeft', () => { + it('should close the item if the focus is on an open item', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowLeft' }); + expect(response.isItemExpanded('1')).to.equal(false); + }); + + it("should move focus to the item's parent if the focus is on a child item that is a leaf", () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1.1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1.1'), { key: 'ArrowLeft' }); + expect(response.getFocusedItemId()).to.equal('1'); + expect(response.isItemExpanded('1')).to.equal(true); + }); + + it("should move the focus to the item's parent if the focus is on a child item that is closed", () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1', children: [{ id: '1.1.1' }] }] }], + defaultExpandedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1.1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1.1'), { key: 'ArrowLeft' }); + expect(response.getFocusedItemId()).to.equal('1'); + expect(response.isItemExpanded('1')).to.equal(true); + }); + + it('should do nothing if the focus is on a root item that is closed', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], }); act(() => { - getItemRoot('1').focus(); + response.getItemRoot('1').focus(); }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowLeft' }); + expect(response.getFocusedItemId()).to.equal('1'); + expect(response.isItemExpanded('1')).to.equal(false); + }); - fireEvent.keyDown(getItemRoot('1'), { key: '4' }); - expect(getFocusedItemId()).to.equal('4'); + it('should do nothing if the focus is on a root item that is a leaf', () => { + const response = render({ + items: [{ id: '1' }], + }); - setItems([{ id: '1' }, { id: '2' }, { id: '3' }]); - expect(getFocusedItemId()).to.equal('1'); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowLeft' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); - fireEvent.keyDown(getItemRoot('1'), { key: '2' }); - expect(getFocusedItemId()).to.equal('2'); + it('should not collapse an item with children if it is collapsed but disabled even if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1', disabled: true, children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + disabledItemsFocusable: true, + }); - setItems([{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }]); - expect(getFocusedItemId()).to.equal('2'); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowLeft' }); + expect(response.isItemExpanded('1')).to.equal(true); + }); + }); - fireEvent.keyDown(getItemRoot('2'), { key: '4' }); - expect(getFocusedItemId()).to.equal('4'); + describe('key: Home', () => { + it('should move the focus to the first item in the tree', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + }); + + act(() => { + response.getItemRoot('4').focus(); + }); + fireEvent.keyDown(response.getItemRoot('4'), { key: 'Home' }); + expect(response.getFocusedItemId()).to.equal('1'); }); + }); - it('should not move focus when pressing a modifier key and a letter', () => { - const { getFocusedItemId, getItemRoot } = render({ + describe('key: End', () => { + it('should move the focus to the last item in the tree when the last item is not expanded', () => { + const response = render({ items: [ - { id: '1', label: 'one' }, - { id: '2', label: 'two' }, - { id: '3', label: 'three' }, - { id: '4', label: 'four' }, + { id: '1' }, + { id: '2' }, + { id: '3' }, + { id: '4', children: [{ id: '4.1' }, { id: '4.2' }] }, ], }); act(() => { - getItemRoot('1').focus(); + response.getItemRoot('1').focus(); }); - expect(getFocusedItemId()).to.equal('1'); - - fireEvent.keyDown(getItemRoot('1'), { key: 't', ctrlKey: true }); - expect(getFocusedItemId()).to.equal('1'); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'End' }); + expect(response.getFocusedItemId()).to.equal('4'); + }); - fireEvent.keyDown(getItemRoot('1'), { key: 't', metaKey: true }); - expect(getFocusedItemId()).to.equal('1'); + it('should move the focus to the last item in the tree when the last item is expanded', () => { + const response = render({ + items: [ + { id: '1' }, + { id: '2' }, + { id: '3' }, + { id: '4', children: [{ id: '4.1', children: [{ id: '4.1.1' }] }] }, + ], + defaultExpandedItems: ['4', '4.1'], + }); - fireEvent.keyDown(getItemRoot('1'), { key: 't', shiftKey: true }); - expect(getFocusedItemId()).to.equal('1'); + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'End' }); + expect(response.getFocusedItemId()).to.equal('4.1.1'); }); + }); - it('should work on disabled item when disabledItemsFocusable={true}', () => { - const { getFocusedItemId, getItemRoot } = render({ + describe('key: * (asterisk)', () => { + it('should expand all items that are at the same depth as the current item (depth = 0)', () => { + const response = render({ items: [ - { id: '1', label: 'one', disabled: true }, - { id: '2', label: 'two', disabled: true }, - { id: '3', label: 'three', disabled: true }, - { id: '4', label: 'four', disabled: true }, + { id: '1', children: [{ id: '1.1' }] }, + { id: '2', children: [{ id: '2.1' }] }, + { id: '3', children: [{ id: '3.1', children: [{ id: '3.1.1' }] }] }, + { id: '4' }, ], - disabledItemsFocusable: true, }); act(() => { - getItemRoot('1').focus(); + response.getItemRoot('1').focus(); }); - expect(getFocusedItemId()).to.equal('1'); - fireEvent.keyDown(getItemRoot('1'), { key: 't' }); - expect(getFocusedItemId()).to.equal('2'); + expect(response.isItemExpanded('1')).to.equal(false); + expect(response.isItemExpanded('2')).to.equal(false); + expect(response.isItemExpanded('3')).to.equal(false); + + fireEvent.keyDown(response.getItemRoot('1'), { key: '*' }); + expect(response.isItemExpanded('1')).to.equal(true); + expect(response.isItemExpanded('2')).to.equal(true); + expect(response.isItemExpanded('3')).to.equal(true); + expect(response.isItemExpanded('3.1')).to.equal(false); }); - it('should not move focus on disabled item when disabledItemsFocusable={false}', () => { - const { getFocusedItemId, getItemRoot } = render({ + it('should expand all items that are at the same depth as the current item (depth = 1)', () => { + const response = render({ items: [ - { id: '1', label: 'one', disabled: true }, - { id: '2', label: 'two', disabled: true }, - { id: '3', label: 'three', disabled: true }, - { id: '4', label: 'four', disabled: true }, + { id: '1', children: [{ id: '1.1' }] }, + { id: '2', children: [{ id: '2.1' }] }, + { + id: '3', + children: [ + { + id: '3.1', + children: [{ id: '3.1.1' }, { id: '3.1.2', children: [{ id: '3.1.2.1' }] }], + }, + ], + }, + { id: '4' }, ], - disabledItemsFocusable: false, + defaultExpandedItems: ['3'], }); act(() => { - getItemRoot('1').focus(); + response.getItemRoot('3.1').focus(); }); - expect(getFocusedItemId()).to.equal('1'); - fireEvent.keyDown(getItemRoot('1'), { key: 't' }); - expect(getFocusedItemId()).to.equal('1'); + expect(response.isItemExpanded('1')).to.equal(false); + expect(response.isItemExpanded('2')).to.equal(false); + expect(response.isItemExpanded('3')).to.equal(true); + expect(response.isItemExpanded('3.1')).to.equal(false); + + fireEvent.keyDown(response.getItemRoot('3.1'), { key: '*' }); + expect(response.isItemExpanded('1')).to.equal(false); + expect(response.isItemExpanded('2')).to.equal(false); + expect(response.isItemExpanded('3')).to.equal(true); + expect(response.isItemExpanded('3.1')).to.equal(true); + expect(response.isItemExpanded('3.1.2')).to.equal(false); }); }); - }, -); + + describe('key: Enter', () => { + it('should expand an item with children if it is collapsed', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'Enter' }); + expect(response.isItemExpanded('1')).to.equal(true); + }); + + it('should collapse an item with children if it is expanded', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'Enter' }); + expect(response.isItemExpanded('1')).to.equal(false); + }); + + it('should not expand an item with children if it is collapsed but disabled even if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1', disabled: true, children: [{ id: '1.1' }] }], + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'Enter' }); + expect(response.isItemExpanded('1')).to.equal(false); + }); + }); + }); + + describe('Selection', () => { + describe('single selection', () => { + describe('key: Space', () => { + it('should select the focused item when Space is pressed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.isItemSelected('1')).to.equal(true); + }); + + it('should not un-select the focused item when Space is pressed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.isItemSelected('1')).to.equal(true); + }); + + it('should not select the focused item when Space is pressed and disableSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + disableSelection: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.isItemSelected('1')).to.equal(false); + }); + + it('should not select the focused item when Space is pressed and the item is disabled', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.isItemSelected('1')).to.equal(false); + }); + + it('should not select the focused item when Space is pressed and the item is disabled even if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }], + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.isItemSelected('1')).to.equal(false); + }); + }); + + describe('key: Enter', () => { + it('should select the focused item when Enter is pressed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'Enter' }); + expect(response.isItemSelected('1')).to.equal(true); + }); + + it('should not un-select the focused item when Enter is pressed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'Enter' }); + expect(response.isItemSelected('1')).to.equal(true); + }); + + it('should not select the focused item when Enter is pressed and disableSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + disableSelection: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'Enter' }); + expect(response.isItemSelected('1')).to.equal(false); + }); + + it('should not select the focused item when Enter is pressed and the item is disabled even if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }], + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'Enter' }); + expect(response.isItemSelected('1')).to.equal(false); + }); + }); + }); + + describe('multi selection', () => { + describe('key: Space', () => { + it('should select the focused item without un-selecting the other selected items when Space is pressed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + multiSelect: true, + defaultSelectedItems: ['1'], + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { key: ' ' }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2']); + }); + + it('should un-select the focused item when Space is pressed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + multiSelect: true, + defaultSelectedItems: ['1', '2'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); + }); + + it('should select the focused item without un-selecting the other selected items when Space is pressed while holding Ctrl', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + multiSelect: true, + defaultSelectedItems: ['1'], + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { key: ' ', ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2']); + }); + + it('should un-select the focused item when Space is pressed while holding Ctrl', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + multiSelect: true, + defaultSelectedItems: ['1', '2'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ', ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); + }); + + it('should not select the focused item when Space is pressed and disableSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + multiSelect: true, + disableSelection: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + + it('should not select the focused item when Space is pressed and the item is disabled', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }], + multiSelect: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + + it('should not select the focused item when Space is pressed and the item is disabled even if disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }], + multiSelect: true, + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: ' ' }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + }); + + describe('key: ArrowDown', () => { + it('should expand the selection range when ArrowDown is pressed while holding Shift from a selected item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultSelectedItems: ['2'], + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '3']); + }); + + it('should not un-select the item below the focused item when ArrowDown is pressed while holding Shift from a selected item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultSelectedItems: ['2', '3'], + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '3']); + }); + + it('should un-select the focused item when ArrowDown is pressed while holding Shift and the item below have been selected in the same range', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultSelectedItems: ['3'], + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '3']); + + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['3']); + }); + + it('should not select any item when ArrowDown is pressed while holding Shift and disabledSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + multiSelect: true, + disableSelection: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + + it('should select the next non-disabled item when ArrowDown is pressed while holding Shift', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + multiSelect: true, + defaultSelectedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '3']); + }); + + it('should not select the next item when ArrowDown is pressed while holding Shift if the next item is disabled and disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + multiSelect: true, + disabledItemsFocusable: true, + defaultSelectedItems: ['1'], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); + expect(response.getFocusedItemId()).to.equal('2'); + }); + + it('should select the next item when ArrowDown is pressed while holding Shift if the focused item is disabled and disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }, { id: '3' }], + multiSelect: true, + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); + }); + }); + + describe('key: ArrowUp', () => { + it('should expand the selection range when ArrowUp is pressed while holding Shift from a selected item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultSelectedItems: ['3'], + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '3']); + }); + + it('should not un-select the item above the focused item when ArrowUp is pressed while holding Shift from a selected item', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultSelectedItems: ['2', '3'], + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '3']); + }); + + it('should un-select the focused item when ArrowUp is pressed while holding Shift and the item above have been selected in the same range', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultSelectedItems: ['2'], + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowDown', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '3']); + + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); + }); + + it('should not select any item when ArrowUp is pressed while holding Shift and disabledSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + multiSelect: true, + disableSelection: true, + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + + it('should select the next non-disabled item when ArrowUp is pressed while holding Shift', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + multiSelect: true, + defaultSelectedItems: ['3'], + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '3']); + }); + + it('should not select the next item when ArrowUp is pressed while holding Shift if the next item is disabled and disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + multiSelect: true, + disabledItemsFocusable: true, + defaultSelectedItems: ['3'], + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['3']); + expect(response.getFocusedItemId()).to.equal('2'); + }); + + it('should select the previous item when ArrowUp is pressed while holding Shift if the focused item is disabled and disabledItemsFocusable={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3', disabled: true }], + multiSelect: true, + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowUp', shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); + }); + }); + + describe('key: Home', () => { + it('should select select the focused item and all the items above when Home is pressed while holding Shift + Ctrl', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }] }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultExpandedItems: ['2'], + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { + key: 'Home', + shiftKey: true, + ctrlKey: true, + }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2', '2.1', '3']); + }); + + it('should not select any item when Home is pressed while holding Shift + Ctrl and disableSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + disableSelection: true, + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { + key: 'Home', + shiftKey: true, + ctrlKey: true, + }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + + it('should not select disabled items when Home is pressed while holding Shift + Ctrl', () => { + const response = render({ + items: [ + { id: '1' }, + { id: '2', disabled: true, children: [{ id: '2.1' }] }, + { id: '3' }, + { id: '4' }, + ], + multiSelect: true, + defaultExpandedItems: ['2'], + }); + + act(() => { + response.getItemRoot('3').focus(); + }); + fireEvent.keyDown(response.getItemRoot('3'), { + key: 'Home', + shiftKey: true, + ctrlKey: true, + }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '3']); + }); + }); + + describe('key: End', () => { + it('should select select the focused item and all the items below when End is pressed while holding Shift + Ctrl', () => { + const response = render({ + items: [{ id: '1' }, { id: '2', children: [{ id: '2.1' }] }, { id: '3' }, { id: '4' }], + multiSelect: true, + defaultExpandedItems: ['2'], + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { + key: 'End', + shiftKey: true, + ctrlKey: true, + }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '2.1', '3', '4']); + }); + + it('should not select any item when End is pressed while holding Shift + Ctrl and disableSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + disableSelection: true, + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { + key: 'End', + shiftKey: true, + ctrlKey: true, + }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + + it('should not select disabled items when End is pressed while holding Shift + Ctrl', () => { + const response = render({ + items: [ + { id: '1' }, + { id: '2' }, + { id: '3', disabled: true, children: [{ id: '3.1' }] }, + { id: '4' }, + ], + multiSelect: true, + defaultExpandedItems: ['2'], + }); + + act(() => { + response.getItemRoot('2').focus(); + }); + fireEvent.keyDown(response.getItemRoot('2'), { + key: 'End', + shiftKey: true, + ctrlKey: true, + }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '4']); + }); + }); + + describe('key: Ctrl + A', () => { + it('should select all items when Ctrl + A is pressed', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'a', ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2', '3', '4']); + }); + + it('should not select any item when Ctrl + A is pressed and disableSelection={true}', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + multiSelect: true, + disableSelection: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'a', ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); + + it('should not select disabled items when Ctrl + A is pressed', () => { + const response = render({ + items: [ + { id: '1' }, + { id: '2', disabled: true, children: [{ id: '2.1' }] }, + { id: '3' }, + { id: '4' }, + ], + multiSelect: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + fireEvent.keyDown(response.getItemRoot('1'), { key: 'a', ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '3', '4']); + }); + }); + }); + }); + + describe('Type-ahead', () => { + it('should move the focus to the next item with a name that starts with the typed character', () => { + const response = render({ + items: [ + { id: '1', label: 'one' }, + { id: '2', label: 'two' }, + { id: '3', label: 'three' }, + { id: '4', label: 'four' }, + ], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't' }); + expect(response.getFocusedItemId()).to.equal('2'); + + fireEvent.keyDown(response.getItemRoot('2'), { key: 'f' }); + expect(response.getFocusedItemId()).to.equal('4'); + + fireEvent.keyDown(response.getItemRoot('4'), { key: 'o' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); + + it('should move to the next item in the displayed order when typing the same starting character', () => { + const response = render({ + items: [{ id: 'A1' }, { id: 'B1' }, { id: 'A2' }, { id: 'B3' }, { id: 'B2' }], + }); + + act(() => { + response.getItemRoot('A1').focus(); + }); + expect(response.getFocusedItemId()).to.equal('A1'); + + fireEvent.keyDown(response.getItemRoot('A1'), { key: 'b' }); + expect(response.getFocusedItemId()).to.equal('B1'); + + fireEvent.keyDown(response.getItemRoot('B1'), { key: 'b' }); + expect(response.getFocusedItemId()).to.equal('B3'); + + fireEvent.keyDown(response.getItemRoot('B3'), { key: 'b' }); + expect(response.getFocusedItemId()).to.equal('B2'); + + fireEvent.keyDown(response.getItemRoot('B2'), { key: 'b' }); + expect(response.getFocusedItemId()).to.equal('B1'); + }); + + it('should work with capitalized label', () => { + const response = render({ + items: [ + { id: '1', label: 'One' }, + { id: '2', label: 'Two' }, + { id: '3', label: 'Three' }, + { id: '4', label: 'Four' }, + ], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't' }); + expect(response.getFocusedItemId()).to.equal('2'); + + fireEvent.keyDown(response.getItemRoot('2'), { key: 'f' }); + expect(response.getFocusedItemId()).to.equal('4'); + + fireEvent.keyDown(response.getItemRoot('4'), { key: 'o' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); + + it('should work with ReactElement label', function test() { + // Only the SimpleTreeView can have React Element labels. + if (treeViewComponentName !== 'SimpleTreeView') { + this.skip(); + } + + const response = render({ + items: [ + { id: '1', label: <span>one</span> }, + { id: '2', label: <span>two</span> }, + { id: '3', label: <span>three</span> }, + { id: '4', label: <span>four</span> }, + ], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't' }); + expect(response.getFocusedItemId()).to.equal('2'); + + fireEvent.keyDown(response.getItemRoot('2'), { key: 'f' }); + expect(response.getFocusedItemId()).to.equal('4'); + + fireEvent.keyDown(response.getItemRoot('4'), { key: 'o' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); + + it('should work after adding / removing items', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + + fireEvent.keyDown(response.getItemRoot('1'), { key: '4' }); + expect(response.getFocusedItemId()).to.equal('4'); + + response.setItems([{ id: '1' }, { id: '2' }, { id: '3' }]); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: '2' }); + expect(response.getFocusedItemId()).to.equal('2'); + + response.setItems([{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }]); + expect(response.getFocusedItemId()).to.equal('2'); + + fireEvent.keyDown(response.getItemRoot('2'), { key: '4' }); + expect(response.getFocusedItemId()).to.equal('4'); + }); + + it('should not move focus when a modifier key and a letter are pressed', () => { + const response = render({ + items: [ + { id: '1', label: 'one' }, + { id: '2', label: 'two' }, + { id: '3', label: 'three' }, + { id: '4', label: 'four' }, + ], + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't', ctrlKey: true }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't', metaKey: true }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't', shiftKey: true }); + expect(response.getFocusedItemId()).to.equal('1'); + }); + + it('should work on disabled item when disabledItemsFocusable={true}', () => { + const response = render({ + items: [ + { id: '1', label: 'one', disabled: true }, + { id: '2', label: 'two', disabled: true }, + { id: '3', label: 'three', disabled: true }, + { id: '4', label: 'four', disabled: true }, + ], + disabledItemsFocusable: true, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't' }); + expect(response.getFocusedItemId()).to.equal('2'); + }); + + it('should not move focus on disabled item when disabledItemsFocusable={false}', () => { + const response = render({ + items: [ + { id: '1', label: 'one', disabled: true }, + { id: '2', label: 'two', disabled: true }, + { id: '3', label: 'three', disabled: true }, + { id: '4', label: 'four', disabled: true }, + ], + disabledItemsFocusable: false, + }); + + act(() => { + response.getItemRoot('1').focus(); + }); + expect(response.getFocusedItemId()).to.equal('1'); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 't' }); + expect(response.getFocusedItemId()).to.equal('1'); + }); + }); + + describe('onKeyDown prop', () => { + it('should call onKeyDown on the Tree View and the Tree Item when a key is pressed', () => { + const handleTreeViewKeyDown = spy(); + const handleTreeItemKeyDown = spy(); + + const response = render({ + items: [{ id: '1' }], + onKeyDown: handleTreeViewKeyDown, + slotProps: { item: { onKeyDown: handleTreeItemKeyDown } }, + } as any); + + const itemRoot = response.getItemRoot('1'); + act(() => { + itemRoot.focus(); + }); + + fireEvent.keyDown(itemRoot, { key: 'Enter' }); + fireEvent.keyDown(itemRoot, { key: 'A' }); + fireEvent.keyDown(itemRoot, { key: ']' }); + + expect(handleTreeViewKeyDown.callCount).to.equal(3); + expect(handleTreeItemKeyDown.callCount).to.equal(3); + }); + }); +}); diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.ts index b16b3d457787..40d6dd3ce6d2 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { useTheme } from '@mui/material/styles'; +import { useRtl } from '@mui/system/RtlProvider'; import useEventCallback from '@mui/utils/useEventCallback'; import { TreeViewItemMeta, TreeViewPlugin } from '../../models'; import { @@ -21,8 +21,7 @@ function isPrintableCharacter(string: string) { export const useTreeViewKeyboardNavigation: TreeViewPlugin< UseTreeViewKeyboardNavigationSignature > = ({ instance, params, state }) => { - const theme = useTheme(); - const isRTL = theme.direction === 'rtl'; + const isRtl = useRtl(); const firstCharMap = React.useRef<TreeViewFirstCharMap>({}); const updateFirstCharMap = useEventCallback( @@ -171,7 +170,7 @@ export const useTreeViewKeyboardNavigation: TreeViewPlugin< // If the focused item is expanded, we move the focus to its first child // If the focused item is collapsed and has children, we expand it - case (key === 'ArrowRight' && !isRTL) || (key === 'ArrowLeft' && isRTL): { + case (key === 'ArrowRight' && !isRtl) || (key === 'ArrowLeft' && isRtl): { if (instance.isItemExpanded(itemId)) { const nextItemId = getNextNavigableItem(instance, itemId); if (nextItemId) { @@ -188,7 +187,7 @@ export const useTreeViewKeyboardNavigation: TreeViewPlugin< // If the focused item is expanded, we collapse it // If the focused item is collapsed and has a parent, we move the focus to this parent - case (key === 'ArrowLeft' && !isRTL) || (key === 'ArrowRight' && isRTL): { + case (key === 'ArrowLeft' && !isRtl) || (key === 'ArrowRight' && isRtl): { if (canToggleItemExpansion(itemId) && instance.isItemExpanded(itemId)) { instance.toggleItemExpansion(event, itemId); event.preventDefault(); diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.ts index 053eeaaf43e6..9aceca62b73f 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewKeyboardNavigation/useTreeViewKeyboardNavigation.types.ts @@ -5,12 +5,25 @@ import { UseTreeViewSelectionSignature } from '../useTreeViewSelection'; import { UseTreeViewFocusSignature } from '../useTreeViewFocus'; import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion'; import { MuiCancellableEvent } from '../../models/MuiCancellableEvent'; +import { TreeViewItemId } from '../../../models'; export interface UseTreeViewKeyboardNavigationInstance { + /** + * Updates the `firstCharMap` to add/remove the first character of some item's labels. + * This map is used to navigate the tree using type-ahead search. + * This method is only used by the `useTreeViewJSXItems` plugin, otherwise the updates are handled internally. + * @param {(map: TreeViewFirstCharMap) => TreeViewFirstCharMap} updater The function to update the map. + */ updateFirstCharMap: (updater: (map: TreeViewFirstCharMap) => TreeViewFirstCharMap) => void; + /** + * Callback fired when a key is pressed on an item. + * Handles all the keyboard navigation logic. + * @param {React.KeyboardEvent<HTMLElement> & MuiCancellableEvent} event The keyboard event that triggered the callback. + * @param {TreeViewItemId} itemId The id of the item that the event was triggered on. + */ handleItemKeyDown: ( event: React.KeyboardEvent<HTMLElement> & MuiCancellableEvent, - itemId: string, + itemId: TreeViewItemId, ) => void; } diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.test.tsx b/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.test.tsx index 63324c7ed7c3..6bd4595d4c06 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.test.tsx +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.test.tsx @@ -1,883 +1,798 @@ import { expect } from 'chai'; import { spy } from 'sinon'; -import { fireEvent } from '@mui-internal/test-utils'; +import { fireEvent } from '@mui/internal-test-utils'; import { describeTreeView } from 'test/utils/tree-view/describeTreeView'; -import { UseTreeViewSelectionSignature } from '@mui/x-tree-view/internals'; +import { + UseTreeViewExpansionSignature, + UseTreeViewSelectionSignature, +} from '@mui/x-tree-view/internals'; /** * All tests related to keyboard navigation (e.g.: selection using "Space") * are located in the `useTreeViewKeyboardNavigation.test.tsx` file. */ -describeTreeView<[UseTreeViewSelectionSignature]>('useTreeViewSelection plugin', ({ render }) => { - describe('model props (selectedItems, defaultSelectedItems, onSelectedItemsChange)', () => { - it('should not select items when no default state and no control state are defined', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - }); - - expect(response.isItemSelected('1')).to.equal(false); - }); +describeTreeView<[UseTreeViewSelectionSignature, UseTreeViewExpansionSignature]>( + 'useTreeViewSelection plugin', + ({ render }) => { + describe('model props (selectedItems, defaultSelectedItems, onSelectedItemsChange)', () => { + it('should not select items when no default state and no control state are defined', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); - it('should use the default state when defined', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1'], + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(true); - }); + it('should use the default state when defined', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1'], + }); - it('should use the controlled state when defined', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - selectedItems: ['1'], + expect(response.isItemSelected('1')).to.equal(true); }); - expect(response.isItemSelected('1')).to.equal(true); - }); + it('should use the controlled state when defined', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + selectedItems: ['1'], + }); - it('should use the controlled state instead of the default state when both are defined', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - selectedItems: ['1'], - defaultSelectedItems: ['2'], + expect(response.isItemSelected('1')).to.equal(true); }); - expect(response.isItemSelected('1')).to.equal(true); - }); + it('should use the controlled state instead of the default state when both are defined', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + selectedItems: ['1'], + defaultSelectedItems: ['2'], + }); - it('should react to controlled state update', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - selectedItems: [], + expect(response.isItemSelected('1')).to.equal(true); }); - response.setProps({ selectedItems: ['1'] }); - expect(response.isItemSelected('1')).to.equal(true); - }); - - it('should call the onSelectedItemsChange callback when the model is updated (single selection and add selected item)', () => { - const onSelectedItemsChange = spy(); + it('should react to controlled state update', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + selectedItems: [], + }); - const response = render({ - items: [{ id: '1' }, { id: '2' }], - onSelectedItemsChange, + response.setProps({ selectedItems: ['1'] }); + expect(response.isItemSelected('1')).to.equal(true); }); - fireEvent.click(response.getItemContent('1')); + it('should call the onSelectedItemsChange callback when the model is updated (single selection and add selected item)', () => { + const onSelectedItemsChange = spy(); - expect(onSelectedItemsChange.callCount).to.equal(1); - expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal('1'); - }); + const response = render({ + items: [{ id: '1' }, { id: '2' }], + onSelectedItemsChange, + }); - // TODO: Re-enable this test if we have a way to un-select an item in single selection. - // eslint-disable-next-line mocha/no-skipped-tests - it.skip('should call onSelectedItemsChange callback when the model is updated (single selection and remove selected item', () => { - const onSelectedItemsChange = spy(); + fireEvent.click(response.getItemContent('1')); - const response = render({ - items: [{ id: '1' }, { id: '2' }], - onSelectedItemsChange, - defaultSelectedItems: ['1'], + expect(onSelectedItemsChange.callCount).to.equal(1); + expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal('1'); }); - fireEvent.click(response.getItemContent('1')); + // TODO: Re-enable this test if we have a way to un-select an item in single selection. + // eslint-disable-next-line mocha/no-skipped-tests + it.skip('should call onSelectedItemsChange callback when the model is updated (single selection and remove selected item', () => { + const onSelectedItemsChange = spy(); - expect(onSelectedItemsChange.callCount).to.equal(1); - expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal([]); - }); + const response = render({ + items: [{ id: '1' }, { id: '2' }], + onSelectedItemsChange, + defaultSelectedItems: ['1'], + }); - it('should call the onSelectedItemsChange callback when the model is updated (multi selection and add selected item to empty list)', () => { - const onSelectedItemsChange = spy(); + fireEvent.click(response.getItemContent('1')); - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - onSelectedItemsChange, + expect(onSelectedItemsChange.callCount).to.equal(1); + expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal([]); }); - fireEvent.click(response.getItemContent('1')); + it('should call the onSelectedItemsChange callback when the model is updated (multi selection and add selected item to empty list)', () => { + const onSelectedItemsChange = spy(); - expect(onSelectedItemsChange.callCount).to.equal(1); - expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal(['1']); - }); + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + onSelectedItemsChange, + }); - it('should call the onSelectedItemsChange callback when the model is updated (multi selection and add selected item to non-empty list)', () => { - const onSelectedItemsChange = spy(); + fireEvent.click(response.getItemContent('1')); - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - onSelectedItemsChange, - defaultSelectedItems: ['1'], + expect(onSelectedItemsChange.callCount).to.equal(1); + expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal(['1']); }); - fireEvent.click(response.getItemContent('2'), { ctrlKey: true }); + it('should call the onSelectedItemsChange callback when the model is updated (multi selection and add selected item to non-empty list)', () => { + const onSelectedItemsChange = spy(); - expect(onSelectedItemsChange.callCount).to.equal(1); - expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal(['2', '1']); - }); + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + onSelectedItemsChange, + defaultSelectedItems: ['1'], + }); - it('should call the onSelectedItemsChange callback when the model is updated (multi selection and remove selected item)', () => { - const onSelectedItemsChange = spy(); + fireEvent.click(response.getItemContent('2'), { ctrlKey: true }); - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - onSelectedItemsChange, - defaultSelectedItems: ['1'], + expect(onSelectedItemsChange.callCount).to.equal(1); + expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal(['2', '1']); }); - fireEvent.click(response.getItemContent('1'), { ctrlKey: true }); - - expect(onSelectedItemsChange.callCount).to.equal(1); - expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal([]); - }); + it('should call the onSelectedItemsChange callback when the model is updated (multi selection and remove selected item)', () => { + const onSelectedItemsChange = spy(); - it('should warn when switching from controlled to uncontrolled', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - selectedItems: [], - }); + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + onSelectedItemsChange, + defaultSelectedItems: ['1'], + }); - expect(() => { - response.setProps({ selectedItems: undefined }); - }).toErrorDev( - 'MUI X: A component is changing the controlled selectedItems state of TreeView to be uncontrolled.', - ); - }); + fireEvent.click(response.getItemContent('1'), { ctrlKey: true }); - it('should warn and not react to update when updating the default state', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1'], + expect(onSelectedItemsChange.callCount).to.equal(1); + expect(onSelectedItemsChange.lastCall.args[1]).to.deep.equal([]); }); - expect(() => { - response.setProps({ defaultSelectedItems: ['2'] }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - }).toErrorDev( - 'MUI X: A component is changing the default selectedItems state of an uncontrolled TreeView after being initialized. To suppress this warning opt to use a controlled TreeView.', - ); - }); - }); - - describe('item click interaction', () => { - describe('single selection', () => { - it('should select un-selected item when clicking on an item content', () => { + it('should warn when switching from controlled to uncontrolled', () => { const response = render({ items: [{ id: '1' }, { id: '2' }], + selectedItems: [], }); - expect(response.isItemSelected('1')).to.equal(false); - - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(true); + expect(() => { + response.setProps({ selectedItems: undefined }); + }).toErrorDev( + 'MUI X: A component is changing the controlled selectedItems state of TreeView to be uncontrolled.', + ); }); - it('should not un-select selected item when clicking on an item content', () => { + it('should warn and not react to update when updating the default state', () => { const response = render({ items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: '1', + defaultSelectedItems: ['1'], }); - expect(response.isItemSelected('1')).to.equal(true); - - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(true); + expect(() => { + response.setProps({ defaultSelectedItems: ['2'] }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); + }).toErrorDev( + 'MUI X: A component is changing the default selectedItems state of an uncontrolled TreeView after being initialized. To suppress this warning opt to use a controlled TreeView.', + ); }); + }); - it('should not select an item when click and disableSelection', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - disableSelection: true, + describe('item click interaction', () => { + describe('single selection', () => { + it('should select un-selected item when clicking on an item content', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); + + expect(response.isItemSelected('1')).to.equal(false); + + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(true); }); - expect(response.isItemSelected('1')).to.equal(false); + it('should not un-select selected item when clicking on an item content', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: '1', + }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + expect(response.isItemSelected('1')).to.equal(true); - it('should not select an item when clicking on a disabled item content', () => { - const response = render({ - items: [{ id: '1', disabled: true }, { id: '2' }], + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(true); }); - expect(response.isItemSelected('1')).to.equal(false); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); - }); + it('should not select an item when click and disableSelection', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + disableSelection: true, + }); - describe('multi selection', () => { - it('should select un-selected item and remove other selected items when clicking on an item content', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['2'], + expect(response.isItemSelected('1')).to.equal(false); + + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); + it('should not select an item when clicking on a disabled item content', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }], + }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); + expect(response.isItemSelected('1')).to.equal(false); + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(false); + }); }); - it('should not un-select selected item when clicking on an item content', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1'], + describe('multi selection', () => { + it('should select un-selected item and remove other selected items when clicking on an item content', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['2'], + }); + + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); + + fireEvent.click(response.getItemContent('1')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); }); - expect(response.isItemSelected('1')).to.equal(true); + it('should not un-select selected item when clicking on an item content', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1'], + }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(true); - }); + expect(response.isItemSelected('1')).to.equal(true); - it('should un-select selected item when clicking on its content while holding Ctrl', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1', '2'], + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(true); }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(true); - fireEvent.click(response.getItemContent('1'), { ctrlKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - }); + it('should un-select selected item when clicking on its content while holding Ctrl', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1', '2'], + }); - it('should un-select selected item when clicking on its content while holding Meta', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1', '2'], + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2']); + fireEvent.click(response.getItemContent('1'), { ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(true); + it('should un-select selected item when clicking on its content while holding Meta', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1', '2'], + }); - fireEvent.click(response.getItemContent('1'), { metaKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2']); - it('should not select an item when click and disableSelection', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - disableSelection: true, + fireEvent.click(response.getItemContent('1'), { metaKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); }); - expect(response.isItemSelected('1')).to.equal(false); + it('should not select an item when click and disableSelection', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + disableSelection: true, + }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + expect(response.isItemSelected('1')).to.equal(false); - it('should not select an item when clicking on a disabled item content', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1', disabled: true }, { id: '2' }], + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + it('should not select an item when clicking on a disabled item content', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1', disabled: true }, { id: '2' }], + }); - it('should select un-selected item when clicking on its content while holding Ctrl', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }, { id: '3' }], - defaultSelectedItems: ['1'], + expect(response.isItemSelected('1')).to.equal(false); + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); + it('should select un-selected item when clicking on its content while holding Ctrl', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }, { id: '3' }], + defaultSelectedItems: ['1'], + }); - fireEvent.click(response.getItemContent('3'), { ctrlKey: true }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(true); - }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); - it('should expand the selection range when clicking on an item content below the last selected item while holding Shift', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + fireEvent.click(response.getItemContent('3'), { ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '3']); }); - fireEvent.click(response.getItemContent('2')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should do nothing when clicking on an item content on a fresh tree whil holding Shift', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + }); - fireEvent.click(response.getItemContent('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(true); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemContent('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); + }); - it('should expand the selection range when clicking on an item content above the last selected item while holding Shift', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + it('should expand the selection range when clicking on an item content below the last selected item while holding Shift', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + }); + + fireEvent.click(response.getItemContent('2')); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); + + fireEvent.click(response.getItemContent('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '2.1', '3']); }); - fireEvent.click(response.getItemContent('3')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); + it('should expand the selection range when clicking on an item content above the last selected item while holding Shift', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + }); - fireEvent.click(response.getItemContent('2'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(true); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemContent('3')); + expect(response.getSelectedTreeItems()).to.deep.equal(['3']); - it('should expand the selection range when clicking on an item content while holding Shift after un-selecting another item', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + fireEvent.click(response.getItemContent('2'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '2.1', '3']); }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should expand the selection range when clicking on an item content while holding Shift after un-selecting another item', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + }); - fireEvent.click(response.getItemContent('2'), { ctrlKey: true }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + fireEvent.click(response.getItemContent('1')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); - fireEvent.click(response.getItemContent('2'), { ctrlKey: true }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + fireEvent.click(response.getItemContent('2'), { ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2']); - fireEvent.click(response.getItemContent('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(true); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemContent('2'), { ctrlKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); - it('should not expand the selection range when clicking on a disabled item content then clicking on an item content while holding Shift', () => { - const response = render({ - multiSelect: true, - items: [ - { id: '1' }, - { id: '2', disabled: true }, - { id: '2.1' }, - { id: '3' }, - { id: '4' }, - ], + fireEvent.click(response.getItemContent('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2', '2.1', '3']); }); - fireEvent.click(response.getItemContent('2')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should not expand the selection range when clicking on a disabled item content then clicking on an item content while holding Shift', () => { + const response = render({ + multiSelect: true, + items: [ + { id: '1' }, + { id: '2', disabled: true }, + { id: '2.1' }, + { id: '3' }, + { id: '4' }, + ], + }); - fireEvent.click(response.getItemContent('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemContent('2')); + expect(response.getSelectedTreeItems()).to.deep.equal([]); - it('should not expand the selection range when clicking on an item content then clicking a disabled item content while holding Shift', () => { - const response = render({ - multiSelect: true, - items: [ - { id: '1' }, - { id: '2' }, - { id: '2.1' }, - { id: '3', disabled: true }, - { id: '4' }, - ], + fireEvent.click(response.getItemContent('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); }); - fireEvent.click(response.getItemContent('2')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should not expand the selection range when clicking on an item content then clicking a disabled item content while holding Shift', () => { + const response = render({ + multiSelect: true, + items: [ + { id: '1' }, + { id: '2' }, + { id: '2.1' }, + { id: '3', disabled: true }, + { id: '4' }, + ], + }); - fireEvent.click(response.getItemContent('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemContent('2')); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); - it('should not select disabled items that are part of the selected range', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + fireEvent.click(response.getItemContent('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); + it('should not select disabled items that are part of the selected range', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + }); - fireEvent.click(response.getItemContent('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(true); - }); - }); - }); + fireEvent.click(response.getItemContent('1')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); - describe('checkbox interaction', () => { - describe('render checkbox when needed', () => { - it('should not render a checkbox when checkboxSelection is not defined', () => { - const response = render({ - items: [{ id: '1' }], + fireEvent.click(response.getItemContent('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '3']); }); - expect(response.getItemCheckbox('1')).to.equal(null); - }); + it('should not crash when selecting multiple items in a deeply nested tree', () => { + const response = render({ + multiSelect: true, + items: [ + { id: '1', children: [{ id: '1.1', children: [{ id: '1.1.1' }] }] }, + { id: '2' }, + ], + defaultExpandedItems: ['1', '1.1'], + }); - it('should not render a checkbox when checkboxSelection is false', () => { - const response = render({ - checkboxSelection: false, - items: [{ id: '1' }], - }); + fireEvent.click(response.getItemContent('1.1.1')); + fireEvent.click(response.getItemContent('2'), { shiftKey: true }); - expect(response.getItemCheckbox('1')).to.equal(null); + expect(response.getSelectedTreeItems()).to.deep.equal(['1.1.1', '2']); + }); }); + }); - it('should render a checkbox when checkboxSelection is true', () => { - const response = render({ - checkboxSelection: true, - items: [{ id: '1' }], + describe('checkbox interaction', () => { + describe('render checkbox when needed', () => { + it('should not render a checkbox when checkboxSelection is not defined', () => { + const response = render({ + items: [{ id: '1' }], + }); + + expect(response.getItemCheckbox('1')).to.equal(null); }); - expect(response.getItemCheckbox('1')).not.to.equal(null); - }); - }); + it('should not render a checkbox when checkboxSelection is false', () => { + const response = render({ + checkboxSelection: false, + items: [{ id: '1' }], + }); - describe('single selection', () => { - it('should not change selection when clicking on an item content', () => { - const response = render({ - checkboxSelection: true, - items: [{ id: '1' }], + expect(response.getItemCheckbox('1')).to.equal(null); }); - expect(response.isItemSelected('1')).to.equal(false); + it('should render a checkbox when checkboxSelection is true', () => { + const response = render({ + checkboxSelection: true, + items: [{ id: '1' }], + }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(false); + expect(response.getItemCheckbox('1')).not.to.equal(null); + }); }); - it('should select un-selected item when clicking on an item checkbox', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - checkboxSelection: true, + describe('single selection', () => { + it('should not change selection when clicking on an item content', () => { + const response = render({ + checkboxSelection: true, + items: [{ id: '1' }], + }); + + expect(response.isItemSelected('1')).to.equal(false); + + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); + it('should select un-selected item when clicking on an item checkbox', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + checkboxSelection: true, + }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(true); - }); + expect(response.isItemSelected('1')).to.equal(false); - it('should un-select selected item when clicking on an item checkbox', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: '1', - checkboxSelection: true, + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.isItemSelected('1')).to.equal(true); }); - expect(response.isItemSelected('1')).to.equal(true); + it('should un-select selected item when clicking on an item checkbox', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: '1', + checkboxSelection: true, + }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + expect(response.isItemSelected('1')).to.equal(true); - it('should not select an item when click and disableSelection', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - disableSelection: true, - checkboxSelection: true, + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); + it('should not select an item when click and disableSelection', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + disableSelection: true, + checkboxSelection: true, + }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + expect(response.isItemSelected('1')).to.equal(false); - it('should not select an item when clicking on a disabled item checkbox', () => { - const response = render({ - items: [{ id: '1', disabled: true }, { id: '2' }], - checkboxSelection: true, + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); - }); + it('should not select an item when clicking on a disabled item checkbox', () => { + const response = render({ + items: [{ id: '1', disabled: true }, { id: '2' }], + checkboxSelection: true, + }); - describe('multi selection', () => { - it('should not change selection when clicking on an item content', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }], + expect(response.isItemSelected('1')).to.equal(false); + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.isItemSelected('1')).to.equal(false); }); + }); - expect(response.isItemSelected('1')).to.equal(false); + describe('multi selection', () => { + it('should not change selection when clicking on an item content', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }], + }); - fireEvent.click(response.getItemContent('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + expect(response.isItemSelected('1')).to.equal(false); - it('should select un-selected item and keep other items selected when clicking on an item checkbox', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['2'], + fireEvent.click(response.getItemContent('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); + it('should select un-selected item and keep other items selected when clicking on an item checkbox', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['2'], + }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(true); - }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); - it('should un-select selected item when clicking on an item checkbox', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1'], + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2']); }); - expect(response.isItemSelected('1')).to.equal(true); + it('should un-select selected item when clicking on an item checkbox', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1'], + }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + expect(response.isItemSelected('1')).to.equal(true); - it('should not select an item when click and disableSelection', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }, { id: '2' }], - disableSelection: true, + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); + it('should not select an item when click and disableSelection', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }, { id: '2' }], + disableSelection: true, + }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + expect(response.isItemSelected('1')).to.equal(false); - it('should not select an item when clicking on a disabled item content', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1', disabled: true }, { id: '2' }], + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - expect(response.isItemSelected('1')).to.equal(false); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(false); - }); + it('should not select an item when clicking on a disabled item content', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1', disabled: true }, { id: '2' }], + }); - it('should expand the selection range when clicking on an item checkbox below the last selected item while holding Shift', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + expect(response.isItemSelected('1')).to.equal(false); + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.isItemSelected('1')).to.equal(false); }); - fireEvent.click(response.getItemCheckboxInput('2')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should expand the selection range when clicking on an item checkbox below the last selected item while holding Shift', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + }); - fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(true); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemCheckboxInput('2')); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); - it('should expand the selection range when clicking on an item checkbox above the last selected item while holding Shift', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '2.1', '3']); }); - fireEvent.click(response.getItemCheckboxInput('3')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); + it('should expand the selection range when clicking on an item checkbox above the last selected item while holding Shift', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + }); - fireEvent.click(response.getItemCheckboxInput('2'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(true); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemCheckboxInput('3')); + expect(response.getSelectedTreeItems()).to.deep.equal(['3']); - it('should expand the selection range when clicking on an item checkbox while holding Shift after un-selecting another item', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + fireEvent.click(response.getItemCheckboxInput('2'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2', '2.1', '3']); }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should expand the selection range when clicking on an item checkbox while holding Shift after un-selecting another item', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }, { id: '2' }, { id: '2.1' }, { id: '3' }, { id: '4' }], + }); - fireEvent.click(response.getItemCheckboxInput('2')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); - fireEvent.click(response.getItemCheckboxInput('2')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + fireEvent.click(response.getItemCheckboxInput('2')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2']); - fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(true); - expect(response.isItemSelected('3')).to.equal(true); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemCheckboxInput('2')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); - it('should not expand the selection range when clicking on a disabled item checkbox then clicking on an item checkbox while holding Shift', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [ - { id: '1' }, - { id: '2', disabled: true }, - { id: '2.1' }, - { id: '3' }, - { id: '4' }, - ], + fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '2', '2.1', '3']); }); - fireEvent.click(response.getItemCheckboxInput('2')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should not expand the selection range when clicking on a disabled item checkbox then clicking on an item checkbox while holding Shift', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [ + { id: '1' }, + { id: '2', disabled: true }, + { id: '2.1' }, + { id: '3' }, + { id: '4' }, + ], + }); - fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemCheckboxInput('2')); + expect(response.getSelectedTreeItems()).to.deep.equal([]); - it('should not expand the selection range when clicking on an item checkbox then clicking a disabled item checkbox while holding Shift', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [ - { id: '1' }, - { id: '2' }, - { id: '2.1' }, - { id: '3', disabled: true }, - { id: '4' }, - ], + fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal([]); }); - fireEvent.click(response.getItemCheckboxInput('2')); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); + it('should not expand the selection range when clicking on an item checkbox then clicking a disabled item checkbox while holding Shift', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [ + { id: '1' }, + { id: '2' }, + { id: '2.1' }, + { id: '3', disabled: true }, + { id: '4' }, + ], + }); - fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(false); - expect(response.isItemSelected('2')).to.equal(true); - expect(response.isItemSelected('2.1')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); - expect(response.isItemSelected('4')).to.equal(false); - }); + fireEvent.click(response.getItemCheckboxInput('2')); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); - it('should not select disabled items that are part of the selected range', () => { - const response = render({ - multiSelect: true, - checkboxSelection: true, - items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['2']); }); - fireEvent.click(response.getItemCheckboxInput('1')); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(false); + it('should not select disabled items that are part of the selected range', () => { + const response = render({ + multiSelect: true, + checkboxSelection: true, + items: [{ id: '1' }, { id: '2', disabled: true }, { id: '3' }], + }); - fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); - expect(response.isItemSelected('1')).to.equal(true); - expect(response.isItemSelected('2')).to.equal(false); - expect(response.isItemSelected('3')).to.equal(true); - }); - }); - }); + fireEvent.click(response.getItemCheckboxInput('1')); + expect(response.getSelectedTreeItems()).to.deep.equal(['1']); - describe('aria-multiselectable tree attribute', () => { - it('should have the attribute `aria-multiselectable=false if using single select`', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], + fireEvent.click(response.getItemCheckboxInput('3'), { shiftKey: true }); + expect(response.getSelectedTreeItems()).to.deep.equal(['1', '3']); + }); }); - - expect(response.getRoot()).to.have.attribute('aria-multiselectable', 'false'); - }); - - it('should have the attribute `aria-multiselectable=true if using multi select`', () => { - const response = render({ items: [{ id: '1' }, { id: '2' }], multiSelect: true }); - - expect(response.getRoot()).to.have.attribute('aria-multiselectable', 'true'); }); - }); - // The `aria-selected` attribute is used by the `response.isItemSelected` method. - // This `describe` only tests basics scenarios, more complex scenarios are tested in this file's other `describe`. - describe('aria-selected item attribute', () => { - describe('single selection', () => { - it('should not have the attribute `aria-selected=false` if not selected', () => { + describe('aria-multiselectable tree attribute', () => { + it('should have the attribute `aria-multiselectable=false if using single select`', () => { const response = render({ items: [{ id: '1' }, { id: '2' }], }); - expect(response.getItemRoot('1')).not.to.have.attribute('aria-selected'); + expect(response.getRoot()).to.have.attribute('aria-multiselectable', 'false'); }); - it('should have the attribute `aria-selected=true` if selected', () => { - const response = render({ - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: '1', - }); + it('should have the attribute `aria-multiselectable=true if using multi select`', () => { + const response = render({ items: [{ id: '1' }, { id: '2' }], multiSelect: true }); - expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'true'); + expect(response.getRoot()).to.have.attribute('aria-multiselectable', 'true'); }); }); - describe('multi selection', () => { - it('should have the attribute `aria-selected=false` if not selected', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], + // The `aria-selected` attribute is used by the `response.isItemSelected` method. + // This `describe` only tests basics scenarios, more complex scenarios are tested in this file's other `describe`. + describe('aria-selected item attribute', () => { + describe('single selection', () => { + it('should not have the attribute `aria-selected=false` if not selected', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + }); + + expect(response.getItemRoot('1')).not.to.have.attribute('aria-selected'); }); - expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'false'); + it('should have the attribute `aria-selected=true` if selected', () => { + const response = render({ + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: '1', + }); + + expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'true'); + }); }); - it('should have the attribute `aria-selected=true` if selected', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1'], + describe('multi selection', () => { + it('should have the attribute `aria-selected=false` if not selected', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + }); + + expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'false'); }); - expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'true'); - }); + it('should have the attribute `aria-selected=true` if selected', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1'], + }); - it('should have the attribute `aria-selected=false` if disabledSelection is true', () => { - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - disableSelection: true, + expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'true'); }); - expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'false'); + it('should have the attribute `aria-selected=false` if disabledSelection is true', () => { + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + disableSelection: true, + }); + + expect(response.getItemRoot('1')).to.have.attribute('aria-selected', 'false'); + }); }); }); - }); - describe('onItemSelectionToggle prop', () => { - it('should call the onItemSelectionToggle callback when selecting an item', () => { - const onItemSelectionToggle = spy(); + describe('onItemSelectionToggle prop', () => { + it('should call the onItemSelectionToggle callback when selecting an item', () => { + const onItemSelectionToggle = spy(); + + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + onItemSelectionToggle, + }); - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - onItemSelectionToggle, + fireEvent.click(response.getItemContent('1')); + expect(onItemSelectionToggle.callCount).to.equal(1); + expect(onItemSelectionToggle.lastCall.args[1]).to.equal('1'); + expect(onItemSelectionToggle.lastCall.args[2]).to.equal(true); }); - fireEvent.click(response.getItemContent('1')); - expect(onItemSelectionToggle.callCount).to.equal(1); - expect(onItemSelectionToggle.lastCall.args[1]).to.equal('1'); - expect(onItemSelectionToggle.lastCall.args[2]).to.equal(true); - }); + it('should call the onItemSelectionToggle callback when un-selecting an item', () => { + const onItemSelectionToggle = spy(); - it('should call the onItemSelectionToggle callback when un-selecting an item', () => { - const onItemSelectionToggle = spy(); + const response = render({ + multiSelect: true, + items: [{ id: '1' }, { id: '2' }], + defaultSelectedItems: ['1'], + onItemSelectionToggle, + }); - const response = render({ - multiSelect: true, - items: [{ id: '1' }, { id: '2' }], - defaultSelectedItems: ['1'], - onItemSelectionToggle, + fireEvent.click(response.getItemContent('1'), { ctrlKey: true }); + expect(onItemSelectionToggle.callCount).to.equal(1); + expect(onItemSelectionToggle.lastCall.args[1]).to.equal('1'); + expect(onItemSelectionToggle.lastCall.args[2]).to.equal(false); }); - - fireEvent.click(response.getItemContent('1'), { ctrlKey: true }); - expect(onItemSelectionToggle.callCount).to.equal(1); - expect(onItemSelectionToggle.lastCall.args[1]).to.equal('1'); - expect(onItemSelectionToggle.lastCall.args[2]).to.equal(false); }); - }); -}); + }, +); diff --git a/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.ts b/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.ts index 005ab581ce1e..56474f46a0ba 100644 --- a/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.ts +++ b/packages/x-tree-view/src/internals/plugins/useTreeViewSelection/useTreeViewSelection.types.ts @@ -4,6 +4,11 @@ import { UseTreeViewItemsSignature } from '../useTreeViewItems'; import { UseTreeViewExpansionSignature } from '../useTreeViewExpansion'; export interface UseTreeViewSelectionInstance { + /** + * Check if an item is selected. + * @param {TreeViewItemId} itemId The id of the item to check. + * @returns {boolean} `true` if the item is selected, `false` otherwise. + */ isItemSelected: (itemId: string) => boolean; /** * Select or deselect an item. diff --git a/packages/x-tree-view/src/internals/useTreeView/useTreeView.test.tsx b/packages/x-tree-view/src/internals/useTreeView/useTreeView.test.tsx new file mode 100644 index 000000000000..2fba6b0a8ab9 --- /dev/null +++ b/packages/x-tree-view/src/internals/useTreeView/useTreeView.test.tsx @@ -0,0 +1,64 @@ +import * as React from 'react'; +import { expect } from 'chai'; +import { fireEvent, act } from '@mui/internal-test-utils'; +import { + describeTreeView, + DescribeTreeViewRendererUtils, +} from 'test/utils/tree-view/describeTreeView'; + +describeTreeView<[]>( + 'useTreeView hook', + ({ render, renderFromJSX, treeViewComponentName, TreeViewComponent, TreeItemComponent }) => { + it('should have the role="tree" on the root slot', () => { + const response = render({ items: [{ id: '1' }] }); + + expect(response.getRoot()).to.have.attribute('role', 'tree'); + }); + + it('should work inside a Portal', () => { + let response: DescribeTreeViewRendererUtils; + if (treeViewComponentName === 'SimpleTreeView') { + response = renderFromJSX( + <React.Fragment> + <button type="button">Some focusable element</button> + <TreeViewComponent> + <TreeItemComponent itemId="1" label="1" data-testid="1" /> + <TreeItemComponent itemId="2" label="2" data-testid="2" /> + <TreeItemComponent itemId="3" label="3" data-testid="3" /> + <TreeItemComponent itemId="4" label="4" data-testid="4" /> + </TreeViewComponent> + </React.Fragment>, + ); + } else { + response = renderFromJSX( + <React.Fragment> + <button type="button">Some focusable element</button> + <TreeViewComponent + items={[{ id: '1' }, { id: '2' }, { id: '3' }, { id: '4' }]} + slots={{ + item: TreeItemComponent, + }} + slotProps={{ + item: (ownerState) => ({ 'data-testid': ownerState.itemId }) as any, + }} + getItemLabel={(item) => item.id} + /> + </React.Fragment>, + ); + } + + act(() => { + response.getItemRoot('1').focus(); + }); + + fireEvent.keyDown(response.getItemRoot('1'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('2'); + + fireEvent.keyDown(response.getItemRoot('2'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('3'); + + fireEvent.keyDown(response.getItemRoot('3'), { key: 'ArrowDown' }); + expect(response.getFocusedItemId()).to.equal('4'); + }); + }, +); diff --git a/packages/x-tree-view/src/internals/useTreeView/useTreeView.ts b/packages/x-tree-view/src/internals/useTreeView/useTreeView.ts index 3898b90cc232..1bc1b6ed2279 100644 --- a/packages/x-tree-view/src/internals/useTreeView/useTreeView.ts +++ b/packages/x-tree-view/src/internals/useTreeView/useTreeView.ts @@ -5,11 +5,11 @@ import { TreeViewAnyPluginSignature, TreeViewInstance, TreeViewPlugin, - ConvertPluginsIntoSignatures, - MergePluginsProperty, + MergeSignaturesProperty, TreeItemWrapper, TreeRootWrapper, TreeViewPublicAPI, + ConvertSignaturesIntoPlugins, } from '../models'; import { UseTreeViewDefaultizedParameters, @@ -18,8 +18,8 @@ import { UseTreeViewRootSlotProps, } from './useTreeView.types'; import { useTreeViewModels } from './useTreeViewModels'; -import { TreeViewContextValue } from '../TreeViewProvider'; -import { TREE_VIEW_CORE_PLUGINS } from '../corePlugins'; +import { TreeViewContextValue, TreeViewItemPluginsRunner } from '../TreeViewProvider'; +import { TREE_VIEW_CORE_PLUGINS, TreeViewCorePluginSignatures } from '../corePlugins'; export function useTreeViewApiInitialization<T>( inputApiRef: React.MutableRefObject<T> | undefined, @@ -36,36 +36,37 @@ export function useTreeViewApiInitialization<T>( return fallbackPublicApiRef.current; } -export const useTreeView = <Plugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]>( - inParams: UseTreeViewParameters<Plugins>, -): UseTreeViewReturnValue<ConvertPluginsIntoSignatures<Plugins>> => { - const plugins = [...TREE_VIEW_CORE_PLUGINS, ...inParams.plugins]; - type Signatures = ConvertPluginsIntoSignatures<typeof plugins>; +export const useTreeView = <TSignatures extends readonly TreeViewAnyPluginSignature[]>( + inParams: UseTreeViewParameters<TSignatures>, +): UseTreeViewReturnValue<TSignatures> => { + type TSignaturesWithCorePluginSignatures = readonly [ + ...TreeViewCorePluginSignatures, + ...TSignatures, + ]; + const plugins = [ + ...TREE_VIEW_CORE_PLUGINS, + ...inParams.plugins, + ] as unknown as ConvertSignaturesIntoPlugins<TSignaturesWithCorePluginSignatures>; const params = plugins.reduce((acc, plugin) => { if (plugin.getDefaultizedParams) { - return plugin.getDefaultizedParams(acc); + return plugin.getDefaultizedParams(acc) as typeof acc; } return acc; - }, inParams) as unknown as UseTreeViewDefaultizedParameters<Plugins>; + }, inParams) as unknown as UseTreeViewDefaultizedParameters<TSignatures>; - const models = useTreeViewModels( - plugins, - params as MergePluginsProperty<Signatures, 'defaultizedParams'>, - ); - const instanceRef = React.useRef<TreeViewInstance<Signatures>>( - {} as TreeViewInstance<Signatures>, - ); - const instance = instanceRef.current as TreeViewInstance<Signatures>; + const models = useTreeViewModels<TSignaturesWithCorePluginSignatures>(plugins, params); + const instanceRef = React.useRef({} as TreeViewInstance<TSignatures>); + const instance = instanceRef.current as TreeViewInstance<TSignatures>; - const publicAPI = useTreeViewApiInitialization<TreeViewPublicAPI<Signatures>>(inParams.apiRef); + const publicAPI = useTreeViewApiInitialization<TreeViewPublicAPI<TSignatures>>(inParams.apiRef); const innerRootRef: React.RefObject<HTMLUListElement> = React.useRef(null); const handleRootRef = useForkRef(innerRootRef, inParams.rootRef); const [state, setState] = React.useState(() => { - const temp = {} as MergePluginsProperty<Signatures, 'state'>; + const temp = {} as MergeSignaturesProperty<TSignaturesWithCorePluginSignatures, 'state'>; plugins.forEach((plugin) => { if (plugin.getInitialState) { Object.assign( @@ -78,47 +79,33 @@ export const useTreeView = <Plugins extends readonly TreeViewPlugin<TreeViewAnyP return temp; }); - const rootPropsGetters: (<TOther extends EventHandlers = {}>( - otherHandlers: TOther, - ) => React.HTMLAttributes<HTMLUListElement>)[] = []; - const contextValue = { - publicAPI, - instance: instance as TreeViewInstance<any>, - rootRef: innerRootRef, - } as TreeViewContextValue<Signatures>; - - const runPlugin = (plugin: TreeViewPlugin<TreeViewAnyPluginSignature>) => { - const pluginResponse = plugin({ - instance, - params, - slots: params.slots, - slotProps: params.slotProps, - state, - setState, - rootRef: innerRootRef, - models, + const itemWrappers = plugins + .map((plugin) => plugin.wrapItem) + .filter((wrapItem): wrapItem is TreeItemWrapper<any> => !!wrapItem); + const wrapItem: TreeItemWrapper<TSignatures> = ({ itemId, children }) => { + let finalChildren: React.ReactNode = children; + itemWrappers.forEach((itemWrapper) => { + finalChildren = itemWrapper({ itemId, children: finalChildren, instance }); }); - if (pluginResponse.getRootProps) { - rootPropsGetters.push(pluginResponse.getRootProps); - } - - if (pluginResponse.publicAPI) { - Object.assign(publicAPI, pluginResponse.publicAPI); - } + return finalChildren; + }; - if (pluginResponse.instance) { - Object.assign(instance, pluginResponse.instance); - } + const rootWrappers = plugins + .map((plugin) => plugin.wrapRoot) + .filter((wrapRoot): wrapRoot is TreeRootWrapper<any> => !!wrapRoot) + // The wrappers are reversed to ensure that the first wrapper is the outermost one. + .reverse(); + const wrapRoot: TreeRootWrapper<TSignatures> = ({ children }) => { + let finalChildren: React.ReactNode = children; + rootWrappers.forEach((rootWrapper) => { + finalChildren = rootWrapper({ children: finalChildren, instance }); + }); - if (pluginResponse.contextValue) { - Object.assign(contextValue, pluginResponse.contextValue); - } + return finalChildren; }; - plugins.forEach(runPlugin); - - contextValue.runItemPlugins = (itemPluginProps) => { + const runItemPlugins: TreeViewItemPluginsRunner = (itemPluginProps) => { let finalRootRef: React.RefCallback<HTMLLIElement> | null = null; let finalContentRef: React.RefCallback<HTMLElement> | null = null; @@ -146,30 +133,50 @@ export const useTreeView = <Plugins extends readonly TreeViewPlugin<TreeViewAnyP }; }; - const itemWrappers = plugins - .map((plugin) => plugin.wrapItem) - .filter((wrapItem): wrapItem is TreeItemWrapper => !!wrapItem); - contextValue.wrapItem = ({ itemId, children }) => { - let finalChildren: React.ReactNode = children; - itemWrappers.forEach((itemWrapper) => { - finalChildren = itemWrapper({ itemId, children: finalChildren }); + const contextValue = { + publicAPI, + wrapItem, + wrapRoot, + runItemPlugins, + instance: instance as TreeViewInstance<any>, + rootRef: innerRootRef, + } as TreeViewContextValue<TSignatures>; + + const rootPropsGetters: (<TOther extends EventHandlers = {}>( + otherHandlers: TOther, + ) => React.HTMLAttributes<HTMLUListElement>)[] = []; + const runPlugin = (plugin: TreeViewPlugin<TreeViewAnyPluginSignature>) => { + const pluginResponse = plugin({ + instance, + params, + slots: params.slots, + slotProps: params.slotProps, + experimentalFeatures: params.experimentalFeatures, + state, + setState, + rootRef: innerRootRef, + models, }); - return finalChildren; - }; + if (pluginResponse.getRootProps) { + rootPropsGetters.push(pluginResponse.getRootProps); + } - const rootWrappers = plugins - .map((plugin) => plugin.wrapRoot) - .filter((wrapRoot): wrapRoot is TreeRootWrapper => !!wrapRoot); - contextValue.wrapRoot = ({ children }) => { - let finalChildren: React.ReactNode = children; - rootWrappers.forEach((rootWrapper) => { - finalChildren = rootWrapper({ children: finalChildren }); - }); + if (pluginResponse.publicAPI) { + Object.assign(publicAPI, pluginResponse.publicAPI); + } - return finalChildren; + if (pluginResponse.instance) { + Object.assign(instance, pluginResponse.instance); + } + + if (pluginResponse.contextValue) { + Object.assign(contextValue, pluginResponse.contextValue); + } }; + plugins.forEach(runPlugin); + const getRootProps = <TOther extends EventHandlers = {}>( otherHandlers: TOther = {} as TOther, ) => { @@ -189,7 +196,7 @@ export const useTreeView = <Plugins extends readonly TreeViewPlugin<TreeViewAnyP return { getRootProps, rootRef: handleRootRef, - contextValue: contextValue as any, - instance: instance as any, + contextValue, + instance, }; }; diff --git a/packages/x-tree-view/src/internals/useTreeView/useTreeView.types.ts b/packages/x-tree-view/src/internals/useTreeView/useTreeView.types.ts index 0ff481abccae..e01053f06b07 100644 --- a/packages/x-tree-view/src/internals/useTreeView/useTreeView.types.ts +++ b/packages/x-tree-view/src/internals/useTreeView/useTreeView.types.ts @@ -3,34 +3,33 @@ import { EventHandlers } from '@mui/base/utils'; import type { TreeViewContextValue } from '../TreeViewProvider'; import { TreeViewAnyPluginSignature, - TreeViewPlugin, - ConvertPluginsIntoSignatures, - MergePluginsProperty, + ConvertSignaturesIntoPlugins, + MergeSignaturesProperty, TreeViewInstance, TreeViewPublicAPI, + TreeViewExperimentalFeatures, } from '../models'; +import { TreeViewCorePluginSignatures } from '../corePlugins'; -export type UseTreeViewParameters< - TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[], -> = UseTreeViewBaseParameters<TPlugins> & - MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'params'>; +export type UseTreeViewParameters<TSignatures extends readonly TreeViewAnyPluginSignature[]> = + UseTreeViewBaseParameters<TSignatures> & + Omit<MergeSignaturesProperty<TSignatures, 'params'>, keyof UseTreeViewBaseParameters<any>>; export interface UseTreeViewBaseParameters< - TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[], + TSignatures extends readonly TreeViewAnyPluginSignature[], > { - apiRef: - | React.MutableRefObject<TreeViewPublicAPI<ConvertPluginsIntoSignatures<TPlugins>>> - | undefined; + apiRef: React.MutableRefObject<TreeViewPublicAPI<TSignatures>> | undefined; rootRef?: React.Ref<HTMLUListElement> | undefined; - plugins: TPlugins; - slots: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'slots'>; - slotProps: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'slotProps'>; + plugins: ConvertSignaturesIntoPlugins<TSignatures>; + slots: MergeSignaturesProperty<TSignatures, 'slots'>; + slotProps: MergeSignaturesProperty<TSignatures, 'slotProps'>; + experimentalFeatures: TreeViewExperimentalFeatures<TSignatures>; } export type UseTreeViewDefaultizedParameters< - TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[], -> = UseTreeViewBaseParameters<TPlugins> & - MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'defaultizedParams'>; + TSignatures extends readonly TreeViewAnyPluginSignature[], +> = UseTreeViewBaseParameters<TSignatures> & + MergeSignaturesProperty<[...TreeViewCorePluginSignatures, ...TSignatures], 'defaultizedParams'>; export interface UseTreeViewRootSlotProps extends Pick< @@ -40,11 +39,11 @@ export interface UseTreeViewRootSlotProps ref: React.Ref<HTMLUListElement>; } -export interface UseTreeViewReturnValue<TPlugins extends readonly TreeViewAnyPluginSignature[]> { +export interface UseTreeViewReturnValue<TSignatures extends readonly TreeViewAnyPluginSignature[]> { getRootProps: <TOther extends EventHandlers = {}>( otherHandlers?: TOther, ) => UseTreeViewRootSlotProps; rootRef: React.RefCallback<HTMLUListElement> | null; - contextValue: TreeViewContextValue<TPlugins>; - instance: TreeViewInstance<TPlugins>; + contextValue: TreeViewContextValue<TSignatures>; + instance: TreeViewInstance<TSignatures>; } diff --git a/packages/x-tree-view/src/internals/useTreeView/useTreeViewModels.ts b/packages/x-tree-view/src/internals/useTreeView/useTreeViewModels.ts index 83b346ca9479..42d861fb7fa2 100644 --- a/packages/x-tree-view/src/internals/useTreeView/useTreeViewModels.ts +++ b/packages/x-tree-view/src/internals/useTreeView/useTreeViewModels.ts @@ -1,25 +1,19 @@ import * as React from 'react'; import { TreeViewAnyPluginSignature, - TreeViewPlugin, - ConvertPluginsIntoSignatures, - MergePluginsProperty, + ConvertSignaturesIntoPlugins, + MergeSignaturesProperty, } from '../models'; /** * Implements the same behavior as `useControlled` but for several models. - * The controlled models are never stored in the state and the state is only updated if the model is not controlled. + * The controlled models are never stored in the state, and the state is only updated if the model is not controlled. */ -export const useTreeViewModels = < - TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[], ->( - plugins: TPlugins, - props: MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'defaultizedParams'>, +export const useTreeViewModels = <TSignatures extends readonly TreeViewAnyPluginSignature[]>( + plugins: ConvertSignaturesIntoPlugins<TSignatures>, + props: MergeSignaturesProperty<TSignatures, 'defaultizedParams'>, ) => { - type DefaultizedParams = MergePluginsProperty< - ConvertPluginsIntoSignatures<TPlugins>, - 'defaultizedParams' - >; + type DefaultizedParams = MergeSignaturesProperty<TSignatures, 'defaultizedParams'>; const modelsRef = React.useRef<{ [modelName: string]: { @@ -65,7 +59,7 @@ export const useTreeViewModels = < }, ]; }), - ) as MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'models'>; + ) as MergeSignaturesProperty<TSignatures, 'models'>; // We know that `modelsRef` do not vary across renders. /* eslint-disable react-hooks/rules-of-hooks, react-hooks/exhaustive-deps */ diff --git a/packages/x-tree-view/src/internals/utils/extractPluginParamsFromProps.ts b/packages/x-tree-view/src/internals/utils/extractPluginParamsFromProps.ts index 6f0ae94843db..facfbd3bc3d0 100644 --- a/packages/x-tree-view/src/internals/utils/extractPluginParamsFromProps.ts +++ b/packages/x-tree-view/src/internals/utils/extractPluginParamsFromProps.ts @@ -1,33 +1,33 @@ import * as React from 'react'; import { - ConvertPluginsIntoSignatures, - MergePluginsProperty, - TreeViewPlugin, + ConvertSignaturesIntoPlugins, + MergeSignaturesProperty, + TreeViewAnyPluginSignature, + TreeViewExperimentalFeatures, TreeViewPublicAPI, } from '../models'; import { UseTreeViewBaseParameters } from '../useTreeView/useTreeView.types'; export const extractPluginParamsFromProps = < - TPlugins extends readonly TreeViewPlugin<any>[], - TSlots extends MergePluginsProperty<TPlugins, 'slots'>, - TSlotProps extends MergePluginsProperty<TPlugins, 'slotProps'>, + TSignatures extends readonly TreeViewAnyPluginSignature[], + TSlots extends MergeSignaturesProperty<TSignatures, 'slots'>, + TSlotProps extends MergeSignaturesProperty<TSignatures, 'slotProps'>, TProps extends { slots?: TSlots; slotProps?: TSlotProps; - apiRef?: React.MutableRefObject< - TreeViewPublicAPI<ConvertPluginsIntoSignatures<TPlugins>> | undefined - >; + apiRef?: React.MutableRefObject<TreeViewPublicAPI<TSignatures> | undefined>; + experimentalFeatures?: TreeViewExperimentalFeatures<TSignatures>; }, >({ - props: { slots, slotProps, apiRef, ...props }, + props: { slots, slotProps, apiRef, experimentalFeatures, ...props }, plugins, rootRef, }: { props: TProps; - plugins: TPlugins; + plugins: ConvertSignaturesIntoPlugins<TSignatures>; rootRef?: React.Ref<HTMLUListElement>; }) => { - type PluginParams = MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, 'params'>; + type PluginParams = MergeSignaturesProperty<TSignatures, 'params'>; const paramsLookup = {} as Record<keyof PluginParams, true>; plugins.forEach((plugin) => { @@ -39,8 +39,9 @@ export const extractPluginParamsFromProps = < rootRef, slots: slots ?? {}, slotProps: slotProps ?? {}, + experimentalFeatures: experimentalFeatures ?? {}, apiRef, - } as UseTreeViewBaseParameters<TPlugins> & PluginParams; + } as UseTreeViewBaseParameters<TSignatures> & PluginParams; const otherProps = {} as Omit<TProps, keyof PluginParams>; Object.keys(props).forEach((propName) => { diff --git a/packages/x-tree-view/src/internals/utils/tree.ts b/packages/x-tree-view/src/internals/utils/tree.ts index 1293374356c0..54c935a19f55 100644 --- a/packages/x-tree-view/src/internals/utils/tree.ts +++ b/packages/x-tree-view/src/internals/utils/tree.ts @@ -22,7 +22,7 @@ const getLastNavigableItemInArray = ( export const getPreviousNavigableItem = ( instance: TreeViewInstance<[UseTreeViewItemsSignature, UseTreeViewExpansionSignature]>, itemId: string, -) => { +): string | null => { const itemMeta = instance.getItemMeta(itemId); const siblings = instance.getItemOrderedChildrenIds(itemMeta.parentId); const itemIndex = instance.getItemIndex(itemId); @@ -32,7 +32,27 @@ export const getPreviousNavigableItem = ( return itemMeta.parentId; } - let currentItemId: string = siblings[itemIndex - 1]; + // Finds the previous navigable sibling. + let previousNavigableSiblingIndex = itemIndex - 1; + while ( + !instance.isItemNavigable(siblings[previousNavigableSiblingIndex]) && + previousNavigableSiblingIndex >= 0 + ) { + previousNavigableSiblingIndex -= 1; + } + + if (previousNavigableSiblingIndex === -1) { + // If we are at depth 0, then it means all the items above the current item are not navigable. + if (itemMeta.parentId == null) { + return null; + } + + // Otherwise, we can try to go up a level and find the previous navigable item. + return getPreviousNavigableItem(instance, itemMeta.parentId); + } + + // Finds the last navigable ancestor of the previous navigable sibling. + let currentItemId: string = siblings[previousNavigableSiblingIndex]; let lastNavigableChild = getLastNavigableItemInArray( instance, instance.getItemOrderedChildrenIds(currentItemId), diff --git a/packages/x-tree-view/src/internals/zero-styled/index.ts b/packages/x-tree-view/src/internals/zero-styled/index.ts new file mode 100644 index 000000000000..ac070a82614d --- /dev/null +++ b/packages/x-tree-view/src/internals/zero-styled/index.ts @@ -0,0 +1,8 @@ +import { useThemeProps } from '@mui/material/styles'; + +export { styled } from '@mui/material/styles'; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export function createUseThemeProps(name: string) { + return useThemeProps; +} diff --git a/packages/x-tree-view/src/useTreeItem2/useTreeItem2.test.tsx b/packages/x-tree-view/src/useTreeItem2/useTreeItem2.test.tsx new file mode 100644 index 000000000000..e35e9df63ba0 --- /dev/null +++ b/packages/x-tree-view/src/useTreeItem2/useTreeItem2.test.tsx @@ -0,0 +1,177 @@ +import * as React from 'react'; +import { expect } from 'chai'; +import { spy } from 'sinon'; +import { act, createEvent, fireEvent, screen } from '@mui/internal-test-utils'; +import { + describeTreeView, + DescribeTreeViewRendererUtils, +} from 'test/utils/tree-view/describeTreeView'; +import { + UseTreeViewExpansionSignature, + UseTreeViewIconsSignature, +} from '@mui/x-tree-view/internals'; +import { treeItemClasses } from '@mui/x-tree-view/TreeItem'; + +describeTreeView<[UseTreeViewExpansionSignature, UseTreeViewIconsSignature]>( + 'useTreeItem2 hook', + ({ + render, + renderFromJSX, + treeItemComponentName, + TreeItemComponent, + treeViewComponentName, + TreeViewComponent, + }) => { + describe('role prop', () => { + it('should have the role="treeitem" on the root slot', () => { + const response = render({ items: [{ id: '1' }] }); + + expect(response.getItemRoot('1')).to.have.attribute('role', 'treeitem'); + }); + + it('should have the role "group" on the groupTransition slot if the item is expandable', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + }); + + expect( + response.getItemRoot('1').querySelector(`.${treeItemClasses.groupTransition}`), + ).to.have.attribute('role', 'group'); + }); + }); + + describe('onClick prop', () => { + it('should call onClick when clicked, but not when children are clicked for TreeItem', () => { + const onClick = spy(); + + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + slotProps: { + item: { + onClick, + }, + }, + }); + + fireEvent.click(response.getItemContent('1.1')); + expect(onClick.callCount).to.equal(treeItemComponentName === 'TreeItem' ? 1 : 2); + expect(onClick.lastCall.firstArg.target.parentElement.dataset.testid).to.equal('1.1'); + }); + + it('should call onClick even when the element is disabled', () => { + const onClick = spy(); + + const response = render({ + items: [{ id: '1', disabled: true }], + slotProps: { + item: { + onClick, + }, + }, + }); + + fireEvent.click(response.getItemContent('1')); + expect(onClick.callCount).to.equal(1); + }); + }); + + it('should be able to type in a child input', () => { + const response = render({ + items: [{ id: '1', children: [{ id: '1.1' }] }], + defaultExpandedItems: ['1'], + slotProps: + treeItemComponentName === 'TreeItem2' + ? { + item: { + slots: { + label: () => <input type="text" className="icon-input " />, + }, + }, + } + : { + item: { + label: <input type="text" className="icon-input " />, + }, + }, + }); + + const input = response.getItemRoot('1.1').querySelector('.icon-input')!; + const keydownEvent = createEvent.keyDown(input, { + key: 'a', + }); + + const handlePreventDefault = spy(); + keydownEvent.preventDefault = handlePreventDefault; + fireEvent(input, keydownEvent); + expect(handlePreventDefault.callCount).to.equal(0); + }); + + it('should not focus steal', () => { + let setActiveItemMounted; + // a TreeItem whose mounted state we can control with `setActiveItemMounted` + function ConditionallyMountedItem(props) { + const [mounted, setMounted] = React.useState(true); + if (props.itemId === '2') { + setActiveItemMounted = setMounted; + } + + if (!mounted) { + return null; + } + return <TreeItemComponent {...props} />; + } + + let response: DescribeTreeViewRendererUtils; + if (treeViewComponentName === 'SimpleTreeView') { + response = renderFromJSX( + <React.Fragment> + <button type="button">Some focusable element</button> + <TreeViewComponent> + <ConditionallyMountedItem itemId="1" label="1" data-testid="1" /> + <ConditionallyMountedItem itemId="2" label="2" data-testid="2" /> + </TreeViewComponent> + </React.Fragment>, + ); + } else { + response = renderFromJSX( + <React.Fragment> + <button type="button">Some focusable element</button> + <TreeViewComponent + items={[{ id: '1' }, { id: '2' }]} + slots={{ + item: ConditionallyMountedItem, + }} + slotProps={{ + item: (ownerState) => ({ 'data-testid': ownerState.itemId }) as any, + }} + getItemLabel={(item) => item.id} + /> + </React.Fragment>, + ); + } + + act(() => { + response.getItemRoot('2').focus(); + }); + + expect(response.getFocusedItemId()).to.equal('2'); + + act(() => { + screen.getByRole('button').focus(); + }); + + expect(screen.getByRole('button')).toHaveFocus(); + + act(() => { + setActiveItemMounted(false); + }); + act(() => { + setActiveItemMounted(true); + }); + + expect(screen.getByRole('button')).toHaveFocus(); + }); + }, +); diff --git a/packages/x-tree-view/src/useTreeItem2/useTreeItem2.ts b/packages/x-tree-view/src/useTreeItem2/useTreeItem2.ts index 047bf9660b52..479e022efa9c 100644 --- a/packages/x-tree-view/src/useTreeItem2/useTreeItem2.ts +++ b/packages/x-tree-view/src/useTreeItem2/useTreeItem2.ts @@ -12,20 +12,25 @@ import { UseTreeItem2CheckboxSlotProps, } from './useTreeItem2.types'; import { useTreeViewContext } from '../internals/TreeViewProvider/useTreeViewContext'; -import { DefaultTreeViewPlugins } from '../internals/plugins/defaultPlugins'; +import { DefaultTreeViewPluginSignatures } from '../internals/plugins/defaultPlugins'; import { MuiCancellableEvent } from '../internals/models/MuiCancellableEvent'; import { useTreeItem2Utils } from '../hooks/useTreeItem2Utils'; +import { TreeViewItemDepthContext } from '../internals/TreeViewItemDepthContext'; -export const useTreeItem2 = <TPlugins extends DefaultTreeViewPlugins = DefaultTreeViewPlugins>( +export const useTreeItem2 = < + TSignatures extends DefaultTreeViewPluginSignatures = DefaultTreeViewPluginSignatures, +>( parameters: UseTreeItem2Parameters, -): UseTreeItem2ReturnValue<TPlugins> => { +): UseTreeItem2ReturnValue<TSignatures> => { const { runItemPlugins, selection: { multiSelect, disableSelection, checkboxSelection }, disabledItemsFocusable, + indentationAtItemLevel, instance, publicAPI, - } = useTreeViewContext<TPlugins>(); + } = useTreeViewContext<TSignatures>(); + const depthContext = React.useContext(TreeViewItemDepthContext); const { id, itemId, label, children, rootRef } = parameters; @@ -134,7 +139,7 @@ export const useTreeItem2 = <TPlugins extends DefaultTreeViewPlugins = DefaultTr ariaSelected = true; } - return { + const response: UseTreeItem2RootSlotProps<ExternalProps> = { ...externalEventHandlers, ref: handleRootRef, role: 'treeitem', @@ -148,6 +153,15 @@ export const useTreeItem2 = <TPlugins extends DefaultTreeViewPlugins = DefaultTr onBlur: createRootHandleBlur(externalEventHandlers), onKeyDown: createRootHandleKeyDown(externalEventHandlers), }; + + if (indentationAtItemLevel) { + response.style = { + '--TreeView-itemDepth': + typeof depthContext === 'function' ? depthContext(itemId) : depthContext, + } as React.CSSProperties; + } + + return response; }; const getContentProps = <ExternalProps extends Record<string, any> = {}>( @@ -155,7 +169,7 @@ export const useTreeItem2 = <TPlugins extends DefaultTreeViewPlugins = DefaultTr ): UseTreeItem2ContentSlotProps<ExternalProps> => { const externalEventHandlers = extractEventHandlers(externalProps); - return { + const response: UseTreeItem2ContentSlotProps<ExternalProps> = { ...externalEventHandlers, ...externalProps, ref: contentRef, @@ -163,6 +177,12 @@ export const useTreeItem2 = <TPlugins extends DefaultTreeViewPlugins = DefaultTr onMouseDown: createContentHandleMouseDown(externalEventHandlers), status, }; + + if (indentationAtItemLevel) { + response.indentationAtItemLevel = true; + } + + return response; }; const getCheckboxProps = <ExternalProps extends Record<string, any> = {}>( @@ -213,7 +233,7 @@ export const useTreeItem2 = <TPlugins extends DefaultTreeViewPlugins = DefaultTr ): UseTreeItem2GroupTransitionSlotProps<ExternalProps> => { const externalEventHandlers = extractEventHandlers(externalProps); - return { + const response: UseTreeItem2GroupTransitionSlotProps<ExternalProps> = { ...externalEventHandlers, unmountOnExit: true, component: 'ul', @@ -222,6 +242,12 @@ export const useTreeItem2 = <TPlugins extends DefaultTreeViewPlugins = DefaultTr children, ...externalProps, }; + + if (indentationAtItemLevel) { + response.indentationAtItemLevel = true; + } + + return response; }; return { diff --git a/packages/x-tree-view/src/useTreeItem2/useTreeItem2.types.ts b/packages/x-tree-view/src/useTreeItem2/useTreeItem2.types.ts index 7ec4004defad..530c0db1ec4d 100644 --- a/packages/x-tree-view/src/useTreeItem2/useTreeItem2.types.ts +++ b/packages/x-tree-view/src/useTreeItem2/useTreeItem2.types.ts @@ -40,6 +40,10 @@ export interface UseTreeItem2RootSlotOwnProps { onBlur: MuiCancellableEventHandler<React.FocusEvent<HTMLElement>>; onKeyDown: MuiCancellableEventHandler<React.KeyboardEvent<HTMLElement>>; ref: React.RefCallback<HTMLLIElement>; + /** + * Only defined when the `indentationAtItemLevel` experimental feature is enabled. + */ + style?: React.CSSProperties; } export type UseTreeItem2RootSlotProps<ExternalProps = {}> = ExternalProps & @@ -50,6 +54,10 @@ export interface UseTreeItem2ContentSlotOwnProps { onMouseDown: MuiCancellableEventHandler<React.MouseEvent>; ref: React.RefCallback<HTMLDivElement> | null; status: UseTreeItem2Status; + /** + * Only defined when the `indentationAtItemLevel` experimental feature is enabled. + */ + indentationAtItemLevel?: true; } export type UseTreeItem2ContentSlotProps<ExternalProps = {}> = ExternalProps & @@ -85,6 +93,10 @@ export interface UseTreeItem2GroupTransitionSlotOwnProps { component: 'ul'; role: 'group'; children: React.ReactNode; + /** + * Only defined when the `indentationAtItemLevel` experimental feature is enabled. + */ + indentationAtItemLevel?: true; } export type UseTreeItem2GroupTransitionSlotProps<ExternalProps = {}> = ExternalProps & @@ -98,7 +110,9 @@ export interface UseTreeItem2Status { disabled: boolean; } -export interface UseTreeItem2ReturnValue<TPlugins extends readonly TreeViewAnyPluginSignature[]> { +export interface UseTreeItem2ReturnValue< + TSignatures extends readonly TreeViewAnyPluginSignature[], +> { /** * Resolver for the root slot's props. * @param {ExternalProps} externalProps Additional props for the root slot @@ -158,5 +172,5 @@ export interface UseTreeItem2ReturnValue<TPlugins extends readonly TreeViewAnyPl /** * The object the allows Tree View manipulation. */ - publicAPI: TreeViewPublicAPI<TPlugins>; + publicAPI: TreeViewPublicAPI<TSignatures>; } diff --git a/packages/x-tree-view/tsconfig.json b/packages/x-tree-view/tsconfig.json index 0c69aefe6800..8f928a498c68 100644 --- a/packages/x-tree-view/tsconfig.json +++ b/packages/x-tree-view/tsconfig.json @@ -1,7 +1,12 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "types": ["@mui/material/themeCssVarsAugmentation"], + "types": [ + "@mui/internal-test-utils/initMatchers", + "@mui/material/themeCssVarsAugmentation", + "chai-dom", + "mocha" + ], "noImplicitAny": false }, "include": ["src/**/*"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f17206c2438c..450255a2db30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -24,50 +24,50 @@ importers: specifier: ^1.5.5 version: 1.5.5 '@babel/cli': - specifier: ^7.24.5 - version: 7.24.5(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/core': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@babel/node': - specifier: ^7.23.9 - version: 7.23.9(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-class-properties': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-object-rest-spread': - specifier: ^7.24.5 - version: 7.24.5(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-private-methods': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-private-property-in-object': - specifier: ^7.24.5 - version: 7.24.5(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-react-constant-elements': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-runtime': - specifier: ^7.24.3 - version: 7.24.3(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/preset-env': - specifier: ^7.24.5 - version: 7.24.5(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/preset-react': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/preset-typescript': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/register': - specifier: ^7.23.7 - version: 7.23.7(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/traverse': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@babel/types': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@emotion/cache': specifier: ^11.11.0 version: 11.11.0 @@ -76,22 +76,25 @@ importers: version: 11.11.4(@types/react@18.2.60)(react@18.2.0) '@emotion/styled': specifier: ^11.11.5 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mnajdova/enzyme-adapter-react-18': specifier: ^0.2.0 - version: 0.2.0(enzyme@3.11.0)(react-dom@18.2.0)(react@18.2.0) + version: 0.2.0(enzyme@3.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/icons-material': - specifier: ^5.15.14 - version: 5.15.15(@mui/material@5.15.15)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.19 + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/internal-markdown': - specifier: ^1.0.3 - version: 1.0.3 + specifier: ^1.0.4 + version: 1.0.4 + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.15.19 + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/monorepo': - specifier: github:mui/material-ui#3c888ed6cf0774815c32c6309e8cea2d8b5e684b - version: github.com/mui/material-ui/3c888ed6cf0774815c32c6309e8cea2d8b5e684b(@opentelemetry/api@1.8.0) + specifier: github:mui/material-ui#f0026ad5bf4e1957cebd65b882bf45219514ca64 + version: https://codeload.github.com/mui/material-ui/tar.gz/f0026ad5bf4e1957cebd65b882bf45219514ca64(@opentelemetry/api@1.8.0)(encoding@0.1.13) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -100,16 +103,16 @@ importers: version: 14.2.3 '@octokit/plugin-retry': specifier: ^6.0.1 - version: 6.0.1(@octokit/core@5.1.0) + version: 6.0.1(@octokit/core@4.2.4(encoding@0.1.13)) '@octokit/rest': - specifier: ^20.0.2 - version: 20.0.2 + specifier: ^20.1.1 + version: 20.1.1 '@playwright/test': - specifier: ^1.43.1 - version: 1.43.1 + specifier: ^1.44.1 + version: 1.44.1 '@testing-library/react': - specifier: ^14.2.1 - version: 14.2.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^15.0.7 + version: 15.0.7(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 @@ -125,27 +128,27 @@ importers: '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 + '@types/karma': + specifier: ^6.3.8 + version: 6.3.8 '@types/lodash': - specifier: ^4.17.1 - version: 4.17.1 + specifier: ^4.17.4 + version: 4.17.4 '@types/mocha': specifier: ^10.0.6 version: 10.0.6 '@types/node': specifier: ^18.19.33 version: 18.19.33 - '@types/prettier': - specifier: ^2.7.3 - version: 2.7.3 '@types/react': specifier: ^18.2.60 version: 18.2.60 '@types/react-dom': - specifier: ^18.2.19 - version: 18.2.19 + specifier: ^18.2.25 + version: 18.2.25 '@types/react-test-renderer': - specifier: ^18.0.7 - version: 18.0.7 + specifier: ^18.3.0 + version: 18.3.0 '@types/requestidlecallback': specifier: ^0.3.7 version: 0.3.7 @@ -156,20 +159,20 @@ importers: specifier: ^17.0.32 version: 17.0.32 '@typescript-eslint/eslint-plugin': - specifier: ^7.8.0 - version: 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) + specifier: ^7.12.0 + version: 7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^7.12.0 + version: 7.12.0(eslint@8.57.0)(typescript@5.4.5) autoprefixer: specifier: ^10.4.19 version: 10.4.19(postcss@8.4.38) axe-core: - specifier: 4.8.4 - version: 4.8.4 + specifier: 4.9.1 + version: 4.9.1 babel-loader: specifier: ^9.1.3 - version: 9.1.3(@babel/core@7.24.5)(webpack@5.91.0) + version: 9.1.3(@babel/core@7.24.6)(webpack@5.91.0(webpack-cli@5.1.4)) babel-plugin-istanbul: specifier: ^6.1.1 version: 6.1.1 @@ -199,7 +202,7 @@ importers: version: 1.12.0(chai@4.4.1) compression-webpack-plugin: specifier: ^11.1.0 - version: 11.1.0(webpack@5.91.0) + version: 11.1.0(webpack@5.91.0(webpack-cli@5.1.4)) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -210,14 +213,14 @@ importers: specifier: ^7.0.3 version: 7.0.3 danger: - specifier: ^11.3.1 - version: 11.3.1 + specifier: ^12.3.0 + version: 12.3.0(encoding@0.1.13) date-fns-jalali-v3: specifier: npm:date-fns-jalali@3.6.0-0 - version: /date-fns-jalali@3.6.0-0 + version: date-fns-jalali@3.6.0-0 date-fns-v3: specifier: npm:date-fns@3.6.0 - version: /date-fns@3.6.0 + version: date-fns@3.6.0 enzyme: specifier: ^3.11.0 version: 3.11.0 @@ -226,25 +229,25 @@ importers: version: 8.57.0 eslint-config-airbnb: specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.1)(eslint@8.57.0) + version: 19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.34.2(eslint@8.57.0))(eslint@8.57.0) eslint-config-airbnb-typescript: specifier: ^18.0.0 - version: 18.0.0(@typescript-eslint/eslint-plugin@7.8.0)(@typescript-eslint/parser@7.8.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 18.0.0(@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint@8.57.0) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) eslint-import-resolver-webpack: specifier: ^0.13.8 - version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0) + version: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0(webpack-cli@5.1.4)) eslint-plugin-filenames: specifier: ^1.3.2 version: 1.3.2(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) eslint-plugin-jsdoc: - specifier: ^48.2.3 - version: 48.2.3(eslint@8.57.0) + specifier: ^48.2.7 + version: 48.2.7(eslint@8.57.0) eslint-plugin-jsx-a11y: specifier: ^6.8.0 version: 6.8.0(eslint@8.57.0) @@ -256,10 +259,13 @@ importers: version: 10.4.3(eslint@8.57.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.0) eslint-plugin-react: - specifier: ^7.34.1 - version: 7.34.1(eslint@8.57.0) + specifier: ^7.34.2 + version: 7.34.2(eslint@8.57.0) + eslint-plugin-react-compiler: + specifier: 0.0.0-experimental-51a85ea-20240601 + version: 0.0.0-experimental-51a85ea-20240601(eslint@8.57.0) eslint-plugin-react-hooks: specifier: ^4.6.2 version: 4.6.2(eslint@8.57.0) @@ -280,10 +286,10 @@ importers: version: 14.0.1 html-webpack-plugin: specifier: ^5.6.0 - version: 5.6.0(webpack@5.91.0) + version: 5.6.0(webpack@5.91.0(webpack-cli@5.1.4)) jsdom: - specifier: 23.1.0 - version: 23.1.0 + specifier: 24.1.0 + version: 24.1.0 jss: specifier: ^10.10.0 version: 10.10.0 @@ -310,10 +316,10 @@ importers: version: 0.4.0 karma-webpack: specifier: ^5.0.1 - version: 5.0.1(webpack@5.91.0) + version: 5.0.1(webpack@5.91.0(webpack-cli@5.1.4)) lerna: - specifier: ^8.1.2 - version: 8.1.2 + specifier: ^8.1.3 + version: 8.1.3(encoding@0.1.13) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -333,11 +339,11 @@ importers: specifier: ^15.1.0 version: 15.1.0 prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.0 + version: 3.3.0 pretty-quick: specifier: ^4.0.0 - version: 4.0.0(prettier@3.2.5) + version: 4.0.0(prettier@3.3.0) process: specifier: ^0.11.10 version: 0.11.10 @@ -350,6 +356,9 @@ importers: remark: specifier: ^13.0.0 version: 13.0.0 + rimraf: + specifier: ^5.0.7 + version: 5.0.7 serve: specifier: ^14.2.3 version: 14.2.3 @@ -361,13 +370,13 @@ importers: version: 3.0.0 string-replace-loader: specifier: ^3.1.0 - version: 3.1.0(webpack@5.91.0) + version: 3.1.0(webpack@5.91.0(webpack-cli@5.1.4)) terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.10(webpack@5.91.0) + version: 5.3.10(webpack@5.91.0(webpack-cli@5.1.4)) tsx: - specifier: ^4.7.3 - version: 4.7.3 + specifier: ^4.11.0 + version: 4.11.0 typescript: specifier: ^5.4.5 version: 5.4.5 @@ -381,11 +390,11 @@ importers: specifier: ^5.91.0 version: 5.91.0(webpack-cli@5.1.4) webpack-bundle-analyzer: - specifier: ^4.10.1 - version: 4.10.1 + specifier: ^4.10.2 + version: 4.10.2 webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0) + version: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0) yargs: specifier: ^17.7.2 version: 17.7.2 @@ -393,17 +402,17 @@ importers: docs: dependencies: '@babel/core': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@babel/runtime-corejs2': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@docsearch/react': specifier: ^3.6.0 - version: 3.6.0(@algolia/client-search@4.22.1)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) + version: 3.6.0(@algolia/client-search@4.22.1)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(search-insights@2.13.0) '@emotion/cache': specifier: ^11.11.0 version: 11.11.0 @@ -415,31 +424,31 @@ importers: version: 11.11.0 '@emotion/styled': specifier: ^11.11.5 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/base': specifier: ^5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/icons-material': - specifier: ^5.15.14 - version: 5.15.15(@mui/material@5.15.15)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.19 + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/joy': - specifier: ^5.0.0-beta.32 - version: 5.0.0-beta.32(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.0.0-beta.32 + version: 5.0.0-beta.32(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/lab': - specifier: ^5.0.0-alpha.169 - version: 5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.0.0-alpha.170 + version: 5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.15.19 + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material-nextjs': specifier: ^5.15.11 - version: 5.15.11(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.15)(@types/react@18.2.60)(next@14.2.3)(react@18.2.0) + version: 5.15.11(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) '@mui/styles': - specifier: ^5.15.14 - version: 5.15.15(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.19 + version: 5.15.19(@types/react@18.2.60)(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -469,7 +478,7 @@ importers: version: link:../packages/x-tree-view/build '@react-spring/web': specifier: ^9.7.3 - version: 9.7.3(react-dom@18.2.0)(react@18.2.0) + version: 9.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ast-types: specifier: ^0.14.2 version: 0.14.2 @@ -529,7 +538,7 @@ importers: version: 3.1.0 jscodeshift: specifier: 0.13.1 - version: 0.13.1(@babel/preset-env@7.24.5) + version: 0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -542,9 +551,6 @@ importers: markdown-to-jsx: specifier: ^7.4.7 version: 7.4.7(react@18.2.0) - marked: - specifier: ^5.1.2 - version: 5.1.2 moment: specifier: ^2.30.1 version: 2.30.1 @@ -559,7 +565,7 @@ importers: version: 0.5.45 next: specifier: ^14.2.3 - version: 14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(@playwright/test@1.43.1)(react-dom@18.2.0)(react@18.2.0) + version: 14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) nprogress: specifier: ^0.2.0 version: 0.2.0 @@ -572,9 +578,6 @@ importers: prop-types: specifier: ^15.8.1 version: 15.8.1 - raw-loader: - specifier: ^1.0.0 - version: 1.0.0(webpack@4.47.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -585,51 +588,51 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-hook-form: - specifier: ^7.51.4 - version: 7.51.4(react@18.2.0) + specifier: ^7.51.5 + version: 7.51.5(react@18.2.0) react-is: specifier: ^18.2.0 version: 18.2.0 react-router: - specifier: ^6.22.3 - version: 6.22.3(react@18.2.0) + specifier: ^6.23.1 + version: 6.23.1(react@18.2.0) react-router-dom: - specifier: ^6.22.3 - version: 6.22.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.23.1 + version: 6.23.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-runner: specifier: ^1.0.3 - version: 1.0.3(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-simple-code-editor: specifier: ^0.13.1 - version: 0.13.1(react-dom@18.2.0)(react@18.2.0) + version: 0.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) recast: - specifier: ^0.23.6 - version: 0.23.6 + specifier: ^0.23.9 + version: 0.23.9 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 rxjs: specifier: ^7.8.1 version: 7.8.1 styled-components: - specifier: ^6.1.8 - version: 6.1.8(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.1.11 + version: 6.1.11(react-dom@18.2.0(react@18.2.0))(react@18.2.0) stylis: - specifier: ^4.3.1 - version: 4.3.1 + specifier: ^4.3.2 + version: 4.3.2 stylis-plugin-rtl: specifier: ^2.1.1 - version: 2.1.1(stylis@4.3.1) + version: 2.1.1(stylis@4.3.2) webpack-bundle-analyzer: - specifier: ^4.10.1 - version: 4.10.1 + specifier: ^4.10.2 + version: 4.10.2 devDependencies: '@babel/plugin-transform-react-constant-elements': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@babel/preset-typescript': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) + specifier: ^7.24.6 + version: 7.24.6(@babel/core@7.24.6) '@mui/internal-docs-utils': specifier: ^1.0.4 version: 1.0.4 @@ -646,8 +649,8 @@ importers: specifier: ^0.0.9 version: 0.0.9 '@types/lodash': - specifier: ^4.17.1 - version: 4.17.1 + specifier: ^4.17.4 + version: 4.17.4 '@types/luxon': specifier: ^3.4.2 version: 3.4.2 @@ -658,17 +661,17 @@ importers: specifier: ^0.7.9 version: 0.7.9 '@types/react-dom': - specifier: 18.2.19 - version: 18.2.19 + specifier: 18.2.25 + version: 18.2.25 '@types/react-router-dom': specifier: ^5.3.3 version: 5.3.3 '@types/stylis': - specifier: ^4.2.5 - version: 4.2.5 + specifier: ^4.2.6 + version: 4.2.6 '@types/webpack-bundle-analyzer': specifier: ^4.7.0 - version: 4.7.0(webpack-cli@5.1.4) + version: 4.7.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0)) gm: specifier: ^1.25.0 version: 1.25.0 @@ -682,41 +685,139 @@ importers: specifier: ^8.56.10 version: 8.56.10 '@typescript-eslint/parser': - specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^7.12.0 + version: 7.12.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/utils': - specifier: ^7.8.0 - version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^7.12.0 + version: 7.12.0(eslint@8.57.0)(typescript@5.4.5) packages/x-charts: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@emotion/react': specifier: ^11.9.0 version: 11.11.4(@types/react@18.2.60)(react@18.2.0) '@emotion/styled': specifier: ^11.8.1 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/base': specifier: ^5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) + '@mui/utils': + specifier: ^5.15.14 + version: 5.15.14(@types/react@18.2.60)(react@18.2.0) + '@react-spring/rafz': + specifier: ^9.7.3 + version: 9.7.3 + '@react-spring/web': + specifier: ^9.7.3 + version: 9.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + d3-color: + specifier: ^3.1.0 + version: 3.1.0 + d3-delaunay: + specifier: ^6.0.4 + version: 6.0.4 + d3-interpolate: + specifier: ^3.0.1 + version: 3.0.1 + d3-scale: + specifier: ^4.0.2 + version: 4.0.2 + d3-shape: + specifier: ^3.2.0 + version: 3.2.0 + prop-types: + specifier: ^15.8.1 + version: 15.8.1 + react: + specifier: ^17.0.0 || ^18.0.0 + version: 18.2.0 + react-dom: + specifier: ^17.0.0 || ^18.0.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-spring/core': + specifier: ^9.7.3 + version: 9.7.3(react@18.2.0) + '@react-spring/shared': + specifier: ^9.7.3 + version: 9.7.3(react@18.2.0) + '@types/d3-color': + specifier: ^3.1.3 + version: 3.1.3 + '@types/d3-delaunay': + specifier: ^6.0.4 + version: 6.0.4 + '@types/d3-interpolate': + specifier: ^3.0.4 + version: 3.0.4 + '@types/d3-scale': + specifier: ^4.0.8 + version: 4.0.8 + '@types/d3-shape': + specifier: ^3.1.6 + version: 3.1.6 + '@types/prop-types': + specifier: ^15.7.12 + version: 15.7.12 + csstype: + specifier: ^3.1.3 + version: 3.1.3 + rimraf: + specifier: ^5.0.7 + version: 5.0.7 + publishDirectory: build + + packages/x-charts-pro: + dependencies: + '@babel/runtime': + specifier: ^7.24.6 + version: 7.24.6 + '@emotion/react': + specifier: ^11.9.0 + version: 11.11.4(@types/react@18.2.60)(react@18.2.0) + '@emotion/styled': + specifier: ^11.8.1 + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) + '@mui/base': + specifier: ^5.0.0-beta.40 + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) + '@mui/x-charts': + specifier: workspace:* + version: link:../x-charts/build + '@mui/x-license': + specifier: workspace:* + version: link:../x-license/build '@react-spring/rafz': specifier: ^9.7.3 version: 9.7.3 '@react-spring/web': specifier: ^9.7.3 - version: 9.7.3(react-dom@18.2.0)(react@18.2.0) + version: 9.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -773,27 +874,27 @@ importers: specifier: ^3.1.3 version: 3.1.3 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-codemod: dependencies: '@babel/core': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@babel/traverse': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 jscodeshift: specifier: 0.13.1 - version: 0.13.1(@babel/preset-env@7.24.5) + version: 0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6)) jscodeshift-add-imports: specifier: ^1.0.10 - version: 1.0.10(jscodeshift@0.13.1) + version: 1.0.10(jscodeshift@0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6))) yargs: specifier: ^17.7.2 version: 17.7.2 @@ -808,21 +909,21 @@ importers: specifier: ^0.5.45 version: 0.5.45 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-data-grid: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -842,9 +943,12 @@ importers: specifier: ^4.1.8 version: 4.1.8 devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/joy': - specifier: ^5.0.0-beta.24 - version: 5.0.0-beta.32(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + specifier: 5.0.0-beta.32 + version: 5.0.0-beta.32(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/types': specifier: ^7.2.14 version: 7.2.14(@types/react@18.2.60) @@ -852,24 +956,24 @@ importers: specifier: ^15.7.12 version: 15.7.12 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-data-grid-generator: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@mui/base': specifier: ^5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/icons-material': specifier: ^5.4.1 - version: 5.15.15(@mui/material@5.15.15)(@types/react@18.2.60)(react@18.2.0) + version: 5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/x-data-grid-premium': specifier: workspace:* version: link:../x-data-grid-premium/build @@ -893,21 +997,21 @@ importers: specifier: ^7.10.10 version: 7.10.10 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-data-grid-premium: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -942,6 +1046,9 @@ importers: specifier: ^4.1.8 version: 4.1.8 devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/prop-types': specifier: ^15.7.12 version: 15.7.12 @@ -949,21 +1056,21 @@ importers: specifier: ^2.30.0 version: 2.30.0 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-data-grid-pro: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -992,34 +1099,37 @@ importers: specifier: ^4.1.8 version: 4.1.8 devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/prop-types': specifier: ^15.7.12 version: 15.7.12 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-date-pickers: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@emotion/react': specifier: ^11.9.0 version: 11.11.4(@types/react@18.2.60)(react@18.2.0) '@emotion/styled': specifier: ^11.8.1 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/base': specifier: ^5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -1040,8 +1150,11 @@ importers: version: 18.2.0(react@18.2.0) react-transition-group: specifier: ^4.4.5 - version: 4.4.5(react-dom@18.2.0)(react@18.2.0) + version: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/luxon': specifier: ^3.4.2 version: 3.4.2 @@ -1079,30 +1192,30 @@ importers: specifier: ^0.5.45 version: 0.5.45 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-date-pickers-pro: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@emotion/react': specifier: ^11.9.0 version: 11.11.4(@types/react@18.2.60)(react@18.2.0) '@emotion/styled': specifier: ^11.8.1 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/base': specifier: ^5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -1132,8 +1245,11 @@ importers: version: 18.2.0(react@18.2.0) react-transition-group: specifier: ^4.4.5 - version: 4.4.5(react-dom@18.2.0)(react@18.2.0) + version: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/luxon': specifier: ^3.4.2 version: 3.4.2 @@ -1156,15 +1272,15 @@ importers: specifier: ^2.30.1 version: 2.30.1 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-license: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -1172,31 +1288,34 @@ importers: specifier: ^17.0.0 || ^18.0.0 version: 18.2.0 devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-tree-view: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@emotion/react': specifier: ^11.9.0 version: 11.11.4(@types/react@18.2.60)(react@18.2.0) '@emotion/styled': specifier: ^11.8.1 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/base': specifier: ^5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -1217,36 +1336,39 @@ importers: version: 18.2.0(react@18.2.0) react-transition-group: specifier: ^4.4.5 - version: 4.4.5(react-dom@18.2.0)(react@18.2.0) + version: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/prop-types': specifier: ^15.7.12 version: 15.7.12 rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 publishDirectory: build packages/x-tree-view-pro: dependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@emotion/react': specifier: ^11.9.0 version: 11.11.4(@types/react@18.2.60)(react@18.2.0) '@emotion/styled': specifier: ^11.8.1 - version: 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + version: 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/base': specifier: ^5.0.0-beta.40 - version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/system': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + specifier: ^5.15.15 + version: 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/utils': specifier: ^5.15.14 version: 5.15.14(@types/react@18.2.60)(react@18.2.0) @@ -1273,17 +1395,20 @@ importers: version: 18.2.0(react@18.2.0) react-transition-group: specifier: ^4.4.5 - version: 4.4.5(react-dom@18.2.0)(react@18.2.0) + version: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) devDependencies: + '@mui/internal-test-utils': + specifier: 1.0.0 + version: 1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) rimraf: - specifier: ^5.0.5 - version: 5.0.5 + specifier: ^5.0.7 + version: 5.0.7 test: devDependencies: '@babel/runtime': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.6 + version: 7.24.6 '@emotion/cache': specifier: ^11.11.0 version: 11.11.0 @@ -1291,8 +1416,8 @@ importers: specifier: ^11.11.4 version: 11.11.4(@types/react@18.2.60)(react@18.2.0) '@mui/material': - specifier: ^5.15.14 - version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + specifier: ^5.15.19 + version: 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/x-data-grid': specifier: workspace:* version: link:../packages/x-data-grid/build @@ -1309,14 +1434,17 @@ importers: specifier: workspace:* version: link:../packages/x-license/build '@playwright/test': - specifier: ^1.43.1 - version: 1.43.1 + specifier: ^1.44.1 + version: 1.44.1 '@react-spring/web': specifier: ^9.7.3 - version: 9.7.3(react-dom@18.2.0)(react@18.2.0) + version: 9.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/chai': specifier: ^4.3.16 version: 4.3.16 + '@types/karma': + specifier: ^6.3.8 + version: 6.3.8 '@types/moment-jalaali': specifier: ^0.7.9 version: 0.7.9 @@ -1348,1527 +1476,822 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-router-dom: - specifier: ^6.22.3 - version: 6.22.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.23.1 + version: 6.23.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) stylis: - specifier: ^4.3.1 - version: 4.3.1 + specifier: ^4.3.2 + version: 4.3.2 stylis-plugin-rtl: specifier: ^2.1.1 - version: 2.1.1(stylis@4.3.1) + version: 2.1.1(stylis@4.3.2) packages: - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): + '@algolia/autocomplete-core@1.9.3': resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - dev: false - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0): + '@algolia/autocomplete-plugin-algolia-insights@1.9.3': resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - dev: false - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): + '@algolia/autocomplete-preset-algolia@1.9.3': resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - '@algolia/client-search': 4.22.1 - algoliasearch: 4.22.1 - dev: false - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): + '@algolia/autocomplete-shared@1.9.3': resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/client-search': 4.22.1 - algoliasearch: 4.22.1 - dev: false - /@algolia/cache-browser-local-storage@4.22.1: + '@algolia/cache-browser-local-storage@4.22.1': resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} - dependencies: - '@algolia/cache-common': 4.22.1 - dev: false - /@algolia/cache-common@4.22.1: + '@algolia/cache-common@4.22.1': resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} - dev: false - /@algolia/cache-in-memory@4.22.1: + '@algolia/cache-in-memory@4.22.1': resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} - dependencies: - '@algolia/cache-common': 4.22.1 - dev: false - /@algolia/client-account@4.22.1: + '@algolia/client-account@4.22.1': resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: false - /@algolia/client-analytics@4.22.1: + '@algolia/client-analytics@4.22.1': resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: false - /@algolia/client-common@4.22.1: + '@algolia/client-common@4.22.1': resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} - dependencies: - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: false - /@algolia/client-personalization@4.22.1: + '@algolia/client-personalization@4.22.1': resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: false - /@algolia/client-search@4.22.1: + '@algolia/client-search@4.22.1': resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: false - /@algolia/logger-common@4.22.1: + '@algolia/logger-common@4.22.1': resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} - dev: false - /@algolia/logger-console@4.22.1: + '@algolia/logger-console@4.22.1': resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} - dependencies: - '@algolia/logger-common': 4.22.1 - dev: false - /@algolia/requester-browser-xhr@4.22.1: + '@algolia/requester-browser-xhr@4.22.1': resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} - dependencies: - '@algolia/requester-common': 4.22.1 - dev: false - /@algolia/requester-common@4.22.1: + '@algolia/requester-common@4.22.1': resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} - dev: false - /@algolia/requester-node-http@4.22.1: + '@algolia/requester-node-http@4.22.1': resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} - dependencies: - '@algolia/requester-common': 4.22.1 - dev: false - /@algolia/transporter@4.22.1: + '@algolia/transporter@4.22.1': resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} - dependencies: - '@algolia/cache-common': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - dev: false - /@ampproject/remapping@2.2.1: + '@ampproject/remapping@2.2.1': resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - /@argos-ci/core@1.5.5: + '@argos-ci/core@1.5.5': resolution: {integrity: sha512-m271rCtp5fnpUU89eSlS/If5WnDIUGduEHfW9YrwVHnMYWPCNBDxp2q87Wgjl3O5RTm/x+sDED3vFD9i1q+yTQ==} engines: {node: '>=16.0.0'} - dependencies: - '@argos-ci/util': 1.2.1 - axios: 1.6.7(debug@4.3.4) - convict: 6.2.4 - debug: 4.3.4(supports-color@8.1.1) - fast-glob: 3.3.2 - sharp: 0.32.6 - tmp: 0.2.1 - transitivePeerDependencies: - - supports-color - dev: true - /@argos-ci/util@1.2.1: + '@argos-ci/util@1.2.1': resolution: {integrity: sha512-/o7t0TcSED3BsBnnPrvXdmT+reThGMoGC9Lk+TTghrEE9GFlSKhjBmfYt4fUgXj5hQIe5tcdO01BVB2TsjjYSw==} engines: {node: '>=16.0.0'} - dev: true - /@babel/cli@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg==} + '@babel/cli@7.24.6': + resolution: {integrity: sha512-Sm/YhG/0REw9SKByFHDf4hkk7PYsjcsOyZgHGz1nvab4tUTQ9N4XVv+ykK0Y+VCJ3OshA/7EDyxnwCd8NEP/mQ==} engines: {node: '>=6.9.0'} hasBin: true peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@jridgewell/trace-mapping': 0.3.25 - commander: 4.1.1 - convert-source-map: 2.0.0 - fs-readdir-recursive: 1.1.0 - glob: 7.2.3 - make-dir: 2.1.0 - slash: 2.0.0 - optionalDependencies: - '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 - chokidar: 3.5.3 - dev: true - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/code-frame@7.24.6': + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 - /@babel/compat-data@7.24.4: - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/compat-data@7.24.6': + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.5: - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/core@7.24.6': + resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/generator@7.24.5: - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/generator@7.24.6': + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-annotate-as-pure@7.24.6': + resolution: {integrity: sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': + resolution: {integrity: sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.24.6': + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + '@babel/helper-create-class-features-plugin@7.24.6': + resolution: {integrity: sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-create-regexp-features-plugin@7.24.6': + resolution: {integrity: sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.5): + '@babel/helper-define-polyfill-provider@0.6.1': resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.6': + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.6': + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.6': + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-member-expression-to-functions@7.24.5: - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + '@babel/helper-member-expression-to-functions@7.24.6': + resolution: {integrity: sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.24.6': + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helper-module-transforms@7.24.6': + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + '@babel/helper-optimise-call-expression@7.24.6': + resolution: {integrity: sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-plugin-utils@7.24.5: - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/helper-plugin-utils@7.24.6': + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/helper-remap-async-to-generator@7.24.6': + resolution: {integrity: sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/helper-replace-supers@7.24.6': + resolution: {integrity: sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - /@babel/helper-simple-access@7.24.5: - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/helper-simple-access@7.24.6': + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': + resolution: {integrity: sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-split-export-declaration@7.24.5: - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/helper-split-export-declaration@7.24.6': + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.24.6': + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.24.5: - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + '@babel/helper-validator-identifier@7.24.6': + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.24.6': + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + '@babel/helper-wrap-function@7.24.6': + resolution: {integrity: sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - /@babel/helpers@7.24.5: - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + '@babel/helpers@7.24.6': + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color - /@babel/highlight@7.24.2: - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/highlight@7.24.6': + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.0 - /@babel/node@7.23.9(@babel/core@7.24.5): - resolution: {integrity: sha512-/d4ju/POwlGIJlZ+NqWH1qu61wt6ZlTZZZutrK2MOSdaH1JCh726nLw/GSvAjG+LTY6CO9SsB8uWcttnFKm6yg==} + '@babel/node@7.24.6': + resolution: {integrity: sha512-63bD/Kbh1Vl6HapTZLSsyaGlQhhpF1/GpyS1oJotroJKoamOgKKEEKk3iHZAkicjcr+n4V4zdB0V+8siv6AZ5Q==} engines: {node: '>=6.9.0'} hasBin: true peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/register': 7.23.7(@babel/core@7.24.5) - commander: 4.1.1 - core-js: 3.35.1 - node-environment-flags: 1.0.6 - regenerator-runtime: 0.14.1 - v8flags: 3.2.0 - dev: true - /@babel/parser@7.24.5: - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + '@babel/parser@7.24.6': + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.24.5 - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6': + resolution: {integrity: sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.6': + resolution: {integrity: sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.6': + resolution: {integrity: sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.6': + resolution: {integrity: sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.5): + '@babel/plugin-proposal-class-properties@7.18.6': resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.5): + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.5): + '@babel/plugin-proposal-optional-chaining@7.21.0': resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5): + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): + '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): + '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5): + '@babel/plugin-syntax-class-static-block@7.14.5': resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5): + '@babel/plugin-syntax-dynamic-import@7.8.3': resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5): + '@babel/plugin-syntax-export-namespace-from@7.8.3': resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.24.5): + '@babel/plugin-syntax-flow@7.23.3': resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: false - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} + '@babel/plugin-syntax-import-assertions@7.24.6': + resolution: {integrity: sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} + '@babel/plugin-syntax-import-attributes@7.24.6': + resolution: {integrity: sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): + '@babel/plugin-syntax-import-meta@7.10.4': resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): + '@babel/plugin-syntax-json-strings@7.8.3': resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.24.6': + resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): + '@babel/plugin-syntax-numeric-separator@7.10.4': resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): + '@babel/plugin-syntax-object-rest-spread@7.8.3': resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): + '@babel/plugin-syntax-optional-catch-binding@7.8.3': resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): + '@babel/plugin-syntax-optional-chaining@7.8.3': resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): + '@babel/plugin-syntax-private-property-in-object@7.14.5': resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): + '@babel/plugin-syntax-top-level-await@7.14.5': resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + '@babel/plugin-syntax-typescript@7.24.6': + resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} + '@babel/plugin-transform-arrow-functions@7.24.6': + resolution: {integrity: sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5): - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} + '@babel/plugin-transform-async-generator-functions@7.24.6': + resolution: {integrity: sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} + '@babel/plugin-transform-async-to-generator@7.24.6': + resolution: {integrity: sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} + '@babel/plugin-transform-block-scoped-functions@7.24.6': + resolution: {integrity: sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} + '@babel/plugin-transform-block-scoping@7.24.6': + resolution: {integrity: sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} + '@babel/plugin-transform-class-properties@7.24.6': + resolution: {integrity: sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5): - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} + '@babel/plugin-transform-class-static-block@7.24.6': + resolution: {integrity: sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} + '@babel/plugin-transform-classes@7.24.6': + resolution: {integrity: sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-split-export-declaration': 7.24.5 - globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} + '@babel/plugin-transform-computed-properties@7.24.6': + resolution: {integrity: sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 - /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} + '@babel/plugin-transform-destructuring@7.24.6': + resolution: {integrity: sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} + '@babel/plugin-transform-dotall-regex@7.24.6': + resolution: {integrity: sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} + '@babel/plugin-transform-duplicate-keys@7.24.6': + resolution: {integrity: sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} + '@babel/plugin-transform-dynamic-import@7.24.6': + resolution: {integrity: sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} + '@babel/plugin-transform-exponentiation-operator@7.24.6': + resolution: {integrity: sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} + '@babel/plugin-transform-export-namespace-from@7.24.6': + resolution: {integrity: sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.24.5): + '@babel/plugin-transform-flow-strip-types@7.23.3': resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.5) - dev: false - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} + '@babel/plugin-transform-for-of@7.24.6': + resolution: {integrity: sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} + '@babel/plugin-transform-function-name@7.24.6': + resolution: {integrity: sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} + '@babel/plugin-transform-json-strings@7.24.6': + resolution: {integrity: sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} + '@babel/plugin-transform-literals@7.24.6': + resolution: {integrity: sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} + '@babel/plugin-transform-logical-assignment-operators@7.24.6': + resolution: {integrity: sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} + '@babel/plugin-transform-member-expression-literals@7.24.6': + resolution: {integrity: sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} + '@babel/plugin-transform-modules-amd@7.24.6': + resolution: {integrity: sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + '@babel/plugin-transform-modules-commonjs@7.24.6': + resolution: {integrity: sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} + '@babel/plugin-transform-modules-systemjs@7.24.6': + resolution: {integrity: sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} + '@babel/plugin-transform-modules-umd@7.24.6': + resolution: {integrity: sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + '@babel/plugin-transform-named-capturing-groups-regex@7.24.6': + resolution: {integrity: sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} + '@babel/plugin-transform-new-target@7.24.6': + resolution: {integrity: sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} + '@babel/plugin-transform-nullish-coalescing-operator@7.24.6': + resolution: {integrity: sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} + '@babel/plugin-transform-numeric-separator@7.24.6': + resolution: {integrity: sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} + '@babel/plugin-transform-object-rest-spread@7.24.6': + resolution: {integrity: sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} + '@babel/plugin-transform-object-super@7.24.6': + resolution: {integrity: sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} + '@babel/plugin-transform-optional-catch-binding@7.24.6': + resolution: {integrity: sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} + '@babel/plugin-transform-optional-chaining@7.24.6': + resolution: {integrity: sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} + '@babel/plugin-transform-parameters@7.24.6': + resolution: {integrity: sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} + '@babel/plugin-transform-private-methods@7.24.6': + resolution: {integrity: sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} + '@babel/plugin-transform-private-property-in-object@7.24.6': + resolution: {integrity: sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} + '@babel/plugin-transform-property-literals@7.24.6': + resolution: {integrity: sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-react-constant-elements@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==} + '@babel/plugin-transform-react-constant-elements@7.24.6': + resolution: {integrity: sha512-vQfyXRtG/kNIcTYRd/49uJnwvMig9X3R4XsTVXRml2RFupZFY+2RDuK+/ymb+MfX2WuIHAgUZc2xEvQrnI7QCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true - /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} + '@babel/plugin-transform-react-display-name@7.24.6': + resolution: {integrity: sha512-/3iiEEHDsJuj9QU09gbyWGSUxDboFcD7Nj6dnHIlboWSodxXAoaY/zlNMHeYAC0WsERMqgO9a7UaM77CsYgWcg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.5): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + '@babel/plugin-transform-react-jsx-development@7.24.6': + resolution: {integrity: sha512-F7EsNp5StNDouSSdYyDSxh4J+xvj/JqG+Cb6s2fA+jCyHOzigG5vTwgH8tU2U8Voyiu5zCG9bAK49wTr/wPH0w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - dev: true - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5): - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + '@babel/plugin-transform-react-jsx@7.24.6': + resolution: {integrity: sha512-pCtPHhpRZHfwdA5G1Gpk5mIzMA99hv0R8S/Ket50Rw+S+8hkt3wBWqdqHaPw0CuUYxdshUgsPiLQ5fAs4ASMhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 - dev: true - /@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==} + '@babel/plugin-transform-react-pure-annotations@7.24.6': + resolution: {integrity: sha512-0HoDQlFJJkXRyV2N+xOpUETbKHcouSwijRQbKWVtxsPoq5bbB30qZag9/pSc5xcWVYjTHlLsBsY+hZDnzQTPNw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.24.5 - dev: true - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} + '@babel/plugin-transform-regenerator@7.24.6': + resolution: {integrity: sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} + '@babel/plugin-transform-reserved-words@7.24.6': + resolution: {integrity: sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.5): - resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} + '@babel/plugin-transform-runtime@7.24.6': + resolution: {integrity: sha512-W3gQydMb0SY99y/2lV0Okx2xg/8KzmZLQsLaiCmwNRl1kKomz14VurEm+2TossUb+sRvBCnGe+wx8KtIgDtBbQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} + '@babel/plugin-transform-shorthand-properties@7.24.6': + resolution: {integrity: sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} + '@babel/plugin-transform-spread@7.24.6': + resolution: {integrity: sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} + '@babel/plugin-transform-sticky-regex@7.24.6': + resolution: {integrity: sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} + '@babel/plugin-transform-template-literals@7.24.6': + resolution: {integrity: sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} + '@babel/plugin-transform-typeof-symbol@7.24.6': + resolution: {integrity: sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-typescript@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} + '@babel/plugin-transform-typescript@7.24.6': + resolution: {integrity: sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} + '@babel/plugin-transform-unicode-escapes@7.24.6': + resolution: {integrity: sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} + '@babel/plugin-transform-unicode-property-regex@7.24.6': + resolution: {integrity: sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} + '@babel/plugin-transform-unicode-regex@7.24.6': + resolution: {integrity: sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} + '@babel/plugin-transform-unicode-sets-regex@7.24.6': + resolution: {integrity: sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - /@babel/preset-env@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} + '@babel/preset-env@7.24.6': + resolution: {integrity: sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.5) - core-js-compat: 3.36.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/preset-flow@7.23.3(@babel/core@7.24.5): + '@babel/preset-flow@7.23.3': resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.24.5) - dev: false - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5): + '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 - esutils: 2.0.3 - /@babel/preset-react@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==} + '@babel/preset-react@7.24.6': + resolution: {integrity: sha512-8mpzh1bWvmINmwM3xpz6ahu57mNaWavMm+wBNjQ4AFu1nghKBiIRET7l/Wmj4drXany/BBGjJZngICcD98F1iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.24.5) - dev: true - - /@babel/preset-typescript@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + + '@babel/preset-typescript@7.24.6': + resolution: {integrity: sha512-U10aHPDnokCFRXgyT/MaIRTivUu2K/mu0vJlwRS9LxJmJet+PFQNKpggPyFCUtC6zWSBPjvxjnpNkAn3Uw2m5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) - /@babel/register@7.23.7(@babel/core@7.24.5): - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 - /@babel/regjsgen@0.8.0: + '@babel/regjsgen@0.8.0': resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime-corejs2@7.24.5: - resolution: {integrity: sha512-cC9jiO6s/IN+xwCHYy1AGrcFJ4bwgIwb8HX1KaoEpRsznLlO4x9eBP6AX7RIeMSWlQqEj2WHox637OS8cDq6Ew==} + '@babel/runtime-corejs2@7.24.6': + resolution: {integrity: sha512-5UK2PnfpmiCftYGBeJ+SpFIMNaoMPU/eQt1P5ISx0TB7nGGzEMLT4/3PapNZEfGZh+nGxGOGj2t59prGFBhunQ==} engines: {node: '>=6.9.0'} - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.14.1 - dev: false - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + '@babel/runtime@7.24.6': + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.24.6': + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - /@babel/traverse@7.24.5: - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + '@babel/traverse@7.24.6': + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - /@babel/types@7.24.5: - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + '@babel/types@7.24.6': + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - /@bcoe/v8-coverage@0.2.3: + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: false - /@colors/colors@1.5.0: + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - dev: true - /@discoveryjs/json-ext@0.5.7: + '@discoveryjs/json-ext@0.5.7': resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - /@docsearch/css@3.6.0: + '@docsearch/css@3.6.0': resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} - dev: false - /@docsearch/react@3.6.0(@algolia/client-search@4.22.1)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): + '@docsearch/react@3.6.0': resolution: {integrity: sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -2884,61 +2307,23 @@ packages: optional: true search-insights: optional: true - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) - '@docsearch/css': 3.6.0 - '@types/react': 18.2.60 - algoliasearch: 4.22.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - dev: false - /@emotion/babel-plugin@11.11.0: + '@emotion/babel-plugin@11.11.0': resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} - dependencies: - '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.5 - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.4 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - /@emotion/cache@11.11.0: + '@emotion/cache@11.11.0': resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - stylis: 4.2.0 - /@emotion/hash@0.9.1: + '@emotion/hash@0.9.1': resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - /@emotion/is-prop-valid@1.2.1: - resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: false - - /@emotion/is-prop-valid@1.2.2: + '@emotion/is-prop-valid@1.2.2': resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - dependencies: - '@emotion/memoize': 0.8.1 - /@emotion/memoize@0.8.1: + '@emotion/memoize@0.8.1': resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - /@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0): + '@emotion/react@11.11.4': resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} peerDependencies: '@types/react': '*' @@ -2946,45 +2331,22 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.2.60 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - /@emotion/serialize@1.1.4: + '@emotion/serialize@1.1.4': resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.3 - /@emotion/server@11.11.0: + '@emotion/server@11.11.0': resolution: {integrity: sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==} peerDependencies: '@emotion/css': ^11.0.0-rc.0 peerDependenciesMeta: '@emotion/css': optional: true - dependencies: - '@emotion/utils': 1.2.1 - html-tokenize: 2.0.1 - multipipe: 1.0.2 - through: 2.3.8 - dev: false - /@emotion/sheet@1.2.2: + '@emotion/sheet@1.2.2': resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - /@emotion/styled@11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0): + '@emotion/styled@11.11.5': resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 @@ -2993,477 +2355,8778 @@ packages: peerDependenciesMeta: '@types/react': optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/babel-plugin': 11.11.0 - '@emotion/is-prop-valid': 1.2.2 - '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) - '@emotion/utils': 1.2.1 - '@types/react': 18.2.60 - react: 18.2.0 - - /@emotion/unitless@0.8.0: - resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} - dev: false - /@emotion/unitless@0.8.1: + '@emotion/unitless@0.8.1': resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + '@emotion/use-insertion-effect-with-fallbacks@1.0.1': resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: react: '>=16.8.0' - dependencies: - react: 18.2.0 - /@emotion/utils@1.2.1: + '@emotion/utils@1.2.1': resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - /@emotion/weak-memoize@0.3.1: + '@emotion/weak-memoize@0.3.1': resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - /@es-joy/jsdoccomment@0.42.0: - resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} + '@es-joy/jsdoccomment@0.43.1': + resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} engines: {node: '>=16'} - dependencies: - comment-parser: 1.4.1 - esquery: 1.5.0 - jsdoc-type-pratt-parser: 4.0.0 - dev: true - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: + '@eslint-community/regexpp@4.10.0': resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.57.0: + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@fast-csv/format@4.3.5: + '@fast-csv/format@4.3.5': resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} - dependencies: - '@types/node': 18.19.33 - lodash.escaperegexp: 4.1.2 - lodash.isboolean: 3.0.3 - lodash.isequal: 4.5.0 - lodash.isfunction: 3.0.9 - lodash.isnil: 4.0.0 - dev: false - /@fast-csv/parse@4.3.6: + '@fast-csv/parse@4.3.6': resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} - dependencies: - '@types/node': 18.19.33 - lodash.escaperegexp: 4.1.2 - lodash.groupby: 4.6.0 - lodash.isfunction: 3.0.9 - lodash.isnil: 4.0.0 - lodash.isundefined: 3.0.1 - lodash.uniq: 4.5.0 - dev: false - /@floating-ui/core@1.6.0: + '@floating-ui/core@1.6.0': resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} - dependencies: - '@floating-ui/utils': 0.2.1 - /@floating-ui/dom@1.6.1: + '@floating-ui/dom@1.6.1': resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} - dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 - /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + '@floating-ui/react-dom@2.0.8': resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - dependencies: - '@floating-ui/dom': 1.6.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - /@floating-ui/utils@0.2.1: + '@floating-ui/utils@0.2.1': resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - /@gitbeaker/core@35.8.1: - resolution: {integrity: sha512-KBrDykVKSmU9Q9Gly8KeHOgdc0lZSa435srECxuO0FGqqBcUQ82hPqUc13YFkkdOI9T1JRA3qSFajg8ds0mZKA==} - engines: {node: '>=14.2.0'} - dependencies: - '@gitbeaker/requester-utils': 35.8.1 - form-data: 4.0.0 - li: 1.3.0 - mime: 3.0.0 - query-string: 7.1.3 - xcase: 2.0.1 - dev: true + '@gitbeaker/core@38.12.1': + resolution: {integrity: sha512-8XMVcBIdVAAoxn7JtqmZ2Ee8f+AZLcCPmqEmPFOXY2jPS84y/DERISg/+sbhhb18iRy+ZsZhpWgQ/r3CkYNJOQ==} + engines: {node: '>=18.0.0'} - /@gitbeaker/node@35.8.1: - resolution: {integrity: sha512-g6rX853y61qNhzq9cWtxIEoe2KDeFBtXAeWMGWJnc3nz3WRump2pIICvJqw/yobLZqmTNt+ea6w3/n92Mnbn3g==} - engines: {node: '>=14.2.0'} - deprecated: Please use its successor @gitbeaker/rest - dependencies: - '@gitbeaker/core': 35.8.1 - '@gitbeaker/requester-utils': 35.8.1 - delay: 5.0.0 - got: 11.8.6 - xcase: 2.0.1 - dev: true + '@gitbeaker/requester-utils@38.12.1': + resolution: {integrity: sha512-Rc/DgngS0YPN+AY1s9UnexKSy4Lh0bkQVAq9p7PRbRpXb33SlTeCg8eg/8+A/mrMcHgYmP0XhH8lkizyA5tBUQ==} + engines: {node: '>=18.0.0'} - /@gitbeaker/requester-utils@35.8.1: - resolution: {integrity: sha512-MFzdH+Z6eJaCZA5ruWsyvm6SXRyrQHjYVR6aY8POFraIy7ceIHOprWCs1R+0ydDZ8KtBnd8OTHjlJ0sLtSFJCg==} - engines: {node: '>=14.2.0'} - dependencies: - form-data: 4.0.0 - qs: 6.11.2 - xcase: 2.0.1 - dev: true + '@gitbeaker/rest@38.12.1': + resolution: {integrity: sha512-9KMSDtJ/sIov+5pcH+CAfiJXSiuYgN0KLKQFg0HHWR2DwcjGYkcbmhoZcWsaOWOqq4kihN1l7wX91UoRxxKKTQ==} + engines: {node: '>=18.0.0'} - /@googleapis/sheets@5.0.5: - resolution: {integrity: sha512-XMoONmgAJm2jYeTYHX4054VcEkElxlgqmnHvt0wAurzEHoGJLdUHhTAJXGPLgSs4WVMPtgU8HLrmk7/U+Qlw7A==} + '@googleapis/sheets@7.0.0': + resolution: {integrity: sha512-hzlIg/Jco+EdujvP05MznE+thVJ2tXt+4TumHw8xgEhGUfKysVhRuDndmvrJ2hkh5Eloc9BurwXdgw5EQ8p4mQ==} engines: {node: '>=12.0.0'} - dependencies: - googleapis-common: 7.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - /@humanwhocodes/config-array@0.11.14: + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@hutson/parse-repository-url@3.0.2': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@lerna/create@8.1.3': + resolution: {integrity: sha512-JFvIYrlvR8Txa8h7VZx8VIQDltukEKOKaZL/muGO7Q/5aE2vjOKHsD/jkWYe/2uFy1xv37ubdx17O1UXQNadPg==} + engines: {node: '>=18.0.0'} + + '@mnajdova/enzyme-adapter-react-18@0.2.0': + resolution: {integrity: sha512-BOnjlVa7FHI1YUnYe+FdUtQu6szI1wLJ+C1lHyqmF3T9gu/J/WCYqqcD44dPkrU+8eYvvk/gQducsqna4HFiAg==} + peerDependencies: + enzyme: ^3.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + + '@mui/base@5.0.0-beta.40': + resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@5.15.19': + resolution: {integrity: sha512-tCHSi/Tomez9ERynFhZRvFO6n9ATyrPs+2N80DMDzp6xDVirbBjEwhPcE+x7Lj+nwYw0SqFkOxyvMP0irnm55w==} + + '@mui/icons-material@5.15.19': + resolution: {integrity: sha512-RsEiRxA5azN9b8gI7JRqekkgvxQUlitoBOtZglflb8cUDyP12/cP4gRwhb44Ea1/zwwGGjAj66ZJpGHhKfibNA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/internal-docs-utils@1.0.4': + resolution: {integrity: sha512-aZ70CqKohMZ/RS3V5Nl3FmBNVMKHNjtXachtkcWnxyQCi9DPuaGCz8l1Q0Iealjax+j08vT5vDO0JwWFImMsnA==} + + '@mui/internal-markdown@1.0.4': + resolution: {integrity: sha512-wG9J76LpfknM5g30+xbaRmOYjxIJwt/d5S4qEniohcNp8cQuovPP0c3AhAhPTXsCyIn9xCsrc+qQwDne9kvxFg==} + + '@mui/internal-scripts@1.0.3': + resolution: {integrity: sha512-qK67iR7wy5LTVQrHhPAlDt+VDrM+B/CYfEbK9vJ8fHUVnQYQGmfEScLqAzKvidi42z3a9taHhvgto3ecLYLKEQ==} + + '@mui/internal-test-utils@1.0.0': + resolution: {integrity: sha512-TqYJ9e+3E7D9ieSbIuwKCjlptGVF5nXbH0yBl5mGxN8RcId7Q7AbS6MoRXT+4O0larjCxMtwC7JOVw62SdmA+w==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + '@mui/joy@5.0.0-beta.32': + resolution: {integrity: sha512-QJW5Mu2GTJUX4sXjxt4nQBugpJAiSkUT49S/bwoKCCWx8bCfsEyplTzZPK+FraweiGhGgZWExWOTAPpxH83RUQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/lab@5.0.0-alpha.170': + resolution: {integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': '>=5.15.0' + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/material-nextjs@5.15.11': + resolution: {integrity: sha512-cp5RWYbBngyi7NKP91R9QITllfxumCVPFjqe4AKzNROVuCot0VpgkafxXqfbv0uFsyUU0ROs0O2M3r17q604Aw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/cache': ^11.11.0 + '@emotion/server': ^11.11.0 + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 + next: ^13.0.0 || ^14.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/cache': + optional: true + '@emotion/server': + optional: true + '@types/react': + optional: true + + '@mui/material@5.15.19': + resolution: {integrity: sha512-lp5xQBbcRuxNtjpWU0BWZgIrv2XLUz4RJ0RqFXBdESIsKoGCQZ6P3wwU5ZPuj5TjssNiKv9AlM+vHopRxZhvVQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/monorepo@https://codeload.github.com/mui/material-ui/tar.gz/f0026ad5bf4e1957cebd65b882bf45219514ca64': + resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/f0026ad5bf4e1957cebd65b882bf45219514ca64} + version: 6.0.0-alpha.10 + engines: {pnpm: 8.15.8} + + '@mui/private-theming@5.15.14': + resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@5.15.14': + resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/styles@5.15.19': + resolution: {integrity: sha512-WOYjZT6DL/StJv/vFR/tJPJuHC98lwWza7Gzj2RWZk123eCcSJ+3ruc62/ZyXaCx4PKCbE849mVl+CWhA2ecmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/system@5.15.15': + resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.14': + resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@5.15.14': + resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@netlify/functions@2.7.0': + resolution: {integrity: sha512-4pXC/fuj3eGQ86wbgPiM4zY8+AsNrdz6vcv6FEdUJnZW+LqF8IWjQcY3S0d1hLeLKODYOqq4CkrzGyCpce63Nw==} + engines: {node: '>=14.0.0'} + + '@netlify/node-cookies@0.1.0': + resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} + engines: {node: ^14.16.0 || >=16.0.0} + + '@netlify/serverless-functions-api@1.18.1': + resolution: {integrity: sha512-DrSvivchuwsuQW03zbVPT3nxCQa5tn7m4aoPOsQKibuJXIuSbfxzCBxPLz0+LchU5ds7YyOaCc9872Y32ngYzg==} + engines: {node: '>=18.0.0'} + + '@next/env@14.2.3': + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + + '@next/eslint-plugin-next@14.2.3': + resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} + + '@next/swc-darwin-arm64@14.2.3': + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.3': + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.3': + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.3': + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.3': + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.3': + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.3': + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.3': + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.3': + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@2.2.0': + resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/fs@3.1.0': + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@5.0.4': + resolution: {integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/installed-package-contents@2.0.2': + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.0.0': + resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.1': + resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/run-script@7.0.2': + resolution: {integrity: sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/run-script@7.0.4': + resolution: {integrity: sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@nrwl/devkit@17.3.0': + resolution: {integrity: sha512-3QUCvRisp0Iwwl7VEFQPQUU7wpqGEv9kJBNBtgmhe68ydusdNPk+d0npwkvH23BYPuswTI2MUJyLkdeiB58Ovw==} + + '@nrwl/tao@17.3.0': + resolution: {integrity: sha512-Bhz+MvAk8CjQtclpEOagGiKzgoziwe+35SlHtvFqzZClAuB8BAx+3ZDNJZcEpDRNfodKqodMUy2OEf6pbzw/LA==} + hasBin: true + + '@nx/devkit@17.3.0': + resolution: {integrity: sha512-KPUkEwkGYrg5hDqqXc7sdv4PNXHyWtGwzkBZA3p/RjPieKcQSsTcUwTxQ+taOE4v877n0HuC7hcuLueLSbYGiQ==} + peerDependencies: + nx: '>= 16 <= 18' + + '@nx/nx-darwin-arm64@17.3.0': + resolution: {integrity: sha512-NDR/HjahhNLx9Q4TjR5/W3IedSkdtK+kUZ09EceVeX33HNdeLjkFA26QtVVmGbhnogLcywAX0KELn7oGv2nO+A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@nx/nx-darwin-x64@17.3.0': + resolution: {integrity: sha512-3qxOZnHTPTUXAH8WGCtllAXE2jodStDNSkGVeEcDuIK4NO5tFfF4oVCLKKYcnqKsJOVNTS9B/aJG2bVGbaWYVQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@nx/nx-freebsd-x64@17.3.0': + resolution: {integrity: sha512-kVGK/wSbRRWqL3sAXlR5diI29kDisutUMaxs5dWxzRzY0U/+Kwon6ayLU1/HGwEykXFhCJE7r9vSqCrnn67dzg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@nx/nx-linux-arm-gnueabihf@17.3.0': + resolution: {integrity: sha512-nb+jsh7zDkXjHEaAM5qmJR0X0wQ1yPbAYJuZSf8oZkllVYXcAofiAf21EqgKHq7vr4sZiCmlDaT16DheM3jyVA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@nx/nx-linux-arm64-gnu@17.3.0': + resolution: {integrity: sha512-9LkGk2paZn5Ehg/rya8GCISr+CgMz3MZ5PTOO/yEGk6cv6kQSmhZdjUi3wMOQidIqpolRK0MrhSL9DUz8Htl4A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-arm64-musl@17.3.0': + resolution: {integrity: sha512-bMykIGtziR90xLOCdzVDzaLgMXDvCf2Y7KpAj/EqJXpC0j9RmQdkm7VyO3//xN6rpcWjMcn1wgHQ1rPV65vETg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nx/nx-linux-x64-gnu@17.3.0': + resolution: {integrity: sha512-Y3KbMhVcgvVvplyVlWzHaSKqGKqWLPTcuXnnNzuWSqLC9q+UdaDE/6+7SryHbJABM2juMHbo9JNp5LlKp3bkEg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nx/nx-linux-x64-musl@17.3.0': + resolution: {integrity: sha512-QvAIZPqvrqI+s2Ddpkb0TE4yRJgXAlL8I+rIA8U+6y266rT5sVJZFPUWubkFWe/PSmqv3l4KqPcsvHTiIzldFA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nx/nx-win32-arm64-msvc@17.3.0': + resolution: {integrity: sha512-uoG3g0eZ9lYWZi4CpEVd04fIs+4lqpmU/FAaB3/K+Tfj9daSEIB6j57EX81ECDRB16k74VUdcI32qLAtD8KIMw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@nx/nx-win32-x64-msvc@17.3.0': + resolution: {integrity: sha512-ekoejj7ZXMSNYrgQwd/7thCNTHbDRggsqPw5LlTa/jPonsQ4TAPzmLBJUF8hCKn43xXLXaFufK4V1OMxlP1Hfg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@octokit/auth-token@2.5.0': + resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + + '@octokit/auth-token@3.0.4': + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@3.6.0': + resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + + '@octokit/core@4.2.4': + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + + '@octokit/core@5.1.0': + resolution: {integrity: sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==} + engines: {node: '>= 18'} + + '@octokit/endpoint@6.0.12': + resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + + '@octokit/endpoint@7.0.6': + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + + '@octokit/endpoint@9.0.4': + resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} + engines: {node: '>= 18'} + + '@octokit/graphql@4.8.0': + resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + + '@octokit/graphql@5.0.6': + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + + '@octokit/graphql@7.0.2': + resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@12.11.0': + resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} + + '@octokit/openapi-types@18.1.1': + resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} + + '@octokit/openapi-types@19.1.0': + resolution: {integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==} + + '@octokit/openapi-types@22.2.0': + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + + '@octokit/plugin-enterprise-rest@6.0.1': + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} + + '@octokit/plugin-paginate-rest@11.3.1': + resolution: {integrity: sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-paginate-rest@2.21.3': + resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} + peerDependencies: + '@octokit/core': '>=2' + + '@octokit/plugin-paginate-rest@6.1.2': + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + + '@octokit/plugin-request-log@1.0.4': + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + + '@octokit/plugin-request-log@4.0.0': + resolution: {integrity: sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=5' + + '@octokit/plugin-rest-endpoint-methods@13.2.2': + resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^5 + + '@octokit/plugin-rest-endpoint-methods@5.16.2': + resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} + peerDependencies: + '@octokit/core': '>=3' + + '@octokit/plugin-rest-endpoint-methods@7.2.3': + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + + '@octokit/plugin-retry@6.0.1': + resolution: {integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=5' + + '@octokit/request-error@2.1.0': + resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + + '@octokit/request-error@3.0.3': + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + + '@octokit/request-error@5.0.1': + resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} + engines: {node: '>= 18'} + + '@octokit/request@5.6.3': + resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + + '@octokit/request@6.2.8': + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + + '@octokit/request@8.1.6': + resolution: {integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==} + engines: {node: '>= 18'} + + '@octokit/rest@18.12.0': + resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + + '@octokit/rest@19.0.11': + resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} + engines: {node: '>= 14'} + + '@octokit/rest@20.1.1': + resolution: {integrity: sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==} + engines: {node: '>= 18'} + + '@octokit/tsconfig@1.0.2': + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + + '@octokit/types@10.0.0': + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + + '@octokit/types@12.4.0': + resolution: {integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==} + + '@octokit/types@13.5.0': + resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + + '@octokit/types@6.41.0': + resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + + '@octokit/types@9.3.2': + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + + '@opentelemetry/api-logs@0.50.0': + resolution: {integrity: sha512-JdZuKrhOYggqOpUljAq4WWNi5nB10PmgoF0y2CvedLGXd0kSawb/UBnWT8gg1ND3bHCNHStAIVT0ELlxJJRqrA==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@1.23.0': + resolution: {integrity: sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/core@1.24.1': + resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/otlp-transformer@0.50.0': + resolution: {integrity: sha512-s0sl1Yfqd5q1Kjrf6DqXPWzErL+XHhrXOfejh4Vc/SMTNqC902xDsC8JQxbjuramWt/+hibfguIvi7Ns8VLolA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.9.0' + + '@opentelemetry/resources@1.23.0': + resolution: {integrity: sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/resources@1.24.1': + resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/sdk-logs@0.50.0': + resolution: {integrity: sha512-PeUEupBB29p9nlPNqXoa1PUWNLsZnxG0DCDj3sHqzae+8y76B/A5hvZjg03ulWdnvBLYpnJslqzylG9E0IL87g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.9.0' + '@opentelemetry/api-logs': '>=0.39.1' + + '@opentelemetry/sdk-metrics@1.23.0': + resolution: {integrity: sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.9.0' + + '@opentelemetry/sdk-trace-base@1.23.0': + resolution: {integrity: sha512-PzBmZM8hBomUqvCddF/5Olyyviayka44O5nDWq673np3ctnvwMOvNrsUORZjKja1zJbwEuD9niAGbnVrz3jwRQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/sdk-trace-base@1.24.1': + resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.9.0' + + '@opentelemetry/semantic-conventions@1.23.0': + resolution: {integrity: sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.24.1': + resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} + engines: {node: '>=14'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@playwright/test@1.44.1': + resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==} + engines: {node: '>=16'} + hasBin: true + + '@polka/url@1.0.0-next.24': + resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@react-spring/animated@9.7.3': + resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/core@9.7.3': + resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/rafz@9.7.3': + resolution: {integrity: sha512-9vzW1zJPcC4nS3aCV+GgcsK/WLaB520Iyvm55ARHfM5AuyBqycjvh1wbmWmgCyJuX4VPoWigzemq1CaaeRSHhQ==} + + '@react-spring/shared@9.7.3': + resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@react-spring/types@9.7.3': + resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} + + '@react-spring/web@9.7.3': + resolution: {integrity: sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@remix-run/router@1.16.1': + resolution: {integrity: sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==} + engines: {node: '>=14.0.0'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sigstore/bundle@1.1.0': + resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/bundle@2.1.1': + resolution: {integrity: sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/core@0.2.0': + resolution: {integrity: sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/protobuf-specs@0.2.1': + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/sign@1.0.0': + resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/sign@2.2.1': + resolution: {integrity: sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/tuf@1.0.3': + resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@sigstore/tuf@2.3.0': + resolution: {integrity: sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sigstore/verify@0.1.0': + resolution: {integrity: sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@sinonjs/commons@2.0.0': + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@sinonjs/fake-timers@11.2.2': + resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + + '@sinonjs/samsam@8.0.0': + resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} + + '@sinonjs/text-encoding@0.7.2': + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + + '@slack/bolt@3.18.0': + resolution: {integrity: sha512-A7bDi5kY50fS6/nsmURkQdO3iMxD8aX/rA+m1UXEM2ue2z4KijeQtx2sOZ4YkJQ/h7BsgTQM0CYh3qqmo+m5sQ==} + engines: {node: '>=12.13.0', npm: '>=6.12.0'} + + '@slack/logger@3.0.0': + resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + + '@slack/logger@4.0.0': + resolution: {integrity: sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==} + engines: {node: '>= 18', npm: '>= 8.6.0'} + + '@slack/oauth@2.6.2': + resolution: {integrity: sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==} + engines: {node: '>=12.13.0', npm: '>=6.12.0'} + + '@slack/socket-mode@1.3.3': + resolution: {integrity: sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==} + engines: {node: '>=12.13.0', npm: '>=6.12.0'} + + '@slack/types@2.11.0': + resolution: {integrity: sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + + '@slack/web-api@6.12.0': + resolution: {integrity: sha512-RPw6F8rWfGveGkZEJ4+4jUin5iazxRK2q3FpQDz/FvdgzC3nZmPyLx8WRzc6nh0w3MBjEbphNnp2VZksfhpBIQ==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + + '@socket.io/component-emitter@3.1.0': + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@testing-library/dom@10.1.0': + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} + + '@testing-library/react@15.0.7': + resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tufjs/canonical-json@1.0.0': + resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@1.0.4': + resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@tufjs/models@2.0.0': + resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/chai-dom@1.11.3': + resolution: {integrity: sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==} + + '@types/chai@4.3.16': + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + + '@types/chance@1.1.6': + resolution: {integrity: sha512-V+pm3stv1Mvz8fSKJJod6CglNGVqEQ6OyuqitoDkWywEODM/eJd1eSuIp9xt6DrX8BWZ2eDSIzbw1tPCUTvGbQ==} + + '@types/cheerio@0.22.35': + resolution: {integrity: sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-shape@3.1.6': + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/doctrine@0.0.9': + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + + '@types/enzyme@3.10.12': + resolution: {integrity: sha512-xryQlOEIe1TduDWAOphR0ihfebKFSWOXpIsk+70JskCfRfW+xALdnJ0r1ZOTo85F9Qsjk6vtlU7edTYHbls9tA==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.17.42': + resolution: {integrity: sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/format-util@1.0.4': + resolution: {integrity: sha512-xrCYOdHh5zA3LUrn6CvspYwlzSWxPso11Lx32WnAG6KvLCRecKZ/Rh21PLXUkzUFsQmrGcx/traJAFjR6dVS5Q==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/history@4.7.11': + resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/is-stream@1.1.0': + resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/jscodeshift@0.11.11': + resolution: {integrity: sha512-d7CAfFGOupj5qCDqMODXxNz2/NwCv/Lha78ZFbnr6qpk3K98iSB8I+ig9ERE2+EeYML352VMRsjPyOpeA+04eQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/jsonwebtoken@8.5.9': + resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} + + '@types/karma@6.3.8': + resolution: {integrity: sha512-+QGoOPhb1f6Oli8pG+hxdnGDzVhIrpsHaFSJ4UJg15Xj+QBtluKELkJY+L4Li532HmT3l5K5o1FoUZHRQeOOaQ==} + + '@types/lodash@4.17.4': + resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} + + '@types/lru-cache@7.10.10': + resolution: {integrity: sha512-nEpVRPWW9EBmx2SCfNn3ClYxPL7IktPX12HhIoSc/H5mMjdeW3+YsXIpseLQ2xF35+OcpwKQbEUw5VtqE4PDNA==} + deprecated: This is a stub types definition. lru-cache provides its own type definitions, so you do not need this installed. + + '@types/luxon@3.4.2': + resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mime@3.0.4': + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + + '@types/minimatch@3.0.5': + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/mocha@10.0.6': + resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + + '@types/moment-hijri@2.1.4': + resolution: {integrity: sha512-pGX1DaSducJDkJAC3q8fCuemow0pzI4oa0iKcspwQNPXuwlI55WRgBVrA6NVi+rf8bZN1qjWVsGdUatrLhZk6Q==} + + '@types/moment-jalaali@0.7.9': + resolution: {integrity: sha512-gsDOoAzRnCfQTbfdlUrCvX6R0wIto6CvwfvV2C3j4qJLK+DEiTK8Rl/xlOCBO9C6qeUfX8oyZ2UfjnXJTOvHSA==} + + '@types/node@18.19.33': + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/p-queue@2.3.2': + resolution: {integrity: sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/promise.allsettled@1.0.6': + resolution: {integrity: sha512-wA0UT0HeT2fGHzIFV9kWpYz5mdoyLxKrTgMdZQM++5h6pYAFH73HXcQhefg24nD1yivUFEn5KU+EF4b+CXJ4Wg==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/qs@6.9.11': + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@18.2.25': + resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} + + '@types/react-router-dom@5.3.3': + resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + + '@types/react-router@5.1.20': + resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + + '@types/react-test-renderer@18.3.0': + resolution: {integrity: sha512-HW4MuEYxfDbOHQsVlY/XtOvNHftCVEPhJF2pQXXwcUiUF+Oyb0usgp48HSgpK5rt8m9KZb22yqOeZm+rrVG8gw==} + + '@types/react-transition-group@4.4.10': + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + + '@types/react@18.2.60': + resolution: {integrity: sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==} + + '@types/requestidlecallback@0.3.7': + resolution: {integrity: sha512-5/EwNH3H/+M2zxATq9UidyD7rCq3WhK5Te/XhdhqP270QoGInVkoNBj6kK2Ah5slkZewkX8XJb7WDaYhmJu+eg==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/scheduler@0.16.8': + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + + '@types/sinon@10.0.20': + resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} + + '@types/sinonjs__fake-timers@8.1.5': + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + + '@types/stylis@4.2.5': + resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} + + '@types/stylis@4.2.6': + resolution: {integrity: sha512-4nebF2ZJGzQk0ka0O6+FZUWceyFv4vWq/0dXBMmrSeAwzOuOd/GxE5Pa64d/ndeNLG73dXoBsRzvtsVsYUv6Uw==} + + '@types/tsscmp@1.0.2': + resolution: {integrity: sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/webpack-bundle-analyzer@4.7.0': + resolution: {integrity: sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@7.12.0': + resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.12.0': + resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.12.0': + resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.12.0': + resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.12.0': + resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.12.0': + resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.12.0': + resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.12.0': + resolution: {integrity: sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + '@yarnpkg/parsers@3.0.0-rc.46': + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} + + '@zeit/schemas@2.36.0': + resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} + + '@zkochan/js-yaml@0.0.6': + resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} + hasBin: true + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + airbnb-prop-types@2.16.0: + resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==} + deprecated: This package has been renamed to 'prop-types-tools' + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0-alpha + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + algoliasearch@4.22.1: + resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} + + amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-differ@3.0.0: + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-parallel@0.1.3: + resolution: {integrity: sha512-TDPTwSWW5E4oiFiKmz6RGJ/a80Y91GuLgUYuLd49+XBS75tYo8PNgaT2K/OxuQYqkoI852MDGBorg9OcUSTQ8w==} + + array-series@0.1.5: + resolution: {integrity: sha512-L0XlBwfx9QetHOsbLDrE/vh2t018w9462HM3iaFfxRiK83aJjAt/Ja3NMkOW7FICwWTlQBa3ZbL5FKhuQWkDrg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + array.prototype.filter@1.0.3: + resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} + engines: {node: '>= 0.4'} + + array.prototype.find@2.2.2: + resolution: {integrity: sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.map@1.0.6: + resolution: {integrity: sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==} + engines: {node: '>= 0.4'} + + array.prototype.reduce@1.0.6: + resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + ast-types@0.14.2: + resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} + engines: {node: '>=4'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + async-retry@1.2.3: + resolution: {integrity: sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==} + + async@1.5.2: + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axe-core@4.9.1: + resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} + engines: {node: '>=4'} + + axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + + babel-core@7.0.0-bridge.0: + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + babel-loader@9.1.3: + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-module-resolver@5.0.2: + resolution: {integrity: sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==} + + babel-plugin-optimize-clsx@2.6.2: + resolution: {integrity: sha512-TxgyjdVb7trTAsg/J5ByqJdbBPTYR8yaWLGQGpSxwygw8IFST5gEc1J9QktCGCHCb+69t04DWg9KOE0y2hN30w==} + + babel-plugin-polyfill-corejs2@0.4.10: + resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.4: + resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.1: + resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-preval@5.1.0: + resolution: {integrity: sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-react-remove-properties@0.3.0: + resolution: {integrity: sha512-vbxegtXGyVcUkCvayLzftU95vuvpYFV85pRpeMpohMHeEY46Qe0VNWfkVVcCbaZ12CXHzDFOj0esumATcW83ng==} + + babel-plugin-replace-imports@1.0.2: + resolution: {integrity: sha512-v+9S4FBg9wYit3c+bDxhRHv/pnhBhhneZOPvqT1c293SSjUuUy1MPK76TsJ9038fp/SD2/TNcqG5PUBoG9/ByQ==} + + babel-plugin-search-and-replace@1.1.1: + resolution: {integrity: sha512-fjP2VTF3mxxOUnc96mdK22llH92A6gu7A5AFapJmgnqsQi3bqLduIRP0FpA2r5vRZOYPpnX4rE5izQlpsMBjSA==} + + babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + + bail@1.0.5: + resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + + body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + + boxen@7.0.0: + resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} + engines: {node: '>=14.16'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@0.1.2: + resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + + builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + byte-size@8.1.1: + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + c8@7.14.0: + resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} + engines: {node: '>=10.12.0'} + hasBin: true + + cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + cacache@18.0.2: + resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} + engines: {node: ^16.14.0 || >=18.0.0} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001606: + resolution: {integrity: sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==} + + chai-dom@1.12.0: + resolution: {integrity: sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==} + engines: {node: '>= 0.12.0'} + peerDependencies: + chai: '>= 3' + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + + chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.0: + resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} + engines: {node: '>=10'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.0.1: + resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chance@1.1.11: + resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.6.1: + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clipboard-copy@4.0.1: + resolution: {integrity: sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==} + + clipboardy@3.0.0: + resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmd-shim@6.0.1: + resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + columnify@1.6.0: + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression-webpack-plugin@11.1.0: + resolution: {integrity: sha512-zDOQYp10+upzLxW+VRSjEpRRwBXJdsb5lBMlRxx1g8hckIFBpe3DTI0en2w7h+beuq89576RVzfiXrkdPGrHhA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.1.0 + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.2: + resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} + engines: {node: '>= 0.6'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-core@5.0.1: + resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} + engines: {node: '>=14'} + + conventional-changelog-preset-loader@3.0.0: + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} + + conventional-changelog-writer@6.0.1: + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} + hasBin: true + + conventional-commits-filter@3.0.0: + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} + + conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + + conventional-recommended-bump@7.0.1: + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + convict@6.2.4: + resolution: {integrity: sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==} + engines: {node: '>=6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + core-js-compat@3.36.1: + resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + + core-js@3.35.1: + resolution: {integrity: sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cp-file@10.0.0: + resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} + engines: {node: '>=14.16'} + + cpy-cli@5.0.0: + resolution: {integrity: sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ==} + engines: {node: '>=16'} + hasBin: true + + cpy@10.1.0: + resolution: {integrity: sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ==} + engines: {node: '>=16'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@4.0.2: + resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-vendor@2.0.8: + resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssjanus@2.1.0: + resolution: {integrity: sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g==} + engines: {node: '>=10.0.0'} + + cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + custom-event@1.0.1: + resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + danger@12.3.0: + resolution: {integrity: sha512-S5vGNCjWfO5VkHnguq+LFfzJWSJdGuzhGxWAv1TtRmJKxNnL2dW/zWM96wPSJ7ZU6ggtHIbR+F8PD3c4NHzuzA==} + engines: {node: '>=18'} + hasBin: true + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + date-fns-jalali@2.30.0-0: + resolution: {integrity: sha512-2wz5AOzd3oQ+PnL3E/iKvJZ14i6oTp15sW047ZFCOgM9OSP8ggbb9jm/4SKI8ejdUGH96Krb5dfEQe8zbkVyZw==} + engines: {node: '>=0.11'} + + date-fns-jalali@3.6.0-0: + resolution: {integrity: sha512-rcOocwhBFgEN4i+vXPoEp/irCxAmX8yloK/l/oeMOVCLpaFQfkq7jVn0vCWK91P2H9I/doSAPEN4WSWQeqwsug==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + + date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} + + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@5.0.0: + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + di@0.0.1: + resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serialize@2.2.1: + resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.3.2: + resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} + engines: {node: '>=12'} + + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.728: + resolution: {integrity: sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + + engine.io@6.5.4: + resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engines: {node: '>=10.2.0'} + + enhanced-resolve@0.9.1: + resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} + engines: {node: '>=0.6'} + + enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + + ent@2.2.0: + resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.11.0: + resolution: {integrity: sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==} + engines: {node: '>=4'} + hasBin: true + + envinfo@7.8.1: + resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} + engines: {node: '>=4'} + hasBin: true + + enzyme-adapter-utils@1.14.1: + resolution: {integrity: sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==} + peerDependencies: + react: 0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0 + + enzyme-shallow-equal@1.0.5: + resolution: {integrity: sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==} + + enzyme@3.11.0: + resolution: {integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@1.8.1: + resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: '>=0.12.0'} + hasBin: true + + eslint-config-airbnb-base@15.0.0: + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + + eslint-config-airbnb-typescript@18.0.0: + resolution: {integrity: sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^7.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + + eslint-config-airbnb@19.0.4: + resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} + engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.28.0 + eslint-plugin-react-hooks: ^4.3.0 + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-webpack@0.13.8: + resolution: {integrity: sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==} + engines: {node: '>= 6'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + webpack: '>=1.11.0' + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-filenames@1.3.2: + resolution: {integrity: sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==} + peerDependencies: + eslint: '*' + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsdoc@48.2.7: + resolution: {integrity: sha512-fYj3roTnkFL9OFFTB129rico8lerC5G8Vp2ZW9SjO9RNWG0exVvI+i/Y8Bpm1ufjR0uvT38xtoab/U0Hp8Ybog==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-mocha@10.4.3: + resolution: {integrity: sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-react-compiler@0.0.0-experimental-51a85ea-20240601: + resolution: {integrity: sha512-ROiKTVu9pZsNHyJepZj/JULWnkw8+I8+9gOF/MkJ8Q22/9f9MkPQkD2f6FXzVH+iyWbp7DQ3RXKhB3hWhf8AIg==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7' + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.34.2: + resolution: {integrity: sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-to-babel@3.2.1: + resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} + engines: {node: '>=8.3.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@3.1.2: + resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + exceljs@4.4.0: + resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} + engines: {node: '>=8.3.0'} + + execa@5.0.0: + resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} + engines: {node: '>=10'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@9.1.0: + resolution: {integrity: sha512-lSgHc4Elo2m6bUDhc3Hl/VxvUDJdQWI40RZ4KMY9bKRc+hgMOT7II/JjbNDhI8VnMtrCb7U/fhpJIkLORZozWw==} + engines: {node: '>=18'} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + fast-csv@4.3.6: + resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} + engines: {node: '>=10.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-url-parser@1.1.3: + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.17.0: + resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} + + fg-loadcss@3.1.0: + resolution: {integrity: sha512-UgtXKza8nBUO6UWW4c+MOprRL4W5WbIkzPJafnw6y6f5jhA3FiSZkWz8eXeAeX+mC4A/qq0ByDLiAk6erNARaQ==} + engines: {node: '>= 11.9.0'} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-babel-config@2.1.1: + resolution: {integrity: sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + finity@0.5.4: + resolution: {integrity: sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA==} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + flow-parser@0.227.0: + resolution: {integrity: sha512-nOygtGKcX/siZK/lFzpfdHEfOkfGcTW7rNroR1Zsz6T/JxSahPALXVt5qVHq/fgvMJuv096BTKbgxN3PzVBaDA==} + engines: {node: '>=0.4.0'} + + follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + format-util@1.0.5: + resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-exists-sync@0.1.0: + resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} + engines: {node: '>=0.10.0'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + gaxios@6.1.1: + resolution: {integrity: sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==} + engines: {node: '>=14'} + + gcp-metadata@6.1.0: + resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + engines: {node: '>=14'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-stdin@6.0.0: + resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} + engines: {node: '>=4'} + + get-stream@6.0.0: + resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} + engines: {node: '>=10'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + git-config-path@1.0.1: + resolution: {integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==} + engines: {node: '>=0.10.0'} + + git-raw-commits@3.0.0: + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} + hasBin: true + + git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + git-semver-tags@5.0.1: + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} + hasBin: true + + git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + + git-url-parse@13.1.0: + resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + + gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-gitignore@1.0.14: + resolution: {integrity: sha512-YuAEPqL58bOQDqDF2kMv009rIjSAtPs+WPzyGbwRWK+wD0UWQVRoP34Pz6yJ6ivco65C9tZnaIt0I3JCuQ8NZQ==} + engines: {node: '>= 6'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + globby@14.0.1: + resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + engines: {node: '>=18'} + + gm@1.25.0: + resolution: {integrity: sha512-4kKdWXTtgQ4biIo7hZA396HT062nDVVHPjQcurNZ3o/voYN+o5FUC5kOwuORbpExp3XbTJ3SU7iRipiIhQtovw==} + engines: {node: '>=14'} + + google-auth-library@9.10.0: + resolution: {integrity: sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==} + engines: {node: '>=14'} + + googleapis-common@7.0.1: + resolution: {integrity: sha512-mgt5zsd7zj5t5QXvDanjWguMdHAcJmmDrF9RkInCecNsyV7S7YtGqm5v2IWONNID88osb7zmx5FtrAP12JfD0w==} + engines: {node: '>=14.0.0'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gtoken@7.0.1: + resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} + engines: {node: '>=14.0.0'} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@2.0.0: + resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hermes-estree@0.20.1: + resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + + hermes-parser@0.20.1: + resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@3.0.8: + resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} + engines: {node: '>=10'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + engines: {node: ^16.14.0 || >=18.0.0} + + html-element-map@1.3.1: + resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-tokenize@2.0.1: + resolution: {integrity: sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==} + hasBin: true + + html-webpack-plugin@5.6.0: + resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@7.0.0: + resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==} + engines: {node: '>=18.18.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + hyperlinker@1.0.0: + resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} + engines: {node: '>=4'} + + hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-walk@5.0.1: + resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ignore-walk@6.0.4: + resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + init-package-json@5.0.0: + resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-in-browser@1.1.3: + resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-port-reachable@4.0.0: + resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-ssh@1.4.0: + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.0: + resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + engines: {node: '>=8'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-subset@0.1.1: + resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + + istanbul@0.4.5: + resolution: {integrity: sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==} + deprecated: |- + This module is no longer maintained, try this instead: + npm i nyc + Visit https://istanbul.js.org/integrations for other alternatives. + hasBin: true + + iterate-iterator@1.0.2: + resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} + + iterate-value@1.0.2: + resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + + jalaali-js@1.2.6: + resolution: {integrity: sha512-io974va+Qyu+UfuVX3UIAgJlxLhAMx9Y8VMfh+IG00Js7hXQo1qNQuwSiSa0xxco0SVgx5HWNkaiCcV+aZ8WPw==} + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jscodeshift-add-imports@1.0.10: + resolution: {integrity: sha512-VUe9DJ3zkWIR62zSRQnmsOVeyt77yD8knvYNna/PzRZlF9j799hJw5sqTZu4EX16XLIqS3FxWz3nXuGuiw9iyQ==} + peerDependencies: + jscodeshift: ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 + + jscodeshift-find-imports@2.0.4: + resolution: {integrity: sha512-HxOzjWDOFFSCf8EKSTQGqCxXeRFqZszOywnZ0HuMB9YPDFHVpxftGRsY+QS+Qq8o2qUojlmNU3JEHts5DWYS1A==} + peerDependencies: + jscodeshift: ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 + + jscodeshift@0.13.1: + resolution: {integrity: sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + + jsdoc-type-pratt-parser@4.0.0: + resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} + engines: {node: '>=12.0.0'} + + jsdom@24.1.0: + resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jss-plugin-camel-case@10.10.0: + resolution: {integrity: sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==} + + jss-plugin-default-unit@10.10.0: + resolution: {integrity: sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==} + + jss-plugin-global@10.10.0: + resolution: {integrity: sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==} + + jss-plugin-nested@10.10.0: + resolution: {integrity: sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==} + + jss-plugin-props-sort@10.10.0: + resolution: {integrity: sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==} + + jss-plugin-rule-value-function@10.10.0: + resolution: {integrity: sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==} + + jss-plugin-template@10.10.0: + resolution: {integrity: sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w==} + + jss-plugin-vendor-prefixer@10.10.0: + resolution: {integrity: sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==} + + jss-rtl@0.3.0: + resolution: {integrity: sha512-rg9jJmP1bAyhNOAp+BDZgOP/lMm4+oQ76qGueupDQ68Wq+G+6SGvCZvhIEg8OHSONRWOwFT6skCI+APGi8DgmA==} + peerDependencies: + jss: ^10.0.0 + + jss@10.10.0: + resolution: {integrity: sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + junk@4.0.1: + resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} + engines: {node: '>=12.20'} + + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jwa@2.0.0: + resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + + karma-chrome-launcher@3.2.0: + resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} + + karma-mocha@2.0.1: + resolution: {integrity: sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==} + + karma-parallel@0.3.1: + resolution: {integrity: sha512-64jxNYamYi/9Y67h4+FfViSYhwDgod3rLuq+ZdZ0c3XeZFp/3q3v3HVkd8b5Czp3hCB+LLF8DIv4zlR4xFqbRw==} + engines: {node: '>=6'} + peerDependencies: + karma: '>= 1.0.0' + + karma-sourcemap-loader@0.4.0: + resolution: {integrity: sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA==} + + karma-webpack@5.0.1: + resolution: {integrity: sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ==} + engines: {node: '>= 18'} + peerDependencies: + webpack: ^5.0.0 + + karma@6.4.3: + resolution: {integrity: sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==} + engines: {node: '>= 10'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lerna@8.1.3: + resolution: {integrity: sha512-Dg/r1dGnRCXKsOUC3lol7o6ggYTA6WWiPQzZJNKqyygn4fzYGuA3Dro2d5677pajaqFnFA72mdCjzSyF16Vi2Q==} + engines: {node: '>=18.0.0'} + hasBin: true + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libnpmaccess@7.0.2: + resolution: {integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + libnpmpublish@7.3.0: + resolution: {integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + load-json-file@6.2.0: + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.escape@4.0.1: + resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.find@4.6.0: + resolution: {integrity: sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isempty@4.4.0: + resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.isnil@4.0.0: + resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isobject@3.0.2: + resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isregexp@4.0.1: + resolution: {integrity: sha512-rw9+95tYcUa9nQ1FgdtKvO+hReLGNqnNMHfLq8SwK5Mo6D0R0tIsnRHGHaTHSKeYBaLCJ1JvXWdz4UmpPZ2bag==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.isundefined@3.0.1: + resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.keys@4.2.0: + resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} + + lodash.mapvalues@4.6.0: + resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} + + longest-streak@2.0.4: + resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + luxon@3.4.4: + resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + engines: {node: '>=12'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + make-array@1.0.5: + resolution: {integrity: sha512-sgK2SAzxT19rWU+qxKUcn6PAh/swiIiz2F8C2cZjLc1z4iwYIfdoihqFIDQ8BDzAGtWPYJ6Sr13K1j/DXynDLA==} + engines: {node: '>=0.10.0'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-fetch-happen@11.1.1: + resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + make-fetch-happen@13.0.0: + resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + engines: {node: ^16.14.0 || >=18.0.0} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-to-jsx@7.4.7: + resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + + markdownlint-cli2-formatter-default@0.0.4: + resolution: {integrity: sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==} + peerDependencies: + markdownlint-cli2: '>=0.0.4' + + markdownlint-cli2@0.13.0: + resolution: {integrity: sha512-Pg4nF7HlopU97ZXtrcVISWp3bdsuc5M0zXyLp2/sJv2zEMlInrau0ZKK482fQURzVezJzWBpNmu4u6vGAhij+g==} + engines: {node: '>=18'} + hasBin: true + + markdownlint-micromark@0.1.9: + resolution: {integrity: sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==} + engines: {node: '>=18'} + + markdownlint@0.34.0: + resolution: {integrity: sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==} + engines: {node: '>=18'} + + marked@5.1.2: + resolution: {integrity: sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==} + engines: {node: '>= 16'} + hasBin: true + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-to-markdown@0.6.5: + resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs-or-file-map-to-github-branch@1.2.1: + resolution: {integrity: sha512-I/hQzJ2a/pCGR8fkSQ9l5Yx+FQ4e7X6blNHyWBm2ojeFLT3GVzGkTj7xnyWpdclrr7Nq4dmx3xrvu70m3ypzAQ==} + + memory-fs@0.2.0: + resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.33.0: + resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.18: + resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.0.5: + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@3.0.4: + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-json-stream@1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mocha@10.4.0: + resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} + engines: {node: '>= 14.0.0'} + hasBin: true + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + moment-hijri@2.1.2: + resolution: {integrity: sha512-p5ZOA1UzBHAAXiePh37XRjjwuyH78+1ShYZ7R6jogxketewG7kTCUjUmcP9c4Qsx8D8cqxwUWrESjtgdT6tNoA==} + + moment-jalaali@0.10.0: + resolution: {integrity: sha512-XICH1+UHd3zyaE1bXWQBlhoXBqbzEyFfT0TrifNobHxLALRuTSwXn376bX8FmkYg9mZimevwwdd6EB57s5wuFA==} + + moment-timezone@0.5.45: + resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multimatch@5.0.0: + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} + + multipipe@1.0.2: + resolution: {integrity: sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nested-error-stacks@2.1.1: + resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} + + next@14.2.3: + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + nise@5.1.7: + resolution: {integrity: sha512-wWtNUhkT7k58uvWTB/Gy26eA/EJKtPZFVAhEilN5UYVmmGRYOURbejRUyKm0Uu9XVEW7K5nBOZfR8VMB4QR2RQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-abi@3.54.0: + resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==} + engines: {node: '>=10'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-cleanup@2.1.2: + resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==} + + node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + + node-environment-flags@1.0.6: + resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp@10.0.1: + resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + + nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + + npm-bundled@3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@11.0.1: + resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-package-arg@8.1.1: + resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==} + engines: {node: '>=10'} + + npm-packlist@5.1.1: + resolution: {integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + npm-packlist@8.0.2: + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@9.0.0: + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-registry-fetch@14.0.5: + resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-registry-fetch@16.1.0: + resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nwsapi@2.2.10: + resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} + + nx@17.3.0: + resolution: {integrity: sha512-CoY0qUrO8xErbA/v/bbfDGs+KaD9MCO7PReqmIeyrtDNwFl6vnb+U2MpBxCsRP+YH2Oa8hI8Lu+kcnPktx2v6A==} + hasBin: true + peerDependencies: + '@swc-node/register': ^1.6.7 + '@swc/core': ^1.3.85 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + + nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@0.4.0: + resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.getownpropertydescriptors@2.1.7: + resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} + engines: {node: '>= 0.8'} + + object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.3.0: + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + override-require@1.1.1: + resolution: {integrity: sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==} + + p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + + p-event@5.0.1: + resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-filter@3.0.0: + resolution: {integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map-series@2.1.0: + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + p-map@6.0.0: + resolution: {integrity: sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==} + engines: {node: '>=16'} + + p-pipe@3.1.0: + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} + + p-queue@2.4.2: + resolution: {integrity: sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==} + engines: {node: '>=4'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-reduce@2.1.0: + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + p-waterfall@2.1.1: + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} + + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + + pacote@17.0.6: + resolution: {integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-diff@0.7.1: + resolution: {integrity: sha512-1j3l8IKcy4yRK2W4o9EYvJLSzpAVwz4DXqCewYyx2vEwk2gcf3DBPqc8Fj4XV3K33OYJ08A8fWwyu/ykD/HUSg==} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-git-config@2.0.3: + resolution: {integrity: sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A==} + engines: {node: '>=6'} + + parse-github-url@1.0.2: + resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} + engines: {node: '>=0.10.0'} + hasBin: true + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-link-header@2.0.0: + resolution: {integrity: sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + + parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-to-regexp@2.2.1: + resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pinpoint@1.1.0: + resolution: {integrity: sha512-+04FTD9x7Cls2rihLlo57QDCcHoLBGn5Dk51SwtFBWkUWLxZaBXyNVpCw1S+atvE7GmnFjeaRZ0WLq3UYuqAdg==} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + playwright-core@1.44.1: + resolution: {integrity: sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.44.1: + resolution: {integrity: sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==} + engines: {node: '>=16'} + hasBin: true + + please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.3.0: + resolution: {integrity: sha512-J9odKxERhCQ10OC2yb93583f6UnYutOeiV5i0zEDS7UGTdUt0u+y8erxl3lBKvwo/JHyyoEdXjwp4dke9oyZ/g==} + engines: {node: '>=14'} + hasBin: true + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@9.0.0: + resolution: {integrity: sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==} + engines: {node: '>=18'} + + pretty-quick@4.0.0: + resolution: {integrity: sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + + prettyjson@1.2.5: + resolution: {integrity: sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==} + hasBin: true + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + promise.allsettled@1.0.7: + resolution: {integrity: sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==} + engines: {node: '>= 0.4'} + + promzard@1.0.0: + resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + prop-types-exact@1.2.0: + resolution: {integrity: sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qjobs@1.2.0: + resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} + engines: {node: '>=0.9'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + + rambda@7.5.0: + resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + + randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.0: + resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} + engines: {node: '>= 0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-docgen@5.4.3: + resolution: {integrity: sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==} + engines: {node: '>=8.10.0'} + hasBin: true + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-hook-form@7.51.5: + resolution: {integrity: sha512-J2ILT5gWx1XUIJRETiA7M19iXHlG74+6O3KApzvqB/w8S5NQR7AbU8HVZrMALdmDgWpRPYiZJl0zx8Z4L2mP6Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-reconciler@0.29.0: + resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.2.0 + + react-router-dom@6.23.1: + resolution: {integrity: sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.23.1: + resolution: {integrity: sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-runner@1.0.3: + resolution: {integrity: sha512-KyAzNzSVdrBc4A7aGW3FD0wVuujfgcBlyIGF0QVicJu0ucMpLYyTHE+PgBu82Iq698TPKRH+eEi6Mrq/e7OffA==} + peerDependencies: + react: ^16.0.0 || ^17 || ^18 + react-dom: ^16.0.0 || ^17 || ^18 + + react-shallow-renderer@16.15.0: + resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-simple-code-editor@0.13.1: + resolution: {integrity: sha512-XYeVwRZwgyKtjNIYcAEgg2FaQcCZwhbarnkJIV20U2wkCU9q/CPFBo8nRXrK4GXUz3AvbqZFsZRrpUTkqqEYyQ==} + peerDependencies: + react: '*' + react-dom: '*' + + react-test-renderer@18.2.0: + resolution: {integrity: sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==} + peerDependencies: + react: ^18.2.0 + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-cmd-shim@4.0.0: + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-package-json@6.0.4: + resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + + read-package-json@7.0.0: + resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} + engines: {node: ^16.14.0 || >=18.0.0} + deprecated: This package is no longer supported. Please use @npmcli/package-json instead. + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read@2.1.0: + resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readline-sync@1.4.10: + resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} + engines: {node: '>= 0.8.0'} + + recast@0.20.5: + resolution: {integrity: sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==} + engines: {node: '>= 4'} + + recast@0.23.9: + resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} + engines: {node: '>= 4'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + + reflect.ownkeys@0.2.0: + resolution: {integrity: sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + registry-auth-token@3.3.2: + resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + + registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + + remark-parse@9.0.0: + resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + + remark-stringify@9.0.1: + resolution: {integrity: sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==} + + remark@13.0.0: + resolution: {integrity: sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + + rimraf@5.0.7: + resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} + engines: {node: '>=14.18'} + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + rrweb-cssom@0.7.0: + resolution: {integrity: sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g==} + + rst-selector-parser@2.2.3: + resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==} + + rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + + search-insights@2.13.0: + resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-handler@6.1.5: + resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + serve@14.2.3: + resolution: {integrity: sha512-VqUFMC7K3LDGeGnJM9h56D3XGKb6KGgOw0cVNtA26yYXHCcpxf3xwCTUaQoWlVS7i8Jdh3GjQkOB23qsXyjoyQ==} + engines: {node: '>= 14'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sigstore@1.9.0: + resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + sigstore@2.2.0: + resolution: {integrity: sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==} + engines: {node: ^16.14.0 || >=18.0.0} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sinon@16.1.3: + resolution: {integrity: sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==} + + sirv@2.0.4: + resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + engines: {node: '>= 10'} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + socket.io-adapter@2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.7.4: + resolution: {integrity: sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==} + engines: {node: '>=10.2.0'} + + socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + + socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + + socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + + sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + ssri@10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + + streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + streamx@2.15.6: + resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + + string-replace-loader@3.1.0: + resolution: {integrity: sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==} + peerDependencies: + webpack: ^5 + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strong-log-transformer@2.1.0: + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} + hasBin: true + + styled-components@6.1.11: + resolution: {integrity: sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis-plugin-rtl@2.1.1: + resolution: {integrity: sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==} + peerDependencies: + stylis: 4.x + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@1.0.1: + resolution: {integrity: sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==} + engines: {node: '>=4'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@0.1.10: + resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} + engines: {node: '>=0.6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + temp-dir@1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} + + temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + through2@0.4.2: + resolution: {integrity: sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trough@1.0.5: + resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + tsx@4.11.0: + resolution: {integrity: sha512-vzGGELOgAupsNVssAmZjbUDfdm/pWP4R+Kg8TVdsonxbXk0bEpE1qh0yV6/QxUVXaVlNemgcPajGdJJ82n3stg==} + engines: {node: '>=18.0.0'} + hasBin: true + + tuf-js@1.1.7: + resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + tuf-js@2.2.0: + resolution: {integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==} + engines: {node: ^16.14.0 || >=18.0.0} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.4.1: + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@0.7.37: + resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==} + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unified@9.2.2: + resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-check@1.5.4: + resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + urlpattern-polyfill@8.0.2: + resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util.inherits@1.0.3: + resolution: {integrity: sha512-gMirHcfcq5D87nXDwbZqf5vl65S0mpMZBsHXJsXOO3Hc3G+JoQLwgaJa1h+PL7h3WhocnuLqoe8CuvMlztkyCA==} + engines: {node: '>=4'} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + v8flags@3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + + validate-npm-package-name@5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@2.0.4: + resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + + vfile@4.2.1: + resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + + void-elements@2.0.1: + resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} + engines: {node: '>=0.10.0'} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-bundle-analyzer@4.10.2: + resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@4.2.2: + resolution: {integrity: sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==} + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + write-json-file@3.2.0: + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} + + write-pkg@4.0.0: + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} + + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xcase@2.0.1: + resolution: {integrity: sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@2.1.2: + resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} + engines: {node: '>=0.4'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + yoctocolors@2.0.2: + resolution: {integrity: sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==} + engines: {node: '>=18'} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + + zod-validation-error@3.3.0: + resolution: {integrity: sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zwitch@1.0.5: + resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)': + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + '@algolia/client-search': 4.22.1 + algoliasearch: 4.22.1 + + '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)': + dependencies: + '@algolia/client-search': 4.22.1 + algoliasearch: 4.22.1 + + '@algolia/cache-browser-local-storage@4.22.1': + dependencies: + '@algolia/cache-common': 4.22.1 + + '@algolia/cache-common@4.22.1': {} + + '@algolia/cache-in-memory@4.22.1': + dependencies: + '@algolia/cache-common': 4.22.1 + + '@algolia/client-account@4.22.1': + dependencies: + '@algolia/client-common': 4.22.1 + '@algolia/client-search': 4.22.1 + '@algolia/transporter': 4.22.1 + + '@algolia/client-analytics@4.22.1': + dependencies: + '@algolia/client-common': 4.22.1 + '@algolia/client-search': 4.22.1 + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + + '@algolia/client-common@4.22.1': + dependencies: + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + + '@algolia/client-personalization@4.22.1': + dependencies: + '@algolia/client-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + + '@algolia/client-search@4.22.1': + dependencies: + '@algolia/client-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + + '@algolia/logger-common@4.22.1': {} + + '@algolia/logger-console@4.22.1': + dependencies: + '@algolia/logger-common': 4.22.1 + + '@algolia/requester-browser-xhr@4.22.1': + dependencies: + '@algolia/requester-common': 4.22.1 + + '@algolia/requester-common@4.22.1': {} + + '@algolia/requester-node-http@4.22.1': + dependencies: + '@algolia/requester-common': 4.22.1 + + '@algolia/transporter@4.22.1': + dependencies: + '@algolia/cache-common': 4.22.1 + '@algolia/logger-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@argos-ci/core@1.5.5': + dependencies: + '@argos-ci/util': 1.2.1 + axios: 1.6.7(debug@4.3.4) + convict: 6.2.4 + debug: 4.3.4(supports-color@8.1.1) + fast-glob: 3.3.2 + sharp: 0.32.6 + tmp: 0.2.1 + transitivePeerDependencies: + - supports-color + + '@argos-ci/util@1.2.1': {} + + '@babel/cli@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@jridgewell/trace-mapping': 0.3.25 + commander: 6.2.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.5.3 + + '@babel/code-frame@7.24.6': + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.6': {} + + '@babel/core@7.24.6': + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.6': + dependencies: + '@babel/types': 7.24.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-compilation-targets@7.24.6': + dependencies: + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + semver: 6.3.1 + + '@babel/helper-create-regexp-features-plugin@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + debug: 4.3.4(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-environment-visitor@7.24.6': {} + + '@babel/helper-function-name@7.24.6': + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/helper-hoist-variables@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-member-expression-to-functions@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-module-imports@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + + '@babel/helper-optimise-call-expression@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-plugin-utils@7.24.6': {} + + '@babel/helper-remap-async-to-generator@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-wrap-function': 7.24.6 + + '@babel/helper-replace-supers@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-member-expression-to-functions': 7.24.6 + '@babel/helper-optimise-call-expression': 7.24.6 + + '@babel/helper-simple-access@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-skip-transparent-expression-wrappers@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-split-export-declaration@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/helper-string-parser@7.24.6': {} + + '@babel/helper-validator-identifier@7.24.6': {} + + '@babel/helper-validator-option@7.24.6': {} + + '@babel/helper-wrap-function@7.24.6': + dependencies: + '@babel/helper-function-name': 7.24.6 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/helpers@7.24.6': + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/highlight@7.24.6': + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/node@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/register': 7.24.6(@babel/core@7.24.6) + commander: 6.2.1 + core-js: 3.35.1 + node-environment-flags: 1.0.6 + regenerator-runtime: 0.14.1 + v8flags: 3.2.0 + + '@babel/parser@7.24.6': + dependencies: + '@babel/types': 7.24.6 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/plugin-transform-optional-chaining': 7.24.6(@babel/core@7.24.6) + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-flow@7.23.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-import-assertions@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-import-attributes@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-arrow-functions@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-async-generator-functions@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-remap-async-to-generator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + + '@babel/plugin-transform-async-to-generator@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-remap-async-to-generator': 7.24.6(@babel/core@7.24.6) + + '@babel/plugin-transform-block-scoped-functions@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-block-scoping@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-class-properties@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-class-static-block@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.6) + + '@babel/plugin-transform-classes@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) + '@babel/helper-split-export-declaration': 7.24.6 + globals: 11.12.0 + + '@babel/plugin-transform-computed-properties@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/template': 7.24.6 + + '@babel/plugin-transform-destructuring@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-dotall-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-duplicate-keys@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-dynamic-import@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-transform-exponentiation-operator@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-export-namespace-from@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.24.6) + + '@babel/plugin-transform-for-of@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + + '@babel/plugin-transform-function-name@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-json-strings@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-transform-literals@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-logical-assignment-operators@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + + '@babel/plugin-transform-member-expression-literals@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-modules-amd@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-modules-commonjs@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + + '@babel/plugin-transform-modules-systemjs@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + + '@babel/plugin-transform-modules-umd@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-new-target@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-transform-numeric-separator@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + + '@babel/plugin-transform-object-rest-spread@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-transform-parameters': 7.24.6(@babel/core@7.24.6) + + '@babel/plugin-transform-object-super@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-replace-supers': 7.24.6(@babel/core@7.24.6) + + '@babel/plugin-transform-optional-catch-binding@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-transform-optional-chaining@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + + '@babel/plugin-transform-parameters@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-private-methods@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-private-property-in-object@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.6) + + '@babel/plugin-transform-property-literals@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-react-constant-elements@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-react-display-name@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-react-jsx-development@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) + + '@babel/plugin-transform-react-jsx@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 + + '@babel/plugin-transform-react-pure-annotations@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-regenerator@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-runtime@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.6) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.6) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-spread@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.6 + + '@babel/plugin-transform-sticky-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-template-literals@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-typeof-symbol@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-typescript@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-annotate-as-pure': 7.24.6 + '@babel/helper-create-class-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) + + '@babel/plugin-transform-unicode-escapes@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-unicode-property-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-unicode-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/plugin-transform-unicode-sets-regex@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-create-regexp-features-plugin': 7.24.6(@babel/core@7.24.6) + '@babel/helper-plugin-utils': 7.24.6 + + '@babel/preset-env@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/compat-data': 7.24.6 + '@babel/core': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.6) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-import-assertions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-import-attributes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.6) + '@babel/plugin-transform-arrow-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-async-generator-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-async-to-generator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-block-scoped-functions': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-block-scoping': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-class-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-class-static-block': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-classes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-computed-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-destructuring': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-dotall-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-duplicate-keys': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-dynamic-import': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-exponentiation-operator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-export-namespace-from': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-for-of': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-function-name': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-json-strings': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-logical-assignment-operators': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-member-expression-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-amd': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-systemjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-umd': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-new-target': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-numeric-separator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-object-rest-spread': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-object-super': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-optional-catch-binding': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-optional-chaining': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-parameters': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-private-methods': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-private-property-in-object': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-property-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-regenerator': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-reserved-words': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-shorthand-properties': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-spread': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-sticky-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-template-literals': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-typeof-symbol': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-escapes': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-property-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-regex': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-unicode-sets-regex': 7.24.6(@babel/core@7.24.6) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.6) + babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.6) + babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.6) + babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.6) + core-js-compat: 3.36.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-flow@7.23.3(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.24.6) + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/types': 7.24.6 + esutils: 2.0.3 + + '@babel/preset-react@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-transform-react-display-name': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-jsx-development': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-react-pure-annotations': 7.24.6(@babel/core@7.24.6) + + '@babel/preset-typescript@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-transform-typescript': 7.24.6(@babel/core@7.24.6) + + '@babel/register@7.24.6(@babel/core@7.24.6)': + dependencies: + '@babel/core': 7.24.6 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime-corejs2@7.24.6': + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.24.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.24.6': + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + + '@babel/traverse@7.24.6': + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.6': + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@colors/colors@1.5.0': {} + + '@discoveryjs/json-ext@0.5.7': {} + + '@docsearch/css@3.6.0': {} + + '@docsearch/react@3.6.0(@algolia/client-search@4.22.1)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(search-insights@2.13.0)': + dependencies: + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + '@docsearch/css': 3.6.0 + algoliasearch: 4.22.1 + optionalDependencies: + '@types/react': 18.2.60 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + search-insights: 2.13.0 + transitivePeerDependencies: + - '@algolia/client-search' + + '@emotion/babel-plugin@11.11.0': + dependencies: + '@babel/helper-module-imports': 7.24.6 + '@babel/runtime': 7.24.6 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.4 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.9.1': {} + + '@emotion/is-prop-valid@1.2.2': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.6 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.60 + + '@emotion/serialize@1.1.4': + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + + '@emotion/server@11.11.0': + dependencies: + '@emotion/utils': 1.2.1 + html-tokenize: 2.0.1 + multipipe: 1.0.2 + through: 2.3.8 + + '@emotion/sheet@1.2.2': {} + + '@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.6 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.2 + '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) + '@emotion/serialize': 1.1.4 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.60 + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@emotion/utils@1.2.1': {} + + '@emotion/weak-memoize@0.3.1': {} + + '@es-joy/jsdoccomment@0.43.1': + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + '@typescript-eslint/types': 7.12.0 + comment-parser: 1.4.1 + esquery: 1.5.0 + jsdoc-type-pratt-parser: 4.0.0 + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@eslint/js@8.57.0': {} - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true + '@fast-csv/format@4.3.5': + dependencies: + '@types/node': 18.19.33 + lodash.escaperegexp: 4.1.2 + lodash.isboolean: 3.0.3 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 - /@hutson/parse-repository-url@3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - dev: true + '@fast-csv/parse@4.3.6': + dependencies: + '@types/node': 18.19.33 + lodash.escaperegexp: 4.1.2 + lodash.groupby: 4.6.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + lodash.isundefined: 3.0.1 + lodash.uniq: 4.5.0 - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@floating-ui/core@1.6.0': + dependencies: + '@floating-ui/utils': 0.2.1 + + '@floating-ui/dom@1.6.1': + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + + '@floating-ui/react-dom@2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@floating-ui/dom': 1.6.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@floating-ui/utils@0.2.1': {} + + '@gitbeaker/core@38.12.1': + dependencies: + '@gitbeaker/requester-utils': 38.12.1 + qs: 6.11.2 + xcase: 2.0.1 + + '@gitbeaker/requester-utils@38.12.1': + dependencies: + qs: 6.11.2 + xcase: 2.0.1 + + '@gitbeaker/rest@38.12.1': + dependencies: + '@gitbeaker/core': 38.12.1 + '@gitbeaker/requester-utils': 38.12.1 + + '@googleapis/sheets@7.0.0(encoding@0.1.13)': + dependencies: + googleapis-common: 7.0.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.2': {} + + '@hutson/parse-repository-url@3.0.2': {} + + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 - dev: true - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + '@istanbuljs/schema@0.1.3': {} - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - dev: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.1': {} - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': {} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@lerna/create@8.1.2(typescript@5.4.5): - resolution: {integrity: sha512-GzScCIkAW3tg3+Yn/MKCH9963bzG+zpjGz2NdfYDlYWI7p0f/SH46v1dqpPpYmZ2E/m3JK8HjTNNNL8eIm8/YQ==} - engines: {node: '>=18.0.0'} + '@lerna/create@8.1.3(encoding@0.1.13)(typescript@5.4.5)': dependencies: '@npmcli/run-script': 7.0.2 '@nx/devkit': 17.3.0(nx@17.3.0) '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11 + '@octokit/rest': 19.0.11(encoding@0.1.13) byte-size: 8.1.1 chalk: 4.1.0 clone-deep: 4.0.1 @@ -3493,7 +11156,7 @@ packages: make-dir: 4.0.0 minimatch: 3.0.5 multimatch: 5.0.0 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) npm-package-arg: 8.1.1 npm-packlist: 5.1.1 npm-registry-fetch: 14.0.5 @@ -3509,12 +11172,12 @@ packages: read-package-json: 6.0.4 resolve-from: 5.0.0 rimraf: 4.4.1 - semver: 7.6.0 + semver: 7.6.2 signal-exit: 3.0.7 slash: 3.0.0 ssri: 9.0.1 strong-log-transformer: 2.1.0 - tar: 6.1.11 + tar: 6.2.1 temp-dir: 1.0.0 upath: 2.0.1 uuid: 9.0.1 @@ -3532,21 +11195,15 @@ packages: - encoding - supports-color - typescript - dev: true - /@mnajdova/enzyme-adapter-react-18@0.2.0(enzyme@3.11.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BOnjlVa7FHI1YUnYe+FdUtQu6szI1wLJ+C1lHyqmF3T9gu/J/WCYqqcD44dPkrU+8eYvvk/gQducsqna4HFiAg==} - peerDependencies: - enzyme: ^3.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + '@mnajdova/enzyme-adapter-react-18@0.2.0(enzyme@3.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: enzyme: 3.11.0 enzyme-adapter-utils: 1.14.1(react@18.2.0) enzyme-shallow-equal: 1.0.5 has: 1.0.4 object.assign: 4.1.5 - object.values: 1.1.7 + object.values: 1.2.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3554,85 +11211,50 @@ packages: react-reconciler: 0.29.0(react@18.2.0) react-test-renderer: 18.2.0(react@18.2.0) semver: 5.7.2 - dev: true - - /@mswjs/interceptors@0.27.2: - resolution: {integrity: sha512-mE6PhwcoW70EX8+h+Y/4dLfHk33GFt/y5PzDJz56ktMyaVGFXMJ5BYLbUjdmGEABfE0x5GgAGyKbrbkYww2s3A==} - engines: {node: '>=18'} - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.2 - strict-event-emitter: 0.5.1 - dev: true - /@mui/base@5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/base@5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 - '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) + '@babel/runtime': 7.24.6 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.60) '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) '@popperjs/core': 2.11.8 - '@types/react': 18.2.60 clsx: 2.1.1 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.2.60 - /@mui/core-downloads-tracker@5.15.15: - resolution: {integrity: sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==} + '@mui/core-downloads-tracker@5.15.19': {} - /@mui/icons-material@5.15.15(@mui/material@5.15.15)(@types/react@18.2.60)(react@18.2.0): - resolution: {integrity: sha512-kkeU/pe+hABcYDH6Uqy8RmIsr2S/y5bP2rp+Gat4CcRjCcVne6KudS1NrZQhUCRysrTDCAhcbcf9gt+/+pGO2g==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/icons-material@5.15.19(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.60 + '@babel/runtime': 7.24.6 + '@mui/material': 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.60 - /@mui/internal-docs-utils@1.0.4: - resolution: {integrity: sha512-aZ70CqKohMZ/RS3V5Nl3FmBNVMKHNjtXachtkcWnxyQCi9DPuaGCz8l1Q0Iealjax+j08vT5vDO0JwWFImMsnA==} + '@mui/internal-docs-utils@1.0.4': dependencies: - rimraf: 5.0.5 + rimraf: 5.0.7 typescript: 5.4.5 - dev: true - /@mui/internal-markdown@1.0.3: - resolution: {integrity: sha512-b+8T8S1raSuaOXaNyKiChyw1Lb/nEY1ITGsw6oygVLacsN6mZ7EB5cmvEbHA4EQiNwqCn7BgI9OoBTTr0GdZtg==} + '@mui/internal-markdown@1.0.4': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 lodash: 4.17.21 marked: 5.1.2 prismjs: 1.29.0 - dev: true - /@mui/internal-scripts@1.0.3: - resolution: {integrity: sha512-qK67iR7wy5LTVQrHhPAlDt+VDrM+B/CYfEbK9vJ8fHUVnQYQGmfEScLqAzKvidi42z3a9taHhvgto3ecLYLKEQ==} + '@mui/internal-scripts@1.0.3': dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 + '@babel/core': 7.24.6 + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 '@mui/internal-docs-utils': 1.0.4 doctrine: 3.0.0 lodash: 4.17.21 @@ -3640,125 +11262,94 @@ packages: uuid: 9.0.1 transitivePeerDependencies: - supports-color - dev: true - /@mui/joy@5.0.0-beta.32(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-QJW5Mu2GTJUX4sXjxt4nQBugpJAiSkUT49S/bwoKCCWx8bCfsEyplTzZPK+FraweiGhGgZWExWOTAPpxH83RUQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/internal-test-utils@1.0.0(@babel/core@7.24.6)(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/preset-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/register': 7.24.6(@babel/core@7.24.6) + '@babel/runtime': 7.24.6 + '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.15.15 - '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) - '@mui/types': 7.2.14(@types/react@18.2.60) - '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) - '@types/react': 18.2.60 - clsx: 2.1.1 + '@mnajdova/enzyme-adapter-react-18': 0.2.0(enzyme@3.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@testing-library/dom': 10.1.0 + '@testing-library/react': 15.0.7(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + chai: 4.4.1 + chai-dom: 1.12.0(chai@4.4.1) + dom-accessibility-api: 0.6.3 + enzyme: 3.11.0 + format-util: 1.0.5 + fs-extra: 11.2.0 + jsdom: 24.1.0 + lodash: 4.17.21 + mocha: 10.4.0 + playwright: 1.44.1 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + react-test-renderer: 18.2.0(react@18.2.0) + sinon: 16.1.3 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - bufferutil + - canvas + - supports-color + - utf-8-validate - /@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@5.15.15)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@mui/material': '>=5.15.0' - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/joy@5.0.0-beta.32(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 - '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + '@babel/runtime': 7.24.6 + '@mui/base': 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/core-downloads-tracker': 5.15.19 + '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.60) '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) - '@types/react': 18.2.60 clsx: 2.1.1 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - - /@mui/material-nextjs@5.15.11(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.15)(@types/react@18.2.60)(next@14.2.3)(react@18.2.0): - resolution: {integrity: sha512-cp5RWYbBngyi7NKP91R9QITllfxumCVPFjqe4AKzNROVuCot0VpgkafxXqfbv0uFsyUU0ROs0O2M3r17q604Aw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/cache': ^11.11.0 - '@emotion/server': ^11.11.0 - '@mui/material': ^5.0.0 - '@types/react': ^17.0.0 || ^18.0.0 - next: ^13.0.0 || ^14.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/cache': - optional: true - '@emotion/server': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@emotion/cache': 11.11.0 - '@emotion/server': 11.11.0 - '@mui/material': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@types/react': 18.2.60 - next: 14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(@playwright/test@1.43.1)(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - dev: false - /@mui/material@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/lab@5.0.0-alpha.170(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 + '@mui/base': 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/material': 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) + '@mui/types': 7.2.14(@types/react@18.2.60) + '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) - '@mui/base': 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0)(react@18.2.0) - '@mui/core-downloads-tracker': 5.15.15 - '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) + '@types/react': 18.2.60 + + '@mui/material-nextjs@5.15.11(@emotion/cache@11.11.0)(@emotion/server@11.11.0)(@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.2.60)(next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.6 + '@mui/material': 5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next: 14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + optionalDependencies: + '@emotion/cache': 11.11.0 + '@emotion/server': 11.11.0 + '@types/react': 18.2.60 + + '@mui/material@5.15.19(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.24.6 + '@mui/base': 5.0.0-beta.40(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/core-downloads-tracker': 5.15.19 + '@mui/system': 5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.60) '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) - '@types/react': 18.2.60 '@types/react-transition-group': 4.4.10 clsx: 2.1.1 csstype: 3.1.3 @@ -3766,61 +11357,54 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-is: 18.2.0 - react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) + '@types/react': 18.2.60 - /@mui/private-theming@5.15.14(@types/react@18.2.60)(react@18.2.0): - resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/monorepo@https://codeload.github.com/mui/material-ui/tar.gz/f0026ad5bf4e1957cebd65b882bf45219514ca64(@opentelemetry/api@1.8.0)(encoding@0.1.13)': + dependencies: + '@googleapis/sheets': 7.0.0(encoding@0.1.13) + '@netlify/functions': 2.7.0(@opentelemetry/api@1.8.0) + '@slack/bolt': 3.18.0 + execa: 9.1.0 + google-auth-library: 9.10.0(encoding@0.1.13) + transitivePeerDependencies: + - '@opentelemetry/api' + - bufferutil + - debug + - encoding + - supports-color + - utf-8-validate + + '@mui/private-theming@5.15.14(@types/react@18.2.60)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) - '@types/react': 18.2.60 prop-types: 15.8.1 react: 18.2.0 + optionalDependencies: + '@types/react': 18.2.60 - /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0): - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.4.1 - '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true + '@mui/styled-engine@5.15.14(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) - /@mui/styles@5.15.15(@types/react@18.2.60)(react@18.2.0): - resolution: {integrity: sha512-KBklDHNEddodEjcnZ+/3ieVcp+Mb/pzdQzAagUpt4RDd9m/mn+2JkqJh2rnrWUwS//YLsbL3IbUrONYn5yPxfQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/styles@5.15.19(@types/react@18.2.60)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@emotion/hash': 0.9.1 '@mui/private-theming': 5.15.14(@types/react@18.2.60)(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.60) '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) - '@types/react': 18.2.60 clsx: 2.1.1 csstype: 3.1.3 hoist-non-react-statics: 3.3.2 @@ -3834,83 +11418,49 @@ packages: jss-plugin-vendor-prefixer: 10.10.0 prop-types: 15.8.1 react: 18.2.0 - dev: false + optionalDependencies: + '@types/react': 18.2.60 - /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.60)(react@18.2.0): - resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@emotion/react': ^11.5.0 - '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@emotion/react': - optional: true - '@emotion/styled': - optional: true - '@types/react': - optional: true + '@mui/system@5.15.15(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 - '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) - '@emotion/styled': 11.11.5(@emotion/react@11.11.4)(@types/react@18.2.60)(react@18.2.0) + '@babel/runtime': 7.24.6 '@mui/private-theming': 5.15.14(@types/react@18.2.60)(react@18.2.0) - '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(react@18.2.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@emotion/styled@11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0))(react@18.2.0) '@mui/types': 7.2.14(@types/react@18.2.60) '@mui/utils': 5.15.14(@types/react@18.2.60)(react@18.2.0) - '@types/react': 18.2.60 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 + optionalDependencies: + '@emotion/react': 11.11.4(@types/react@18.2.60)(react@18.2.0) + '@emotion/styled': 11.11.5(@emotion/react@11.11.4(@types/react@18.2.60)(react@18.2.0))(@types/react@18.2.60)(react@18.2.0) + '@types/react': 18.2.60 - /@mui/types@7.2.14(@types/react@18.2.60): - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: + '@mui/types@7.2.14(@types/react@18.2.60)': + optionalDependencies: '@types/react': 18.2.60 - /@mui/utils@5.15.14(@types/react@18.2.60)(react@18.2.0): - resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/utils@5.15.14(@types/react@18.2.60)(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@types/prop-types': 15.7.12 - '@types/react': 18.2.60 prop-types: 15.8.1 react: 18.2.0 react-is: 18.2.0 + optionalDependencies: + '@types/react': 18.2.60 - /@netlify/functions@2.6.3(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-7Z9gWyAuPI2NnBOvpYPD66KIWOgNznLz9BkyZ0c7qeRE6p23UCMVZ2VsrJpjPDgoJtKplGSBzASl6fQD7iEeWw==} - engines: {node: '>=14.0.0'} + '@netlify/functions@2.7.0(@opentelemetry/api@1.8.0)': dependencies: - '@netlify/serverless-functions-api': 1.18.0(@opentelemetry/api@1.8.0) + '@netlify/serverless-functions-api': 1.18.1(@opentelemetry/api@1.8.0) transitivePeerDependencies: - '@opentelemetry/api' - dev: true - /@netlify/node-cookies@0.1.0: - resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} - engines: {node: ^14.16.0 || >=16.0.0} - dev: true + '@netlify/node-cookies@0.1.0': {} - /@netlify/serverless-functions-api@1.18.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-VCU5btoGZ8M6iI7HSwpfZXCpBLKWFmRtq5xYt0K7dY96BZWVBmaZY6Tn+w4L2DrGXwAsIeOFNp8CHjVXfuCAkg==} - engines: {node: '>=18.0.0'} + '@netlify/serverless-functions-api@1.18.1(@opentelemetry/api@1.8.0)': dependencies: - '@mswjs/interceptors': 0.27.2 '@netlify/node-cookies': 0.1.0 '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) '@opentelemetry/otlp-transformer': 0.50.0(@opentelemetry/api@1.8.0) @@ -3920,179 +11470,90 @@ packages: urlpattern-polyfill: 8.0.2 transitivePeerDependencies: - '@opentelemetry/api' - dev: true - /@next/env@14.2.3: - resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} - dev: false + '@next/env@14.2.3': {} - /@next/eslint-plugin-next@14.2.3: - resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} + '@next/eslint-plugin-next@14.2.3': dependencies: glob: 10.3.10 - dev: true - /@next/swc-darwin-arm64@14.2.3: - resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-arm64@14.2.3': optional: true - /@next/swc-darwin-x64@14.2.3: - resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@next/swc-darwin-x64@14.2.3': optional: true - /@next/swc-linux-arm64-gnu@14.2.3: - resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-gnu@14.2.3': optional: true - /@next/swc-linux-arm64-musl@14.2.3: - resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-arm64-musl@14.2.3': optional: true - /@next/swc-linux-x64-gnu@14.2.3: - resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-gnu@14.2.3': optional: true - /@next/swc-linux-x64-musl@14.2.3: - resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@next/swc-linux-x64-musl@14.2.3': optional: true - /@next/swc-win32-arm64-msvc@14.2.3: - resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-arm64-msvc@14.2.3': optional: true - /@next/swc-win32-ia32-msvc@14.2.3: - resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-ia32-msvc@14.2.3': optional: true - /@next/swc-win32-x64-msvc@14.2.3: - resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@next/swc-win32-x64-msvc@14.2.3': optional: true - /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3: - resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} - requiresBuild: true - dev: true + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': optional: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.0 - dev: true - /@npmcli/agent@2.2.0: - resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/agent@2.2.0': dependencies: agent-base: 7.1.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 lru-cache: 10.2.0 socks-proxy-agent: 8.0.2 transitivePeerDependencies: - supports-color - dev: true - /@npmcli/fs@3.1.0: - resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@3.1.0': dependencies: - semver: 7.6.0 - dev: true + semver: 7.6.2 - /@npmcli/git@5.0.4: - resolution: {integrity: sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/git@5.0.4': dependencies: '@npmcli/promise-spawn': 7.0.1 lru-cache: 10.2.0 npm-pick-manifest: 9.0.0 proc-log: 3.0.0 - promise-inflight: 1.0.1(bluebird@3.7.2) + promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.6.0 + semver: 7.6.2 which: 4.0.0 transitivePeerDependencies: - bluebird - dev: true - /@npmcli/installed-package-contents@2.0.2: - resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + '@npmcli/installed-package-contents@2.0.2': dependencies: npm-bundled: 3.0.0 npm-normalize-package-bin: 3.0.1 - dev: true - /@npmcli/node-gyp@3.0.0: - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@npmcli/node-gyp@3.0.0': {} - /@npmcli/package-json@5.0.0: - resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/package-json@5.0.0': dependencies: '@npmcli/git': 5.0.4 glob: 10.3.10 @@ -4100,21 +11561,15 @@ packages: json-parse-even-better-errors: 3.0.1 normalize-package-data: 6.0.0 proc-log: 3.0.0 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - bluebird - dev: true - /@npmcli/promise-spawn@7.0.1: - resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/promise-spawn@7.0.1': dependencies: which: 4.0.0 - dev: true - /@npmcli/run-script@7.0.2: - resolution: {integrity: sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/run-script@7.0.2': dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/promise-spawn': 7.0.1 @@ -4123,11 +11578,8 @@ packages: which: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /@npmcli/run-script@7.0.4: - resolution: {integrity: sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/run-script@7.0.4': dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/package-json': 5.0.0 @@ -4137,19 +11589,14 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: true - /@nrwl/devkit@17.3.0(nx@17.3.0): - resolution: {integrity: sha512-3QUCvRisp0Iwwl7VEFQPQUU7wpqGEv9kJBNBtgmhe68ydusdNPk+d0npwkvH23BYPuswTI2MUJyLkdeiB58Ovw==} + '@nrwl/devkit@17.3.0(nx@17.3.0)': dependencies: '@nx/devkit': 17.3.0(nx@17.3.0) transitivePeerDependencies: - nx - dev: true - /@nrwl/tao@17.3.0: - resolution: {integrity: sha512-Bhz+MvAk8CjQtclpEOagGiKzgoziwe+35SlHtvFqzZClAuB8BAx+3ZDNJZcEpDRNfodKqodMUy2OEf6pbzw/LA==} - hasBin: true + '@nrwl/tao@17.3.0': dependencies: nx: 17.3.0 tslib: 2.6.2 @@ -4157,12 +11604,8 @@ packages: - '@swc-node/register' - '@swc/core' - debug - dev: true - /@nx/devkit@17.3.0(nx@17.3.0): - resolution: {integrity: sha512-KPUkEwkGYrg5hDqqXc7sdv4PNXHyWtGwzkBZA3p/RjPieKcQSsTcUwTxQ+taOE4v877n0HuC7hcuLueLSbYGiQ==} - peerDependencies: - nx: '>= 16 <= 18' + '@nx/devkit@17.3.0(nx@17.3.0)': dependencies: '@nrwl/devkit': 17.3.0(nx@17.3.0) ejs: 3.1.9 @@ -4173,146 +11616,70 @@ packages: tmp: 0.2.1 tslib: 2.6.2 yargs-parser: 21.1.1 - dev: true - /@nx/nx-darwin-arm64@17.3.0: - resolution: {integrity: sha512-NDR/HjahhNLx9Q4TjR5/W3IedSkdtK+kUZ09EceVeX33HNdeLjkFA26QtVVmGbhnogLcywAX0KELn7oGv2nO+A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@nx/nx-darwin-arm64@17.3.0': optional: true - /@nx/nx-darwin-x64@17.3.0: - resolution: {integrity: sha512-3qxOZnHTPTUXAH8WGCtllAXE2jodStDNSkGVeEcDuIK4NO5tFfF4oVCLKKYcnqKsJOVNTS9B/aJG2bVGbaWYVQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@nx/nx-darwin-x64@17.3.0': optional: true - /@nx/nx-freebsd-x64@17.3.0: - resolution: {integrity: sha512-kVGK/wSbRRWqL3sAXlR5diI29kDisutUMaxs5dWxzRzY0U/+Kwon6ayLU1/HGwEykXFhCJE7r9vSqCrnn67dzg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@nx/nx-freebsd-x64@17.3.0': optional: true - /@nx/nx-linux-arm-gnueabihf@17.3.0: - resolution: {integrity: sha512-nb+jsh7zDkXjHEaAM5qmJR0X0wQ1yPbAYJuZSf8oZkllVYXcAofiAf21EqgKHq7vr4sZiCmlDaT16DheM3jyVA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-arm-gnueabihf@17.3.0': optional: true - /@nx/nx-linux-arm64-gnu@17.3.0: - resolution: {integrity: sha512-9LkGk2paZn5Ehg/rya8GCISr+CgMz3MZ5PTOO/yEGk6cv6kQSmhZdjUi3wMOQidIqpolRK0MrhSL9DUz8Htl4A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-arm64-gnu@17.3.0': optional: true - /@nx/nx-linux-arm64-musl@17.3.0: - resolution: {integrity: sha512-bMykIGtziR90xLOCdzVDzaLgMXDvCf2Y7KpAj/EqJXpC0j9RmQdkm7VyO3//xN6rpcWjMcn1wgHQ1rPV65vETg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-arm64-musl@17.3.0': optional: true - /@nx/nx-linux-x64-gnu@17.3.0: - resolution: {integrity: sha512-Y3KbMhVcgvVvplyVlWzHaSKqGKqWLPTcuXnnNzuWSqLC9q+UdaDE/6+7SryHbJABM2juMHbo9JNp5LlKp3bkEg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-x64-gnu@17.3.0': optional: true - /@nx/nx-linux-x64-musl@17.3.0: - resolution: {integrity: sha512-QvAIZPqvrqI+s2Ddpkb0TE4yRJgXAlL8I+rIA8U+6y266rT5sVJZFPUWubkFWe/PSmqv3l4KqPcsvHTiIzldFA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@nx/nx-linux-x64-musl@17.3.0': optional: true - /@nx/nx-win32-arm64-msvc@17.3.0: - resolution: {integrity: sha512-uoG3g0eZ9lYWZi4CpEVd04fIs+4lqpmU/FAaB3/K+Tfj9daSEIB6j57EX81ECDRB16k74VUdcI32qLAtD8KIMw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@nx/nx-win32-arm64-msvc@17.3.0': optional: true - /@nx/nx-win32-x64-msvc@17.3.0: - resolution: {integrity: sha512-ekoejj7ZXMSNYrgQwd/7thCNTHbDRggsqPw5LlTa/jPonsQ4TAPzmLBJUF8hCKn43xXLXaFufK4V1OMxlP1Hfg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@nx/nx-win32-x64-msvc@17.3.0': optional: true - /@octokit/auth-token@2.5.0: - resolution: {integrity: sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==} + '@octokit/auth-token@2.5.0': dependencies: '@octokit/types': 6.41.0 - dev: true - /@octokit/auth-token@3.0.4: - resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} - engines: {node: '>= 14'} - dev: true + '@octokit/auth-token@3.0.4': {} - /@octokit/auth-token@4.0.0: - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} - dev: true + '@octokit/auth-token@4.0.0': {} - /@octokit/core@3.6.0: - resolution: {integrity: sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==} + '@octokit/core@3.6.0(encoding@0.1.13)': dependencies: '@octokit/auth-token': 2.5.0 - '@octokit/graphql': 4.8.0 - '@octokit/request': 5.6.3 + '@octokit/graphql': 4.8.0(encoding@0.1.13) + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: true - /@octokit/core@4.2.4: - resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} - engines: {node: '>= 14'} + '@octokit/core@4.2.4(encoding@0.1.13)': dependencies: '@octokit/auth-token': 3.0.4 - '@octokit/graphql': 5.0.6 - '@octokit/request': 6.2.8 + '@octokit/graphql': 5.0.6(encoding@0.1.13) + '@octokit/request': 6.2.8(encoding@0.1.13) '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: true - /@octokit/core@5.1.0: - resolution: {integrity: sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==} - engines: {node: '>= 18'} + '@octokit/core@5.1.0': dependencies: '@octokit/auth-token': 4.0.0 '@octokit/graphql': 7.0.2 @@ -4321,351 +11688,218 @@ packages: '@octokit/types': 12.4.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 - dev: true - /@octokit/endpoint@6.0.12: - resolution: {integrity: sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==} + '@octokit/endpoint@6.0.12': dependencies: '@octokit/types': 6.41.0 is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/endpoint@7.0.6: - resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} - engines: {node: '>= 14'} + '@octokit/endpoint@7.0.6': dependencies: '@octokit/types': 9.3.2 is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/endpoint@9.0.4: - resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} - engines: {node: '>= 18'} + '@octokit/endpoint@9.0.4': dependencies: '@octokit/types': 12.4.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/graphql@4.8.0: - resolution: {integrity: sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==} + '@octokit/graphql@4.8.0(encoding@0.1.13)': dependencies: - '@octokit/request': 5.6.3 + '@octokit/request': 5.6.3(encoding@0.1.13) '@octokit/types': 6.41.0 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: true - /@octokit/graphql@5.0.6: - resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} - engines: {node: '>= 14'} + '@octokit/graphql@5.0.6(encoding@0.1.13)': dependencies: - '@octokit/request': 6.2.8 + '@octokit/request': 6.2.8(encoding@0.1.13) '@octokit/types': 9.3.2 universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: true - /@octokit/graphql@7.0.2: - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} - engines: {node: '>= 18'} + '@octokit/graphql@7.0.2': dependencies: '@octokit/request': 8.1.6 '@octokit/types': 12.4.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/openapi-types@12.11.0: - resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} - dev: true + '@octokit/openapi-types@12.11.0': {} - /@octokit/openapi-types@18.1.1: - resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} - dev: true + '@octokit/openapi-types@18.1.1': {} - /@octokit/openapi-types@19.1.0: - resolution: {integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==} - dev: true + '@octokit/openapi-types@19.1.0': {} - /@octokit/plugin-enterprise-rest@6.0.1: - resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} - dev: true + '@octokit/openapi-types@22.2.0': {} - /@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0): - resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} - peerDependencies: - '@octokit/core': '>=2' + '@octokit/plugin-enterprise-rest@6.0.1': {} + + '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@5.1.0)': dependencies: - '@octokit/core': 3.6.0 - '@octokit/types': 6.41.0 - dev: true + '@octokit/core': 5.1.0 + '@octokit/types': 13.5.0 - /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=4' + '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.4 - '@octokit/tsconfig': 1.0.2 - '@octokit/types': 9.3.2 - dev: true + '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/types': 6.41.0 - /@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.1.0): - resolution: {integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' + '@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: - '@octokit/core': 5.1.0 - '@octokit/types': 12.4.0 - dev: true + '@octokit/core': 4.2.4(encoding@0.1.13) + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 - /@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' + '@octokit/plugin-request-log@1.0.4(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 - dev: true + '@octokit/core': 3.6.0(encoding@0.1.13) - /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} - peerDependencies: - '@octokit/core': '>=3' + '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.4 - dev: true + '@octokit/core': 4.2.4(encoding@0.1.13) - /@octokit/plugin-request-log@4.0.0(@octokit/core@5.1.0): - resolution: {integrity: sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' + '@octokit/plugin-request-log@4.0.0(@octokit/core@5.1.0)': dependencies: '@octokit/core': 5.1.0 - dev: true - /@octokit/plugin-rest-endpoint-methods@10.2.0(@octokit/core@5.1.0): - resolution: {integrity: sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' + '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@5.1.0)': dependencies: '@octokit/core': 5.1.0 - '@octokit/types': 12.4.0 - dev: true + '@octokit/types': 13.5.0 - /@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0): - resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} - peerDependencies: - '@octokit/core': '>=3' + '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: - '@octokit/core': 3.6.0 + '@octokit/core': 3.6.0(encoding@0.1.13) '@octokit/types': 6.41.0 deprecation: 2.3.1 - dev: true - /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} - engines: {node: '>= 14'} - peerDependencies: - '@octokit/core': '>=3' + '@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: - '@octokit/core': 4.2.4 + '@octokit/core': 4.2.4(encoding@0.1.13) '@octokit/types': 10.0.0 - dev: true - /@octokit/plugin-retry@6.0.1(@octokit/core@5.1.0): - resolution: {integrity: sha512-SKs+Tz9oj0g4p28qkZwl/topGcb0k0qPNX/i7vBKmDsjoeqnVfFUquqrE/O9oJY7+oLzdCtkiWSXLpLjvl6uog==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' + '@octokit/plugin-retry@6.0.1(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: - '@octokit/core': 5.1.0 + '@octokit/core': 4.2.4(encoding@0.1.13) '@octokit/request-error': 5.0.1 '@octokit/types': 12.4.0 bottleneck: 2.19.5 - dev: true - /@octokit/request-error@2.1.0: - resolution: {integrity: sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==} + '@octokit/request-error@2.1.0': dependencies: '@octokit/types': 6.41.0 deprecation: 2.3.1 once: 1.4.0 - dev: true - /@octokit/request-error@3.0.3: - resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} - engines: {node: '>= 14'} + '@octokit/request-error@3.0.3': dependencies: '@octokit/types': 9.3.2 deprecation: 2.3.1 once: 1.4.0 - dev: true - /@octokit/request-error@5.0.1: - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} - engines: {node: '>= 18'} + '@octokit/request-error@5.0.1': dependencies: '@octokit/types': 12.4.0 deprecation: 2.3.1 once: 1.4.0 - dev: true - /@octokit/request@5.6.3: - resolution: {integrity: sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==} + '@octokit/request@5.6.3(encoding@0.1.13)': dependencies: '@octokit/endpoint': 6.0.12 '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: true - /@octokit/request@6.2.8: - resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} - engines: {node: '>= 14'} + '@octokit/request@6.2.8(encoding@0.1.13)': dependencies: '@octokit/endpoint': 7.0.6 '@octokit/request-error': 3.0.3 '@octokit/types': 9.3.2 is-plain-object: 5.0.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: true - /@octokit/request@8.1.6: - resolution: {integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==} - engines: {node: '>= 18'} + '@octokit/request@8.1.6': dependencies: '@octokit/endpoint': 9.0.4 '@octokit/request-error': 5.0.1 '@octokit/types': 12.4.0 universal-user-agent: 6.0.1 - dev: true - /@octokit/rest@18.12.0: - resolution: {integrity: sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==} + '@octokit/rest@18.12.0(encoding@0.1.13)': dependencies: - '@octokit/core': 3.6.0 - '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0) - '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0) + '@octokit/core': 3.6.0(encoding@0.1.13) + '@octokit/plugin-paginate-rest': 2.21.3(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@3.6.0(encoding@0.1.13)) + '@octokit/plugin-rest-endpoint-methods': 5.16.2(@octokit/core@3.6.0(encoding@0.1.13)) transitivePeerDependencies: - encoding - dev: true - /@octokit/rest@19.0.11: - resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} - engines: {node: '>= 14'} + '@octokit/rest@19.0.11(encoding@0.1.13)': dependencies: - '@octokit/core': 4.2.4 - '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) - '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) - '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + '@octokit/core': 4.2.4(encoding@0.1.13) + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4(encoding@0.1.13)) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4(encoding@0.1.13)) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4(encoding@0.1.13)) transitivePeerDependencies: - encoding - dev: true - /@octokit/rest@20.0.2: - resolution: {integrity: sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ==} - engines: {node: '>= 18'} + '@octokit/rest@20.1.1': dependencies: '@octokit/core': 5.1.0 - '@octokit/plugin-paginate-rest': 9.1.5(@octokit/core@5.1.0) + '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@5.1.0) '@octokit/plugin-request-log': 4.0.0(@octokit/core@5.1.0) - '@octokit/plugin-rest-endpoint-methods': 10.2.0(@octokit/core@5.1.0) - dev: true + '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@5.1.0) - /@octokit/tsconfig@1.0.2: - resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} - dev: true + '@octokit/tsconfig@1.0.2': {} - /@octokit/types@10.0.0: - resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + '@octokit/types@10.0.0': dependencies: '@octokit/openapi-types': 18.1.1 - dev: true - /@octokit/types@12.4.0: - resolution: {integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==} + '@octokit/types@12.4.0': dependencies: '@octokit/openapi-types': 19.1.0 - dev: true - /@octokit/types@6.41.0: - resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} + '@octokit/types@13.5.0': dependencies: - '@octokit/openapi-types': 12.11.0 - dev: true + '@octokit/openapi-types': 22.2.0 - /@octokit/types@9.3.2: - resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + '@octokit/types@6.41.0': dependencies: - '@octokit/openapi-types': 18.1.1 - dev: true - - /@open-draft/deferred-promise@2.2.0: - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - dev: true + '@octokit/openapi-types': 12.11.0 - /@open-draft/logger@0.3.0: - resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + '@octokit/types@9.3.2': dependencies: - is-node-process: 1.2.0 - outvariant: 1.4.2 - dev: true - - /@open-draft/until@2.1.0: - resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - dev: true + '@octokit/openapi-types': 18.1.1 - /@opentelemetry/api-logs@0.50.0: - resolution: {integrity: sha512-JdZuKrhOYggqOpUljAq4WWNi5nB10PmgoF0y2CvedLGXd0kSawb/UBnWT8gg1ND3bHCNHStAIVT0ELlxJJRqrA==} - engines: {node: '>=14'} + '@opentelemetry/api-logs@0.50.0': dependencies: '@opentelemetry/api': 1.8.0 - dev: true - /@opentelemetry/api@1.8.0: - resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} - engines: {node: '>=8.0.0'} + '@opentelemetry/api@1.8.0': {} - /@opentelemetry/core@1.23.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/core@1.23.0(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/semantic-conventions': 1.23.0 - dev: true - /@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/core@1.24.1(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/semantic-conventions': 1.24.1 - dev: true - /@opentelemetry/otlp-transformer@0.50.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-s0sl1Yfqd5q1Kjrf6DqXPWzErL+XHhrXOfejh4Vc/SMTNqC902xDsC8JQxbjuramWt/+hibfguIvi7Ns8VLolA==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' + '@opentelemetry/otlp-transformer@0.50.0(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/api-logs': 0.50.0 @@ -4674,152 +11908,87 @@ packages: '@opentelemetry/sdk-logs': 0.50.0(@opentelemetry/api-logs@0.50.0)(@opentelemetry/api@1.8.0) '@opentelemetry/sdk-metrics': 1.23.0(@opentelemetry/api@1.8.0) '@opentelemetry/sdk-trace-base': 1.23.0(@opentelemetry/api@1.8.0) - dev: true - /@opentelemetry/resources@1.23.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/resources@1.23.0(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) '@opentelemetry/semantic-conventions': 1.23.0 - dev: true - /@opentelemetry/resources@1.24.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/resources@1.24.1(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) '@opentelemetry/semantic-conventions': 1.24.1 - dev: true - /@opentelemetry/sdk-logs@0.50.0(@opentelemetry/api-logs@0.50.0)(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-PeUEupBB29p9nlPNqXoa1PUWNLsZnxG0DCDj3sHqzae+8y76B/A5hvZjg03ulWdnvBLYpnJslqzylG9E0IL87g==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.4.0 <1.9.0' - '@opentelemetry/api-logs': '>=0.39.1' + '@opentelemetry/sdk-logs@0.50.0(@opentelemetry/api-logs@0.50.0)(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/api-logs': 0.50.0 '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) '@opentelemetry/resources': 1.23.0(@opentelemetry/api@1.8.0) - dev: true - /@opentelemetry/sdk-metrics@1.23.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.9.0' + '@opentelemetry/sdk-metrics@1.23.0(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) '@opentelemetry/resources': 1.23.0(@opentelemetry/api@1.8.0) lodash.merge: 4.6.2 - dev: true - /@opentelemetry/sdk-trace-base@1.23.0(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-PzBmZM8hBomUqvCddF/5Olyyviayka44O5nDWq673np3ctnvwMOvNrsUORZjKja1zJbwEuD9niAGbnVrz3jwRQ==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/sdk-trace-base@1.23.0(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.23.0(@opentelemetry/api@1.8.0) '@opentelemetry/resources': 1.23.0(@opentelemetry/api@1.8.0) '@opentelemetry/semantic-conventions': 1.23.0 - dev: true - /@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0): - resolution: {integrity: sha512-zz+N423IcySgjihl2NfjBf0qw1RWe11XIAWVrTNOSSI6dtSPJiVom2zipFB2AEEtJWpv0Iz6DY6+TjnyTV5pWg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.9.0' + '@opentelemetry/sdk-trace-base@1.24.1(@opentelemetry/api@1.8.0)': dependencies: '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.24.1(@opentelemetry/api@1.8.0) '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.8.0) '@opentelemetry/semantic-conventions': 1.24.1 - dev: true - /@opentelemetry/semantic-conventions@1.23.0: - resolution: {integrity: sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==} - engines: {node: '>=14'} - dev: true + '@opentelemetry/semantic-conventions@1.23.0': {} - /@opentelemetry/semantic-conventions@1.24.1: - resolution: {integrity: sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==} - engines: {node: '>=14'} - dev: true + '@opentelemetry/semantic-conventions@1.24.1': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@pkgr/core@0.1.1': {} - /@playwright/test@1.43.1: - resolution: {integrity: sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==} - engines: {node: '>=16'} - hasBin: true + '@playwright/test@1.44.1': dependencies: - playwright: 1.43.1 + playwright: 1.44.1 - /@polka/url@1.0.0-next.24: - resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + '@polka/url@1.0.0-next.24': {} - /@popperjs/core@2.11.8: - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@popperjs/core@2.11.8': {} - /@react-spring/animated@9.7.3(react@18.2.0): - resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@react-spring/animated@9.7.3(react@18.2.0)': dependencies: '@react-spring/shared': 9.7.3(react@18.2.0) '@react-spring/types': 9.7.3 react: 18.2.0 - /@react-spring/core@9.7.3(react@18.2.0): - resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@react-spring/core@9.7.3(react@18.2.0)': dependencies: '@react-spring/animated': 9.7.3(react@18.2.0) '@react-spring/shared': 9.7.3(react@18.2.0) '@react-spring/types': 9.7.3 react: 18.2.0 - /@react-spring/rafz@9.7.3: - resolution: {integrity: sha512-9vzW1zJPcC4nS3aCV+GgcsK/WLaB520Iyvm55ARHfM5AuyBqycjvh1wbmWmgCyJuX4VPoWigzemq1CaaeRSHhQ==} - dev: false + '@react-spring/rafz@9.7.3': {} - /@react-spring/shared@9.7.3(react@18.2.0): - resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@react-spring/shared@9.7.3(react@18.2.0)': dependencies: '@react-spring/types': 9.7.3 react: 18.2.0 - /@react-spring/types@9.7.3: - resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} + '@react-spring/types@9.7.3': {} - /@react-spring/web@9.7.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@react-spring/web@9.7.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-spring/animated': 9.7.3(react@18.2.0) '@react-spring/core': 9.7.3(react@18.2.0) @@ -4828,48 +11997,31 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /@remix-run/router@1.15.3: - resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} - engines: {node: '>=14.0.0'} + '@remix-run/router@1.16.1': {} - /@sigstore/bundle@1.1.0: - resolution: {integrity: sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sec-ant/readable-stream@0.4.1': {} + + '@sigstore/bundle@1.1.0': dependencies: '@sigstore/protobuf-specs': 0.2.1 - dev: true - /@sigstore/bundle@2.1.1: - resolution: {integrity: sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/bundle@2.1.1': dependencies: '@sigstore/protobuf-specs': 0.2.1 - dev: true - /@sigstore/core@0.2.0: - resolution: {integrity: sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==} - engines: {node: ^16.14.0 || >=18.0.0} - dev: true + '@sigstore/core@0.2.0': {} - /@sigstore/protobuf-specs@0.2.1: - resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@sigstore/protobuf-specs@0.2.1': {} - /@sigstore/sign@1.0.0: - resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/sign@1.0.0': dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color - dev: true - /@sigstore/sign@2.2.1: - resolution: {integrity: sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/sign@2.2.1': dependencies: '@sigstore/bundle': 2.1.1 '@sigstore/core': 0.2.0 @@ -4877,90 +12029,58 @@ packages: make-fetch-happen: 13.0.0 transitivePeerDependencies: - supports-color - dev: true - /@sigstore/tuf@1.0.3: - resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@sigstore/tuf@1.0.3': dependencies: '@sigstore/protobuf-specs': 0.2.1 tuf-js: 1.1.7 transitivePeerDependencies: - supports-color - dev: true - /@sigstore/tuf@2.3.0: - resolution: {integrity: sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/tuf@2.3.0': dependencies: '@sigstore/protobuf-specs': 0.2.1 tuf-js: 2.2.0 transitivePeerDependencies: - supports-color - dev: true - /@sigstore/verify@0.1.0: - resolution: {integrity: sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/verify@0.1.0': dependencies: '@sigstore/bundle': 2.1.1 '@sigstore/core': 0.2.0 '@sigstore/protobuf-specs': 0.2.1 - dev: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true + '@sinclair/typebox@0.27.8': {} - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: true + '@sindresorhus/merge-streams@2.3.0': {} - /@sindresorhus/merge-streams@2.3.0: - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - dev: true + '@sindresorhus/merge-streams@4.0.0': {} - /@sinonjs/commons@2.0.0: - resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + '@sinonjs/commons@2.0.0': dependencies: type-detect: 4.0.8 - dev: true - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - dev: true - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 - dev: true - /@sinonjs/fake-timers@11.2.2: - resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + '@sinonjs/fake-timers@11.2.2': dependencies: '@sinonjs/commons': 3.0.1 - dev: true - /@sinonjs/samsam@8.0.0: - resolution: {integrity: sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==} + '@sinonjs/samsam@8.0.0': dependencies: '@sinonjs/commons': 2.0.0 lodash.get: 4.4.2 type-detect: 4.0.8 - dev: true - /@sinonjs/text-encoding@0.7.2: - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} - dev: true + '@sinonjs/text-encoding@0.7.2': {} - /@slack/bolt@3.18.0: - resolution: {integrity: sha512-A7bDi5kY50fS6/nsmURkQdO3iMxD8aX/rA+m1UXEM2ue2z4KijeQtx2sOZ4YkJQ/h7BsgTQM0CYh3qqmo+m5sQ==} - engines: {node: '>=12.13.0', npm: '>=6.12.0'} + '@slack/bolt@3.18.0': dependencies: '@slack/logger': 4.0.0 '@slack/oauth': 2.6.2 @@ -4982,25 +12102,16 @@ packages: - debug - supports-color - utf-8-validate - dev: true - /@slack/logger@3.0.0: - resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + '@slack/logger@3.0.0': dependencies: '@types/node': 18.19.33 - dev: true - /@slack/logger@4.0.0: - resolution: {integrity: sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==} - engines: {node: '>= 18', npm: '>= 8.6.0'} + '@slack/logger@4.0.0': dependencies: '@types/node': 18.19.33 - dev: true - /@slack/oauth@2.6.2: - resolution: {integrity: sha512-2R3MyB/R63hTRXzk5J6wcui59TBxXzhk+Uh2/Xu3Wp3O4pXg/BNucQhP/DQbL/ScVhLvFtMXirLrKi0Yo5gIVw==} - engines: {node: '>=12.13.0', npm: '>=6.12.0'} + '@slack/oauth@2.6.2': dependencies: '@slack/logger': 3.0.0 '@slack/web-api': 6.12.0 @@ -5010,11 +12121,8 @@ packages: lodash.isstring: 4.0.1 transitivePeerDependencies: - debug - dev: true - /@slack/socket-mode@1.3.3: - resolution: {integrity: sha512-vN3zG4woRtf2Ut6rZgRW6G/Oe56uLMlnz39I08Q7DOvVfB+1MmDbNv0PNOiFgujdKXJR+bXF41/F/VvryXcqlw==} - engines: {node: '>=12.13.0', npm: '>=6.12.0'} + '@slack/socket-mode@1.3.3': dependencies: '@slack/logger': 3.0.0 '@slack/web-api': 6.12.0 @@ -5030,16 +12138,10 @@ packages: - bufferutil - debug - utf-8-validate - dev: true - /@slack/types@2.11.0: - resolution: {integrity: sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - dev: true + '@slack/types@2.11.0': {} - /@slack/web-api@6.12.0: - resolution: {integrity: sha512-RPw6F8rWfGveGkZEJ4+4jUin5iazxRK2q3FpQDz/FvdgzC3nZmPyLx8WRzc6nh0w3MBjEbphNnp2VZksfhpBIQ==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + '@slack/web-api@6.12.0': dependencies: '@slack/logger': 3.0.0 '@slack/types': 2.11.0 @@ -5054,784 +12156,448 @@ packages: p-retry: 4.6.2 transitivePeerDependencies: - debug - dev: true - /@socket.io/component-emitter@3.1.0: - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} - dev: true + '@socket.io/component-emitter@3.1.0': {} - /@swc/counter@0.1.3: - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: false + '@swc/counter@0.1.3': {} - /@swc/helpers@0.5.5: - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 tslib: 2.6.2 - dev: false - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: true - - /@testing-library/dom@9.3.4: - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@10.1.0': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 + '@babel/code-frame': 7.24.6 + '@babel/runtime': 7.24.6 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - dev: true - /@testing-library/react@14.2.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-SOUuM2ysCvjUWBXTNfQ/ztmnKDmqaiPV3SvoIuyxMUca45rbSWWAT/qB8CUs/JQ/ux/8JFs9DNdFQ3f6jH3crA==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/react@15.0.7(@types/react@18.2.60)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.24.5 - '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.2.19 + '@babel/runtime': 7.24.6 + '@testing-library/dom': 10.1.0 + '@types/react-dom': 18.2.25 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: true + optionalDependencies: + '@types/react': 18.2.60 - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true + '@tootallnate/once@2.0.0': {} - /@tufjs/canonical-json@1.0.0: - resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + '@tufjs/canonical-json@1.0.0': {} - /@tufjs/canonical-json@2.0.0: - resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} - engines: {node: ^16.14.0 || >=18.0.0} - dev: true + '@tufjs/canonical-json@2.0.0': {} - /@tufjs/models@1.0.4: - resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@tufjs/models@1.0.4': dependencies: '@tufjs/canonical-json': 1.0.0 minimatch: 9.0.4 - dev: true - /@tufjs/models@2.0.0: - resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@tufjs/models@2.0.0': dependencies: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.4 - dev: true - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true + '@types/aria-query@5.0.4': {} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.5': dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.6 - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 '@types/node': 18.19.33 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.4 - '@types/keyv': 3.1.4 - '@types/node': 18.19.33 - '@types/responselike': 1.0.3 - dev: true - /@types/chai-dom@1.11.3: - resolution: {integrity: sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==} + '@types/chai-dom@1.11.3': dependencies: '@types/chai': 4.3.16 - dev: true - /@types/chai@4.3.16: - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - dev: true + '@types/chai@4.3.16': {} - /@types/chance@1.1.6: - resolution: {integrity: sha512-V+pm3stv1Mvz8fSKJJod6CglNGVqEQ6OyuqitoDkWywEODM/eJd1eSuIp9xt6DrX8BWZ2eDSIzbw1tPCUTvGbQ==} - dev: true + '@types/chance@1.1.6': {} - /@types/cheerio@0.22.35: - resolution: {integrity: sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==} + '@types/cheerio@0.22.35': dependencies: '@types/node': 18.19.33 - dev: true - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect@3.4.38': dependencies: '@types/node': 18.19.33 - dev: true - /@types/cookie@0.4.1: - resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} - dev: true + '@types/cookie@0.4.1': {} - /@types/cors@2.8.17: - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cors@2.8.17': dependencies: '@types/node': 18.19.33 - dev: true - /@types/d3-color@3.1.3: - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - dev: true + '@types/d3-color@3.1.3': {} - /@types/d3-delaunay@6.0.4: - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - dev: true + '@types/d3-delaunay@6.0.4': {} - /@types/d3-interpolate@3.0.4: - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + '@types/d3-interpolate@3.0.4': dependencies: '@types/d3-color': 3.1.3 - dev: true - /@types/d3-path@3.1.0: - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - dev: true + '@types/d3-path@3.1.0': {} - /@types/d3-scale@4.0.8: - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + '@types/d3-scale@4.0.8': dependencies: '@types/d3-time': 3.0.3 - dev: true - /@types/d3-shape@3.1.6: - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + '@types/d3-shape@3.1.6': dependencies: '@types/d3-path': 3.1.0 - dev: true - /@types/d3-time@3.0.3: - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: true + '@types/d3-time@3.0.3': {} - /@types/doctrine@0.0.9: - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - dev: true + '@types/doctrine@0.0.9': {} - /@types/enzyme@3.10.12: - resolution: {integrity: sha512-xryQlOEIe1TduDWAOphR0ihfebKFSWOXpIsk+70JskCfRfW+xALdnJ0r1ZOTo85F9Qsjk6vtlU7edTYHbls9tA==} + '@types/enzyme@3.10.12': dependencies: '@types/cheerio': 0.22.35 '@types/react': 18.2.60 - dev: true - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 '@types/estree': 1.0.5 - /@types/eslint@8.56.10: - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.5': {} - /@types/express-serve-static-core@4.17.42: - resolution: {integrity: sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==} + '@types/express-serve-static-core@4.17.42': dependencies: '@types/node': 18.19.33 '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - dev: true - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.42 '@types/qs': 6.9.11 '@types/serve-static': 1.15.5 - dev: true - /@types/format-util@1.0.4: - resolution: {integrity: sha512-xrCYOdHh5zA3LUrn6CvspYwlzSWxPso11Lx32WnAG6KvLCRecKZ/Rh21PLXUkzUFsQmrGcx/traJAFjR6dVS5Q==} - dev: false + '@types/format-util@1.0.4': {} - /@types/fs-extra@11.0.4: - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 '@types/node': 18.19.33 - dev: true - - /@types/history@4.7.11: - resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} - dev: true - /@types/html-minifier-terser@6.1.0: - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - dev: true + '@types/history@4.7.11': {} - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true + '@types/html-minifier-terser@6.1.0': {} - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true + '@types/http-errors@2.0.4': {} - /@types/is-stream@1.1.0: - resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} + '@types/is-stream@1.1.0': dependencies: '@types/node': 18.19.33 - dev: true - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: false + '@types/istanbul-lib-coverage@2.0.6': {} - /@types/jscodeshift@0.11.11: - resolution: {integrity: sha512-d7CAfFGOupj5qCDqMODXxNz2/NwCv/Lha78ZFbnr6qpk3K98iSB8I+ig9ERE2+EeYML352VMRsjPyOpeA+04eQ==} + '@types/jscodeshift@0.11.11': dependencies: ast-types: 0.14.2 recast: 0.20.5 - dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true + '@types/json5@0.0.29': {} - /@types/jsonfile@6.1.4: - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/jsonfile@6.1.4': dependencies: '@types/node': 18.19.33 - dev: true - /@types/jsonwebtoken@8.5.9: - resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} + '@types/jsonwebtoken@8.5.9': dependencies: '@types/node': 18.19.33 - dev: true - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/karma@6.3.8': dependencies: '@types/node': 18.19.33 - dev: true + log4js: 6.9.1 + transitivePeerDependencies: + - supports-color - /@types/lodash@4.17.1: - resolution: {integrity: sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==} - dev: true + '@types/lodash@4.17.4': {} - /@types/lru-cache@7.10.10: - resolution: {integrity: sha512-nEpVRPWW9EBmx2SCfNn3ClYxPL7IktPX12HhIoSc/H5mMjdeW3+YsXIpseLQ2xF35+OcpwKQbEUw5VtqE4PDNA==} - deprecated: This is a stub types definition. lru-cache provides its own type definitions, so you do not need this installed. + '@types/lru-cache@7.10.10': dependencies: lru-cache: 7.18.3 - dev: true - /@types/luxon@3.4.2: - resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} - dev: true + '@types/luxon@3.4.2': {} - /@types/mdast@3.0.15: - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@3.0.15': dependencies: '@types/unist': 2.0.10 - dev: true - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true + '@types/mime@1.3.5': {} - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true + '@types/mime@3.0.4': {} - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: true + '@types/minimatch@3.0.5': {} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@types/minimist@1.2.5': {} - /@types/mocha@10.0.6: - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} - dev: true + '@types/mocha@10.0.6': {} - /@types/moment-hijri@2.1.4: - resolution: {integrity: sha512-pGX1DaSducJDkJAC3q8fCuemow0pzI4oa0iKcspwQNPXuwlI55WRgBVrA6NVi+rf8bZN1qjWVsGdUatrLhZk6Q==} + '@types/moment-hijri@2.1.4': dependencies: moment: 2.30.1 - dev: true - /@types/moment-jalaali@0.7.9: - resolution: {integrity: sha512-gsDOoAzRnCfQTbfdlUrCvX6R0wIto6CvwfvV2C3j4qJLK+DEiTK8Rl/xlOCBO9C6qeUfX8oyZ2UfjnXJTOvHSA==} + '@types/moment-jalaali@0.7.9': dependencies: moment: 2.30.1 - dev: true - /@types/node@18.19.33: - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + '@types/node@18.19.33': dependencies: undici-types: 5.26.5 - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true - - /@types/p-queue@2.3.2: - resolution: {integrity: sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/p-queue@2.3.2': {} - /@types/prettier@2.7.3: - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: true + '@types/parse-json@4.0.2': {} - /@types/promise.allsettled@1.0.6: - resolution: {integrity: sha512-wA0UT0HeT2fGHzIFV9kWpYz5mdoyLxKrTgMdZQM++5h6pYAFH73HXcQhefg24nD1yivUFEn5KU+EF4b+CXJ4Wg==} - dev: true + '@types/promise.allsettled@1.0.6': {} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.12': {} - /@types/qs@6.9.11: - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} - dev: true + '@types/qs@6.9.11': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true + '@types/range-parser@1.2.7': {} - /@types/react-dom@18.2.19: - resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} + '@types/react-dom@18.2.25': dependencies: '@types/react': 18.2.60 - dev: true - /@types/react-router-dom@5.3.3: - resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} + '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 '@types/react': 18.2.60 '@types/react-router': 5.1.20 - dev: true - /@types/react-router@5.1.20: - resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 '@types/react': 18.2.60 - dev: true - /@types/react-test-renderer@18.0.7: - resolution: {integrity: sha512-1+ANPOWc6rB3IkSnElhjv6VLlKg2dSv/OWClUyZimbLsQyBn8Js9Vtdsi3UICJ2rIQ3k2la06dkB+C92QfhKmg==} + '@types/react-test-renderer@18.3.0': dependencies: '@types/react': 18.2.60 - dev: true - /@types/react-transition-group@4.4.10: - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + '@types/react-transition-group@4.4.10': dependencies: '@types/react': 18.2.60 - /@types/react@18.2.60: - resolution: {integrity: sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==} + '@types/react@18.2.60': dependencies: '@types/prop-types': 15.7.12 '@types/scheduler': 0.16.8 csstype: 3.1.3 - /@types/requestidlecallback@0.3.7: - resolution: {integrity: sha512-5/EwNH3H/+M2zxATq9UidyD7rCq3WhK5Te/XhdhqP270QoGInVkoNBj6kK2Ah5slkZewkX8XJb7WDaYhmJu+eg==} - dev: true - - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - dependencies: - '@types/node': 18.19.33 - dev: true - - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true + '@types/requestidlecallback@0.3.7': {} - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + '@types/retry@0.12.0': {} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + '@types/scheduler@0.16.8': {} - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 '@types/node': 18.19.33 - dev: true - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.5': dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 '@types/node': 18.19.33 - dev: true - /@types/sinon@10.0.20: - resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} + '@types/sinon@10.0.20': dependencies: '@types/sinonjs__fake-timers': 8.1.5 - dev: true - /@types/sinonjs__fake-timers@8.1.5: - resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} - dev: true + '@types/sinonjs__fake-timers@8.1.5': {} - /@types/stylis@4.2.0: - resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} - dev: false + '@types/stylis@4.2.5': {} - /@types/stylis@4.2.5: - resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} - dev: true + '@types/stylis@4.2.6': {} - /@types/tsscmp@1.0.2: - resolution: {integrity: sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g==} - dev: true + '@types/tsscmp@1.0.2': {} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: true + '@types/unist@2.0.10': {} - /@types/webpack-bundle-analyzer@4.7.0(webpack-cli@5.1.4): - resolution: {integrity: sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==} + '@types/webpack-bundle-analyzer@4.7.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))': dependencies: '@types/node': 18.19.33 tapable: 2.2.1 - webpack: 5.91.0(webpack-cli@5.1.4) + webpack: 5.91.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0)) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli - dev: true - /@types/ws@7.4.7: - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + '@types/ws@7.4.7': dependencies: '@types/node': 18.19.33 - dev: true - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true + '@types/yargs-parser@21.0.3': {} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - dev: true - /@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/type-utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 - debug: 4.3.4(supports-color@8.1.1) + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/type-utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.12.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.6.0 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.12.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@7.8.0: - resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@7.12.0': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 - dev: true + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/visitor-keys': 7.12.0 - /@typescript-eslint/type-utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4(supports-color@8.1.1) eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@7.8.0: - resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true + '@typescript-eslint/types@7.12.0': {} - /@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5): - resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@7.12.0(typescript@5.4.5)': dependencies: - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/visitor-keys': 7.8.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/visitor-keys': 7.12.0 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.0 + semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@7.8.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 + '@typescript-eslint/utils@7.12.0(eslint@8.57.0)(typescript@5.4.5)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.8.0 - '@typescript-eslint/types': 7.8.0 - '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.12.0 + '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) eslint: 8.57.0 - semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@7.8.0: - resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@7.12.0': dependencies: - '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/types': 7.12.0 eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true + '@ungap/structured-clone@1.2.0': {} - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - /@webassemblyjs/ast@1.9.0: - resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} - dependencies: - '@webassemblyjs/helper-module-context': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/wast-parser': 1.9.0 - dev: false - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - - /@webassemblyjs/floating-point-hex-parser@1.9.0: - resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} - dev: false - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - - /@webassemblyjs/helper-api-error@1.9.0: - resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} - dev: false - - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - - /@webassemblyjs/helper-buffer@1.9.0: - resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} - dev: false - - /@webassemblyjs/helper-code-frame@1.9.0: - resolution: {integrity: sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==} - dependencies: - '@webassemblyjs/wast-printer': 1.9.0 - dev: false + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-fsm@1.9.0: - resolution: {integrity: sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==} - dev: false + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-module-context@1.9.0: - resolution: {integrity: sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - dev: false + '@webassemblyjs/helper-buffer@1.12.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - - /@webassemblyjs/helper-wasm-bytecode@1.9.0: - resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} - dev: false + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.12.1 - /@webassemblyjs/helper-wasm-section@1.9.0: - resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - dev: false - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - - /@webassemblyjs/ieee754@1.9.0: - resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: false - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - /@webassemblyjs/leb128@1.9.0: - resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: false - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - /@webassemblyjs/utf8@1.9.0: - resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} - dev: false + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 @@ -5842,21 +12608,7 @@ packages: '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 - /@webassemblyjs/wasm-edit@1.9.0: - resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/helper-wasm-section': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - '@webassemblyjs/wasm-opt': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - '@webassemblyjs/wast-printer': 1.9.0 - dev: false - - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -5864,35 +12616,14 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wasm-gen@1.9.0: - resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/ieee754': 1.9.0 - '@webassemblyjs/leb128': 1.9.0 - '@webassemblyjs/utf8': 1.9.0 - dev: false - - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - /@webassemblyjs/wasm-opt@1.9.0: - resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-buffer': 1.9.0 - '@webassemblyjs/wasm-gen': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - dev: false - - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 @@ -5901,280 +12632,140 @@ packages: '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - /@webassemblyjs/wasm-parser@1.9.0: - resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-api-error': 1.9.0 - '@webassemblyjs/helper-wasm-bytecode': 1.9.0 - '@webassemblyjs/ieee754': 1.9.0 - '@webassemblyjs/leb128': 1.9.0 - '@webassemblyjs/utf8': 1.9.0 - dev: false - - /@webassemblyjs/wast-parser@1.9.0: - resolution: {integrity: sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/floating-point-hex-parser': 1.9.0 - '@webassemblyjs/helper-api-error': 1.9.0 - '@webassemblyjs/helper-code-frame': 1.9.0 - '@webassemblyjs/helper-fsm': 1.9.0 - '@xtuc/long': 4.2.2 - dev: false - - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - /@webassemblyjs/wast-printer@1.9.0: - resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} - dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/wast-parser': 1.9.0 - '@xtuc/long': 4.2.2 - dev: false - - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.91.0): - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4))': dependencies: webpack: 5.91.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0) - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.91.0): - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4))': dependencies: webpack: 5.91.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0) - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.91.0): - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4))': dependencies: webpack: 5.91.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0) - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@xtuc/long@4.2.2': {} - /@yarnpkg/lockfile@1.1.0: - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - dev: true + '@yarnpkg/lockfile@1.1.0': {} - /@yarnpkg/parsers@3.0.0-rc.46: - resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} - engines: {node: '>=14.15.0'} + '@yarnpkg/parsers@3.0.0-rc.46': dependencies: js-yaml: 3.14.1 tslib: 2.6.2 - dev: true - /@zeit/schemas@2.36.0: - resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} - dev: true + '@zeit/schemas@2.36.0': {} - /@zkochan/js-yaml@0.0.6: - resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} - hasBin: true + '@zkochan/js-yaml@0.0.6': dependencies: argparse: 2.0.1 - dev: true - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - dev: true + abbrev@1.0.9: {} - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true + abbrev@1.1.1: {} - /abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + abbrev@2.0.0: {} - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-assertions@1.9.0(acorn@8.11.3): dependencies: acorn: 8.11.3 - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - /acorn@6.4.2: - resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + acorn-walk@8.3.2: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.3: {} - /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true + add-stream@1.0.0: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} + agent-base@7.1.0: dependencies: debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 - dev: true - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: true - /aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} + aggregate-error@4.0.1: dependencies: clean-stack: 4.2.0 indent-string: 5.0.0 - dev: true - /airbnb-prop-types@2.16.0(react@18.2.0): - resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==} - peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0-alpha + airbnb-prop-types@2.16.0(react@18.2.0): dependencies: array.prototype.find: 2.2.2 function.prototype.name: 1.1.6 is-regex: 1.1.4 object-is: 1.1.5 object.assign: 4.1.5 - object.entries: 1.1.7 + object.entries: 1.1.8 prop-types: 15.8.1 prop-types-exact: 1.2.0 react: 18.2.0 react-is: 18.2.0 - dev: true - - /ajv-errors@1.0.1(ajv@6.12.6): - resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} - peerDependencies: - ajv: '>=5.0.0' - dependencies: - ajv: 6.12.6 - dev: false - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - /ajv-keywords@5.1.0(ajv@8.12.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 + ajv-keywords@5.1.0(ajv@8.12.0): dependencies: ajv: 8.12.0 fast-deep-equal: 3.1.3 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true - /algoliasearch@4.22.1: - resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} + algoliasearch@4.22.1: dependencies: '@algolia/cache-browser-local-storage': 4.22.1 '@algolia/cache-common': 4.22.1 @@ -6190,112 +12781,54 @@ packages: '@algolia/requester-common': 4.22.1 '@algolia/requester-node-http': 4.22.1 '@algolia/transporter': 4.22.1 - dev: false - /amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} - requiresBuild: true - dev: true + amdefine@1.0.1: optional: true - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: true - /ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.1: {} - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + ansi-styles@5.2.0: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + ansi-styles@6.2.1: {} - /anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - requiresBuild: true - dependencies: - micromatch: 3.1.10 - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - dev: false - optional: true + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - requiresBuild: true + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} + append-transform@2.0.0: dependencies: default-require-extensions: 3.0.1 - dev: true - - /aproba@1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - dev: false - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true + aproba@2.0.0: {} - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true + arch@2.2.0: {} - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} + archiver-utils@2.1.0: dependencies: glob: 7.2.3 graceful-fs: 4.2.11 @@ -6307,11 +12840,8 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 2.3.8 - dev: false - /archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} + archiver-utils@3.0.4: dependencies: glob: 7.2.3 graceful-fs: 4.2.11 @@ -6323,11 +12853,8 @@ packages: lodash.union: 4.6.0 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: false - /archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} + archiver@5.3.2: dependencies: archiver-utils: 2.1.0 async: 3.2.5 @@ -6336,139 +12863,78 @@ packages: readdir-glob: 1.1.3 tar-stream: 2.2.0 zip-stream: 4.1.1 - dev: false - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: true + archy@1.0.0: {} - /are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - dev: true + are-docs-informative@0.0.2: {} - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: true - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true + arg@5.0.2: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.3 - dev: true + argparse@2.0.1: {} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: true - /arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - dev: false + arr-diff@4.0.0: {} - /arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - dev: false + arr-flatten@1.1.0: {} - /arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - dev: false + arr-union@3.1.0: {} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - dev: true - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - dev: true + array-differ@3.0.0: {} - /array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true + array-flatten@1.1.1: {} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + array-ify@1.0.0: {} - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 is-string: 1.0.7 - dev: true - /array-parallel@0.1.3: - resolution: {integrity: sha512-TDPTwSWW5E4oiFiKmz6RGJ/a80Y91GuLgUYuLd49+XBS75tYo8PNgaT2K/OxuQYqkoI852MDGBorg9OcUSTQ8w==} - dev: true + array-parallel@0.1.3: {} - /array-series@0.1.5: - resolution: {integrity: sha512-L0XlBwfx9QetHOsbLDrE/vh2t018w9462HM3iaFfxRiK83aJjAt/Ja3NMkOW7FICwWTlQBa3ZbL5FKhuQWkDrg==} - dev: true + array-series@0.1.5: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - dev: false + array-unique@0.3.2: {} - /array.prototype.filter@1.0.3: - resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} - engines: {node: '>= 0.4'} + array.prototype.filter@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 - dev: true - /array.prototype.find@2.2.2: - resolution: {integrity: sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==} + array.prototype.find@2.2.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -6476,83 +12942,61 @@ packages: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} - engines: {node: '>= 0.4'} + array.prototype.findlastindex@1.2.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 get-intrinsic: 1.2.4 - dev: true - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.map@1.0.6: - resolution: {integrity: sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw==} - engines: {node: '>= 0.4'} + array.prototype.map@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 - dev: true - /array.prototype.reduce@1.0.6: - resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} - engines: {node: '>= 0.4'} + array.prototype.reduce@1.0.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 - dev: true - /array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + array.prototype.toreversed@1.1.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.tosorted@1.1.3: - resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + array.prototype.tosorted@1.1.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 @@ -6562,100 +13006,40 @@ packages: get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 - dev: true - - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: true - /arrify@3.0.0: - resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} - engines: {node: '>=12'} - dev: true + arrify@1.0.1: {} - /asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - dependencies: - bn.js: 4.12.0 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 - dev: false + arrify@2.0.1: {} - /assert@1.5.1: - resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} - dependencies: - object.assign: 4.1.5 - util: 0.10.4 - dev: false + arrify@3.0.0: {} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + assertion-error@1.1.0: {} - /assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - dev: false + assign-symbols@1.0.0: {} - /ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - dev: true + ast-types-flow@0.0.8: {} - /ast-types@0.14.2: - resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} - engines: {node: '>=4'} + ast-types@0.14.2: dependencies: tslib: 2.6.2 - /ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + ast-types@0.16.1: dependencies: tslib: 2.6.2 - dev: false - - /async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - requiresBuild: true - dev: false - optional: true - /async-retry@1.2.3: - resolution: {integrity: sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==} + async-retry@1.2.3: dependencies: retry: 0.12.0 - dev: true - /async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - dev: true + async@1.5.2: {} - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.5: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + asynckit@0.4.0: {} - /atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - dev: false + atob@2.1.2: {} - /autoprefixer@10.4.19(postcss@8.4.38): - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.19(postcss@8.4.38): dependencies: browserslist: 4.23.0 caniuse-lite: 1.0.30001606 @@ -6665,87 +13049,56 @@ packages: postcss: 8.4.38 postcss-value-parser: 4.2.0 - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 - dev: true - /axe-core@4.7.0: - resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} - engines: {node: '>=4'} - dev: true + axe-core@4.7.0: {} - /axe-core@4.8.4: - resolution: {integrity: sha512-CZLSKisu/bhJ2awW4kJndluz2HLZYIHh5Uy1+ZwDRkJi69811xgIXXfdU9HSLX0Th+ILrHj8qfL/5wzamsFtQg==} - engines: {node: '>=4'} - dev: true + axe-core@4.9.1: {} - /axios@1.6.7(debug@4.3.4): - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + axios@1.6.7(debug@4.3.4): dependencies: follow-redirects: 1.15.5(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + axobject-query@3.2.1: dependencies: dequal: 2.0.3 - dev: true - /b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - dev: true + b4a@1.6.4: {} - /babel-core@7.0.0-bridge.0(@babel/core@7.24.5): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + babel-core@7.0.0-bridge.0(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.5 - dev: false + '@babel/core': 7.24.6 - /babel-loader@9.1.3(@babel/core@7.24.5)(webpack@5.91.0): - resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' + babel-loader@9.1.3(@babel/core@7.24.6)(webpack@5.91.0(webpack-cli@5.1.4)): dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.6 find-cache-dir: 4.0.0 schema-utils: 4.2.0 webpack: 5.91.0(webpack-cli@5.1.4) - dev: true - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 cosmiconfig: 7.1.0 resolve: 1.22.8 - /babel-plugin-module-resolver@5.0.2: - resolution: {integrity: sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==} + babel-plugin-module-resolver@5.0.2: dependencies: find-babel-config: 2.1.1 glob: 9.3.5 @@ -6753,98 +13106,69 @@ packages: reselect: 4.1.8 resolve: 1.22.8 - /babel-plugin-optimize-clsx@2.6.2: - resolution: {integrity: sha512-TxgyjdVb7trTAsg/J5ByqJdbBPTYR8yaWLGQGpSxwygw8IFST5gEc1J9QktCGCHCb+69t04DWg9KOE0y2hN30w==} + babel-plugin-optimize-clsx@2.6.2: dependencies: - '@babel/generator': 7.24.5 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/generator': 7.24.6 + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 find-cache-dir: 3.3.2 lodash: 4.17.21 object-hash: 2.2.0 - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.5): - resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.6): dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.5) + '@babel/compat-data': 7.24.6 + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.6) semver: 6.3.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.5) + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.6) core-js-compat: 3.36.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.5): - resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.24.6): dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.5) + '@babel/core': 7.24.6 + '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.6) transitivePeerDependencies: - supports-color - /babel-plugin-preval@5.1.0: - resolution: {integrity: sha512-G5R+xmo5LS41A4UyZjOjV0mp9AvkuCyUOAJ6TOv/jTZS+VKh7L7HUDRcCSOb0YCM/u0fFarh7Diz0wjY8rFNFg==} - engines: {node: '>=10', npm: '>=6'} + babel-plugin-preval@5.1.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 '@types/babel__core': 7.20.5 babel-plugin-macros: 3.1.0 require-from-string: 2.0.2 - dev: false - /babel-plugin-react-remove-properties@0.3.0: - resolution: {integrity: sha512-vbxegtXGyVcUkCvayLzftU95vuvpYFV85pRpeMpohMHeEY46Qe0VNWfkVVcCbaZ12CXHzDFOj0esumATcW83ng==} + babel-plugin-react-remove-properties@0.3.0: {} - /babel-plugin-replace-imports@1.0.2(patch_hash=7wlacyoi44skuhtzjdjwgtjyxe): - resolution: {integrity: sha512-v+9S4FBg9wYit3c+bDxhRHv/pnhBhhneZOPvqT1c293SSjUuUy1MPK76TsJ9038fp/SD2/TNcqG5PUBoG9/ByQ==} + babel-plugin-replace-imports@1.0.2(patch_hash=7wlacyoi44skuhtzjdjwgtjyxe): dependencies: lodash.isempty: 4.4.0 lodash.isfunction: 3.0.9 lodash.isobject: 3.0.2 lodash.isregexp: 4.0.1 lodash.isstring: 4.0.1 - dev: true - patched: true - /babel-plugin-search-and-replace@1.1.1: - resolution: {integrity: sha512-fjP2VTF3mxxOUnc96mdK22llH92A6gu7A5AFapJmgnqsQi3bqLduIRP0FpA2r5vRZOYPpnX4rE5izQlpsMBjSA==} - dev: true + babel-plugin-search-and-replace@1.1.1: {} - /babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + babel-plugin-transform-react-remove-prop-types@0.4.24: {} - /bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - dev: true + bail@1.0.5: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - dev: true + base64id@2.0.0: {} - /base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} + base@0.11.2: dependencies: cache-base: 1.0.1 class-utils: 0.3.6 @@ -6853,76 +13177,31 @@ packages: isobject: 3.0.1 mixin-deep: 1.3.2 pascalcase: 0.1.1 - dev: false - - /before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - dev: true - /big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - dev: false + before-after-hook@2.2.3: {} - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + big-integer@1.6.52: {} - /bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - dev: true + big.js@5.2.2: {} - /binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dev: false - optional: true + bignumber.js@9.1.2: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - requiresBuild: true + binary-extensions@2.2.0: {} - /binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + binary@0.3.0: dependencies: buffers: 0.1.1 chainsaw: 0.1.0 - dev: false - - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - requiresBuild: true - dependencies: - file-uri-to-path: 1.0.0 - dev: false - optional: true - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - dev: false - - /bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + bluebird@3.4.7: {} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - dev: false - - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - dev: false - - /body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -6938,11 +13217,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@1.20.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -6958,19 +13234,12 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true + boolbase@1.0.0: {} - /bottleneck@2.19.5: - resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} - dev: true + bottleneck@2.19.5: {} - /boxen@7.0.0: - resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} - engines: {node: '>=14.16'} + boxen@7.0.0: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -6980,22 +13249,17 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} + braces@2.3.2: dependencies: arr-flatten: 1.1.0 array-unique: 0.3.2 @@ -7009,176 +13273,54 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: false - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - dev: false - - /browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - dev: true - - /browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - dev: false - - /browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - dependencies: - cipher-base: 1.0.4 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false - - /browserify-rsa@4.1.0: - resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} - dependencies: - bn.js: 5.2.1 - randombytes: 2.1.0 - dev: false - - /browserify-sign@4.2.2: - resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} - engines: {node: '>= 4'} - dependencies: - bn.js: 5.2.1 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.5.4 - inherits: 2.0.4 - parse-asn1: 5.1.6 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: false - - /browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - dependencies: - pako: 1.0.11 - dev: false + browser-stdout@1.3.1: {} - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.23.0: dependencies: caniuse-lite: 1.0.30001606 electron-to-chromium: 1.4.728 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: false - - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: true - - /buffer-from@0.1.2: - resolution: {integrity: sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==} - dev: false + buffer-crc32@0.2.13: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-equal-constant-time@1.0.1: {} - /buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} - dev: false + buffer-from@0.1.2: {} - /buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - dev: false + buffer-from@1.1.2: {} - /buffer@4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - dev: false + buffer-indexof-polyfill@1.0.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} - dev: false - - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: true - - /builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - dev: false + buffers@0.1.1: {} - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - dev: true + builtins@1.0.3: {} - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.0.1: dependencies: - semver: 7.6.0 - dev: true + semver: 7.6.2 - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: false - /byte-size@8.1.1: - resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} - engines: {node: '>=12.17'} - dev: true + byte-size@8.1.1: {} - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.0.0: {} - /bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true + bytes@3.1.2: {} - /c8@7.14.0: - resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} - engines: {node: '>=10.12.0'} - hasBin: true + c8@7.14.0: dependencies: '@bcoe/v8-coverage': 0.2.3 '@istanbuljs/schema': 0.1.3 @@ -7192,31 +13334,8 @@ packages: v8-to-istanbul: 9.2.0 yargs: 16.2.0 yargs-parser: 20.2.9 - dev: false - - /cacache@12.0.4: - resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} - dependencies: - bluebird: 3.7.2 - chownr: 1.1.4 - figgy-pudding: 3.5.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - infer-owner: 1.0.4 - lru-cache: 5.1.1 - mississippi: 3.0.0 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - promise-inflight: 1.0.1(bluebird@3.7.2) - rimraf: 2.7.1 - ssri: 6.0.2 - unique-filename: 1.1.1 - y18n: 4.0.3 - dev: false - /cacache@17.1.4: - resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cacache@17.1.4: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.3 @@ -7228,13 +13347,10 @@ packages: minipass-pipeline: 1.2.4 p-map: 4.0.0 ssri: 10.0.5 - tar: 6.2.0 + tar: 6.2.1 unique-filename: 3.0.0 - dev: true - /cacache@18.0.2: - resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} - engines: {node: ^16.14.0 || >=18.0.0} + cacache@18.0.2: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.3 @@ -7246,13 +13362,10 @@ packages: minipass-pipeline: 1.2.4 p-map: 4.0.0 ssri: 10.0.5 - tar: 6.2.0 + tar: 6.2.1 unique-filename: 3.0.0 - dev: true - /cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} + cache-base@1.0.1: dependencies: collection-visit: 1.0.0 component-emitter: 1.3.1 @@ -7263,39 +13376,15 @@ packages: to-object-path: 0.3.0 union-value: 1.0.1 unset-value: 1.0.0 - dev: false - - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: true - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: true - /caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} + caching-transform@4.0.0: dependencies: hasha: 5.2.2 make-dir: 3.1.0 package-hash: 4.0.0 write-file-atomic: 3.0.3 - dev: true - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 @@ -7303,60 +13392,34 @@ packages: get-intrinsic: 1.2.4 set-function-length: 1.2.2 - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.6.2 - dev: true - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true + camelcase@6.3.0: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true + camelcase@7.0.1: {} - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false + camelize@1.0.1: {} - /caniuse-lite@1.0.30001606: - resolution: {integrity: sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==} + caniuse-lite@1.0.30001606: {} - /chai-dom@1.12.0(chai@4.4.1): - resolution: {integrity: sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==} - engines: {node: '>= 0.12.0'} - peerDependencies: - chai: '>= 3' + chai-dom@1.12.0(chai@4.4.1): dependencies: chai: 4.4.1 - dev: true - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@4.4.1: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -7365,82 +13428,50 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 - dev: true - /chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + chainsaw@0.1.0: dependencies: traverse: 0.3.9 - dev: false - /chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} + chalk-template@0.4.0: dependencies: chalk: 4.1.2 - dev: true - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.0: - resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} - engines: {node: '>=10'} + chalk@4.1.0: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.0.1: - resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.0.1: {} - /chance@1.1.11: - resolution: {integrity: sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA==} - dev: false + chalk@5.3.0: {} - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: true + chance@1.1.11: {} - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: true + character-entities-legacy@1.1.4: {} - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - dev: true + character-entities@1.2.4: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + character-reference-invalid@1.1.4: {} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + chardet@0.7.0: {} + + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: true - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 css-select: 5.1.0 @@ -7448,11 +13479,8 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 - dev: true - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + cheerio@1.0.0-rc.12: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 @@ -7461,34 +13489,8 @@ packages: htmlparser2: 8.0.2 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 - dev: true - - /chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies - requiresBuild: true - dependencies: - anymatch: 2.0.0 - async-each: 1.0.6 - braces: 2.3.2 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -7500,295 +13502,168 @@ packages: optionalDependencies: fsevents: 2.3.3 - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true + chownr@1.1.4: {} - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} + chownr@2.0.0: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true + chrome-trace-event@1.0.3: {} - /cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false + ci-info@3.9.0: {} - /class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} + class-utils@0.3.6: dependencies: arr-union: 3.1.0 define-property: 0.2.5 isobject: 3.0.1 static-extend: 0.1.2 - dev: false - /clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} + clean-css@5.3.3: dependencies: source-map: 0.6.1 - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true + clean-stack@2.2.0: {} - /clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} + clean-stack@4.2.0: dependencies: escape-string-regexp: 5.0.0 - dev: true - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: true + cli-boxes@3.0.0: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - dev: true - /cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.6.1: {} - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: true + cli-spinners@2.9.2: {} - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true + cli-width@3.0.0: {} - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + client-only@0.0.1: {} - /clipboard-copy@4.0.1: - resolution: {integrity: sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==} - dev: false + clipboard-copy@4.0.1: {} - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + clipboardy@3.0.0: dependencies: arch: 2.2.0 execa: 5.1.1 is-wsl: 2.2.0 - dev: true - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true + clone@1.0.4: {} - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + clsx@2.1.1: {} - /cmd-shim@6.0.1: - resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + cmd-shim@6.0.1: {} - /collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} + collection-visit@1.0.0: dependencies: map-visit: 1.0.0 object-visit: 1.0.1 - dev: false - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: true - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true + color-support@1.1.3: {} - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + color@4.2.3: dependencies: color-convert: 2.0.1 color-string: 1.9.1 - dev: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorette@2.0.20: {} - /colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - dev: true + colors@1.4.0: {} - /columnify@1.6.0: - resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} - engines: {node: '>=8.0.0'} + columnify@1.6.0: dependencies: strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - dev: true - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + commander@10.0.1: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + commander@4.1.1: {} - /commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + commander@6.2.1: {} - /commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: true + commander@7.2.0: {} - /comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - dev: true + commander@8.3.0: {} - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true + comment-parser@1.4.1: {} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + common-path-prefix@3.0.0: {} - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + commondir@1.0.1: {} + + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: false + component-emitter@1.3.1: {} - /compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} + compress-commons@4.1.2: dependencies: buffer-crc32: 0.2.13 crc32-stream: 4.0.3 normalize-path: 3.0.0 readable-stream: 3.6.2 - dev: false - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + compressible@2.0.18: dependencies: mime-db: 1.52.0 - dev: true - /compression-webpack-plugin@11.1.0(webpack@5.91.0): - resolution: {integrity: sha512-zDOQYp10+upzLxW+VRSjEpRRwBXJdsb5lBMlRxx1g8hckIFBpe3DTI0en2w7h+beuq89576RVzfiXrkdPGrHhA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.1.0 + compression-webpack-plugin@11.1.0(webpack@5.91.0(webpack-cli@5.1.4)): dependencies: schema-utils: 4.2.0 serialize-javascript: 6.0.2 webpack: 5.91.0(webpack-cli@5.1.4) - dev: true - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + compression@1.7.4: dependencies: accepts: 1.3.8 bytes: 3.0.0 @@ -7799,35 +13674,17 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - dev: false + concat-map@0.0.1: {} - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: true - /concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true + concurrently@8.2.2: dependencies: chalk: 4.1.2 date-fns: 2.30.0 @@ -7838,15 +13695,10 @@ packages: supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 - dev: true - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: true + confusing-browser-globals@1.0.11: {} - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} + connect@3.7.0: dependencies: debug: 2.6.9 finalhandler: 1.1.2 @@ -7854,47 +13706,22 @@ packages: utils-merge: 1.0.1 transitivePeerDependencies: - supports-color - dev: true - - /console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - dev: false - - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true - /constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - dev: false + console-control-strings@1.1.0: {} - /content-disposition@0.5.2: - resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} - engines: {node: '>= 0.6'} - dev: true + content-disposition@0.5.2: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: true - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: true + content-type@1.0.5: {} - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: true - /conventional-changelog-core@5.0.1: - resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} - engines: {node: '>=14'} + conventional-changelog-core@5.0.1: dependencies: add-stream: 1.0.0 conventional-changelog-writer: 6.0.1 @@ -7907,50 +13734,32 @@ packages: normalize-package-data: 3.0.3 read-pkg: 3.0.0 read-pkg-up: 3.0.0 - dev: true - /conventional-changelog-preset-loader@3.0.0: - resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} - engines: {node: '>=14'} - dev: true + conventional-changelog-preset-loader@3.0.0: {} - /conventional-changelog-writer@6.0.1: - resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} - engines: {node: '>=14'} - hasBin: true + conventional-changelog-writer@6.0.1: dependencies: conventional-commits-filter: 3.0.0 dateformat: 3.0.3 handlebars: 4.7.8 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 7.6.0 + semver: 7.6.2 split: 1.0.1 - dev: true - /conventional-commits-filter@3.0.0: - resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} - engines: {node: '>=14'} + conventional-commits-filter@3.0.0: dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 - dev: true - /conventional-commits-parser@4.0.0: - resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} - engines: {node: '>=14'} - hasBin: true + conventional-commits-parser@4.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 meow: 8.1.2 split2: 3.2.2 - dev: true - /conventional-recommended-bump@7.0.1: - resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} - engines: {node: '>=14'} - hasBin: true + conventional-recommended-bump@7.0.1: dependencies: concat-stream: 2.0.0 conventional-changelog-preset-loader: 3.0.0 @@ -7959,82 +13768,40 @@ packages: git-raw-commits: 3.0.0 git-semver-tags: 5.0.1 meow: 8.1.2 - dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convert-source-map@2.0.0: {} - /convict@6.2.4: - resolution: {integrity: sha512-qN60BAwdMVdofckX7AlohVJ2x9UvjTNoKVXCL2LxFk1l7757EJqf1nySdMkPQer0bt8kQ5lQiyZ9/2NvrFBuwQ==} - engines: {node: '>=6'} + convict@6.2.4: dependencies: lodash.clonedeep: 4.5.0 yargs-parser: 20.2.9 - dev: true - /cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - dev: true + cookie-signature@1.0.6: {} - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true + cookie@0.4.2: {} - /copy-concurrently@1.0.5: - resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} - dependencies: - aproba: 1.2.0 - fs-write-stream-atomic: 1.0.10 - iferr: 0.1.5 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: false + cookie@0.5.0: {} - /copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - dev: false + copy-descriptor@0.1.1: {} - /core-js-compat@3.36.1: - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + core-js-compat@3.36.1: dependencies: browserslist: 4.23.0 - /core-js@2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false + core-js@2.6.12: {} - /core-js@3.35.1: - resolution: {integrity: sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==} - requiresBuild: true - dev: true + core-js@3.35.1: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-util-is@1.0.3: {} - /cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} + cors@2.8.5: dependencies: object-assign: 4.1.1 vary: 1.1.2 - dev: true - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 @@ -8042,43 +13809,27 @@ packages: path-type: 4.0.0 yaml: 1.10.2 - /cosmiconfig@8.3.6(typescript@5.4.5): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.4.5): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.4.5 - dev: true - /cp-file@10.0.0: - resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} - engines: {node: '>=14.16'} + cp-file@10.0.0: dependencies: graceful-fs: 4.2.11 nested-error-stacks: 2.1.1 p-event: 5.0.1 - dev: true - /cpy-cli@5.0.0: - resolution: {integrity: sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ==} - engines: {node: '>=16'} - hasBin: true + cpy-cli@5.0.0: dependencies: cpy: 10.1.0 meow: 12.1.1 - dev: true - /cpy@10.1.0: - resolution: {integrity: sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ==} - engines: {node: '>=16'} + cpy@10.1.0: dependencies: arrify: 3.0.0 cp-file: 10.0.0 @@ -8088,239 +13839,114 @@ packages: nested-error-stacks: 2.1.1 p-filter: 3.0.0 p-map: 6.0.0 - dev: true - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: false + crc-32@1.2.2: {} - /crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} + crc32-stream@4.0.3: dependencies: crc-32: 1.2.2 readable-stream: 3.6.2 - dev: false - - /create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - dependencies: - bn.js: 4.12.0 - elliptic: 6.5.4 - dev: false - - /create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - dev: false - - /create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: false - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true + cross-env@7.0.3: dependencies: cross-spawn: 7.0.3 - /cross-spawn@4.0.2: - resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==} + cross-spawn@4.0.2: dependencies: lru-cache: 4.1.5 which: 1.3.1 - dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /crypto-browserify@3.12.0: - resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.2 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - inherits: 2.0.4 - pbkdf2: 3.1.2 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - dev: false - - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false + css-color-keywords@1.0.0: {} - /css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + css-select@4.3.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 4.3.1 domutils: 2.8.0 nth-check: 2.1.1 - dev: true - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.1.0: dependencies: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: true - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-to-react-native@3.2.0: dependencies: camelize: 1.0.1 css-color-keywords: 1.0.0 postcss-value-parser: 4.2.0 - dev: false - /css-vendor@2.0.8: - resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} + css-vendor@2.0.8: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 is-in-browser: 1.1.3 - dev: false - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true + css-what@6.1.0: {} - /cssjanus@2.1.0: - resolution: {integrity: sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g==} - engines: {node: '>=10.0.0'} + cssjanus@2.1.0: {} - /cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + cssstyle@4.0.1: dependencies: rrweb-cssom: 0.6.0 - dev: true - - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - /custom-event@1.0.1: - resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} - dev: true + csstype@3.1.3: {} - /cyclist@1.0.2: - resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} - dev: false + custom-event@1.0.1: {} - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + d3-array@3.2.4: dependencies: internmap: 2.0.3 - dev: false - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false + d3-color@3.1.0: {} - /d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} + d3-delaunay@6.0.4: dependencies: delaunator: 5.0.1 - dev: false - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false + d3-format@3.1.0: {} - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + d3-interpolate@3.0.1: dependencies: d3-color: 3.1.0 - dev: false - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false + d3-path@3.1.0: {} - /d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + d3-scale@4.0.2: dependencies: d3-array: 3.2.4 d3-format: 3.1.0 d3-interpolate: 3.0.1 d3-time: 3.1.0 d3-time-format: 4.1.0 - dev: false - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + d3-shape@3.2.0: dependencies: d3-path: 3.1.0 - dev: false - /d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + d3-time-format@4.1.0: dependencies: d3-time: 3.1.0 - dev: false - - /d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + + d3-time@3.1.0: dependencies: d3-array: 3.2.4 - dev: false - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true + damerau-levenshtein@1.0.8: {} - /danger@11.3.1: - resolution: {integrity: sha512-+slkGnbf0czY7g4LSuYpYkKJgFrb9YIXFJvV5JAuLLF39CXLlUw0iebgeL3ASK1t6RDb8xe+Rk2F5ilh2Hdv2w==} - engines: {node: '>=14.13.1'} - hasBin: true + danger@12.3.0(encoding@0.1.13): dependencies: - '@gitbeaker/core': 35.8.1 - '@gitbeaker/node': 35.8.1 - '@octokit/rest': 18.12.0 + '@gitbeaker/rest': 38.12.1 + '@octokit/rest': 18.12.0(encoding@0.1.13) async-retry: 1.2.3 chalk: 2.4.2 commander: 2.20.3 @@ -8340,10 +13966,10 @@ packages: lodash.keys: 4.2.0 lodash.mapvalues: 4.6.0 lodash.memoize: 4.1.2 - memfs-or-file-map-to-github-branch: 1.2.1 + memfs-or-file-map-to-github-branch: 1.2.1(encoding@0.1.13) micromatch: 4.0.5 node-cleanup: 2.1.2 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) override-require: 1.1.1 p-limit: 2.3.0 parse-diff: 0.7.1 @@ -8359,555 +13985,277 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true + dargs@7.0.0: {} - /data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - dev: true - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-data-view: 1.0.1 - dev: true - /date-fns-jalali@2.30.0-0: - resolution: {integrity: sha512-2wz5AOzd3oQ+PnL3E/iKvJZ14i6oTp15sW047ZFCOgM9OSP8ggbb9jm/4SKI8ejdUGH96Krb5dfEQe8zbkVyZw==} - engines: {node: '>=0.11'} + date-fns-jalali@2.30.0-0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 - /date-fns-jalali@3.6.0-0: - resolution: {integrity: sha512-rcOocwhBFgEN4i+vXPoEp/irCxAmX8yloK/l/oeMOVCLpaFQfkq7jVn0vCWK91P2H9I/doSAPEN4WSWQeqwsug==} - dev: true + date-fns-jalali@3.6.0-0: {} - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + date-fns@2.30.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 - /date-fns@3.6.0: - resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - dev: true + date-fns@3.6.0: {} - /date-format@4.0.14: - resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} - engines: {node: '>=4.0'} - dev: true + date-format@4.0.14: {} - /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true + dateformat@3.0.3: {} - /dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dayjs@1.11.11: {} - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debounce@1.2.1: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.3 - dev: true - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: supports-color: 8.1.1 - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true + decamelize@1.2.0: {} - /decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - dev: true + decamelize@4.0.0: {} - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + decimal.js@10.4.3: {} - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} + decode-uri-component@0.2.2: {} - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: true - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true + dedent@0.7.0: {} - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: true - - /deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.15 - dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /default-require-extensions@3.0.1: - resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} - engines: {node: '>=8'} + default-require-extensions@3.0.1: dependencies: strip-bom: 4.0.0 - dev: true - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true - - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 gopd: 1.0.1 - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true + define-lazy-prop@2.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 - /define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} + define-property@0.2.5: dependencies: is-descriptor: 0.1.7 - dev: false - /define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} + define-property@1.0.0: dependencies: is-descriptor: 1.0.3 - dev: false - /define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} + define-property@2.0.2: dependencies: is-descriptor: 1.0.3 isobject: 3.0.1 - dev: false - /delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 - dev: false - - /delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true + delayed-stream@1.0.0: {} - /deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dev: true + delegates@1.0.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + depd@2.0.0: {} - /des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: false + deprecation@2.3.1: {} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true + dequal@2.0.3: {} - /detect-indent@5.0.0: - resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} - engines: {node: '>=4'} - dev: true + destroy@1.2.0: {} - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: true + detect-indent@5.0.0: {} - /di@0.0.1: - resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} - dev: true + detect-libc@2.0.2: {} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + di@0.0.1: {} - /diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - dev: true + diff-sequences@29.6.3: {} - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: true + diff@5.0.0: {} - /diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - dependencies: - bn.js: 4.12.0 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - dev: false + diff@5.1.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /discontinuous-range@1.0.0: - resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} - dev: true + discontinuous-range@1.0.0: {} - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true + dom-accessibility-api@0.5.16: {} - /dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + dom-accessibility-api@0.6.3: {} + + dom-converter@0.2.0: dependencies: utila: 0.4.0 - dev: true - /dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 csstype: 3.1.3 - /dom-serialize@2.2.1: - resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + dom-serialize@2.2.1: dependencies: custom-event: 1.0.1 ent: 2.2.0 extend: 3.0.2 void-elements: 2.0.1 - dev: true - /dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 - dev: true - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: true - /domain-browser@1.2.0: - resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} - engines: {node: '>=0.4', npm: '>=1.2'} - dev: false - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true + domelementtype@2.3.0: {} - /domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + domhandler@4.3.1: dependencies: domelementtype: 2.3.0 - dev: true - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - dev: true - /domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + domutils@2.8.0: dependencies: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 - dev: true - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: true - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: true - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + dotenv-expand@10.0.0: {} - /dotenv@16.3.2: - resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} - engines: {node: '>=12'} - dev: true + dotenv@16.3.2: {} - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexer2@0.1.4: dependencies: readable-stream: 2.3.8 - dev: false - - /duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - dev: false + duplexer@0.1.2: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eastasianwidth@0.2.0: {} - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - dev: true - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true + ee-first@1.1.1: {} - /ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.9: dependencies: jake: 10.8.7 - dev: true - - /electron-to-chromium@1.4.728: - resolution: {integrity: sha512-Ud1v7hJJYIqehlUJGqR6PF1Ek8l80zWwxA6nGxigBsGJ9f9M2fciHyrIiNMerSHSH3p+0/Ia7jIlnDkt41h5cw==} - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: false + electron-to-chromium@1.4.728: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emoji-regex@9.2.2: {} - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + emojis-list@3.0.0: {} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true + encodeurl@1.0.2: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: true optional: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - /engine.io-parser@5.2.1: - resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} - engines: {node: '>=10.0.0'} - dev: true + engine.io-parser@5.2.1: {} - /engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} - engines: {node: '>=10.2.0'} + engine.io@6.5.4: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 @@ -8923,93 +14271,51 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /enhanced-resolve@0.9.1: - resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} - engines: {node: '>=0.6'} + enhanced-resolve@0.9.1: dependencies: graceful-fs: 4.2.11 memory-fs: 0.2.0 tapable: 0.1.10 - dev: true - - /enhanced-resolve@4.5.0: - resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} - engines: {node: '>=6.9.0'} - dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.5.0 - tapable: 1.1.3 - dev: false - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.16.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - /enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 - dev: true - /ent@2.2.0: - resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} - dev: true + ent@2.2.0: {} - /entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true + entities@2.2.0: {} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + entities@4.5.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /envinfo@7.11.0: - resolution: {integrity: sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==} - engines: {node: '>=4'} - hasBin: true + envinfo@7.11.0: {} - /envinfo@7.8.1: - resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} - engines: {node: '>=4'} - hasBin: true - dev: true + envinfo@7.8.1: {} - /enzyme-adapter-utils@1.14.1(react@18.2.0): - resolution: {integrity: sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==} - peerDependencies: - react: 0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0 + enzyme-adapter-utils@1.14.1(react@18.2.0): dependencies: airbnb-prop-types: 2.16.0(react@18.2.0) function.prototype.name: 1.1.6 has: 1.0.4 object.assign: 4.1.5 - object.fromentries: 2.0.7 + object.fromentries: 2.0.8 prop-types: 15.8.1 react: 18.2.0 semver: 5.7.2 - dev: true - /enzyme-shallow-equal@1.0.5: - resolution: {integrity: sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==} + enzyme-shallow-equal@1.0.5: dependencies: has: 1.0.4 object-is: 1.1.5 - dev: true - /enzyme@3.11.0: - resolution: {integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==} + enzyme@3.11.0: dependencies: array.prototype.flat: 1.3.2 cheerio: 1.0.0-rc.12 @@ -9028,32 +14334,19 @@ packages: object-inspect: 1.13.1 object-is: 1.1.5 object.assign: 4.1.5 - object.entries: 1.1.7 - object.values: 1.1.7 + object.entries: 1.1.8 + object.values: 1.2.0 raf: 3.4.1 rst-selector-parser: 2.2.3 string.prototype.trim: 1.2.9 - dev: true - - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true - /errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - dependencies: - prr: 1.0.1 - dev: false + err-code@2.0.3: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -9101,24 +14394,16 @@ packages: typed-array-length: 1.0.6 unbox-primitive: 1.0.2 which-typed-array: 1.1.15 - dev: true - /es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true + es-array-method-boxes-properly@1.0.0: {} - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + es-errors@1.3.0: {} - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-get-iterator@1.1.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -9129,11 +14414,8 @@ packages: is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 - dev: true - /es-iterator-helpers@1.0.18: - resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} - engines: {node: '>= 0.4'} + es-iterator-helpers@1.0.19: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -9149,102 +14431,68 @@ packages: internal-slot: 1.0.7 iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - dev: true - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + es-module-lexer@1.4.1: {} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 - dev: true - - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: true - - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - dev: true - - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: true + es6-error@4.1.1: {} - /escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} - hasBin: true + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.1: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + escodegen@1.8.1: dependencies: esprima: 2.7.3 estraverse: 1.9.3 @@ -9252,88 +14500,54 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.2.0 - dev: true - /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.2 + eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint@8.57.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.57.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) object.assign: 4.1.5 - object.entries: 1.1.7 + object.entries: 1.1.8 semver: 6.3.1 - dev: true - /eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.8.0)(@typescript-eslint/parser@7.8.0)(eslint-plugin-import@2.29.1)(eslint@8.57.0): - resolution: {integrity: sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^7.0.0 - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + eslint-config-airbnb-typescript@18.0.0(@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - eslint-plugin-import - dev: true - /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.2)(eslint-plugin-react@7.34.1)(eslint@8.57.0): - resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} - engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.3 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 + eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.34.2(eslint@8.57.0))(eslint@8.57.0): dependencies: eslint: 8.57.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.34.1(eslint@8.57.0) + eslint-plugin-react: 7.34.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) object.assign: 4.1.5 - object.entries: 1.1.7 - dev: true + object.entries: 1.1.8 - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: true - /eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0): - resolution: {integrity: sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==} - engines: {node: '>= 6'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - webpack: '>=1.11.0' + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0(webpack-cli@5.1.4)): dependencies: array.prototype.find: 2.2.2 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 @@ -9345,62 +14559,29 @@ packages: webpack: 5.91.0(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0(webpack-cli@5.1.4)))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0(webpack-cli@5.1.4)) transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-filenames@1.3.2(eslint@8.57.0): - resolution: {integrity: sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==} - peerDependencies: - eslint: '*' + eslint-plugin-filenames@1.3.2(eslint@8.57.0): dependencies: eslint: 8.57.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 lodash.upperfirst: 4.3.1 - dev: true - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0): - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 @@ -9408,183 +14589,132 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.8.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8)(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.29.1)(webpack@5.91.0(webpack-cli@5.1.4)))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 + object.fromentries: 2.0.8 object.groupby: 1.0.1 - object.values: 1.1.7 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-jsdoc@48.2.3(eslint@8.57.0): - resolution: {integrity: sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint-plugin-jsdoc@48.2.7(eslint@8.57.0): dependencies: - '@es-joy/jsdoccomment': 0.42.0 + '@es-joy/jsdoccomment': 0.43.1 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.3.4(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint: 8.57.0 esquery: 1.5.0 - is-builtin-module: 3.2.1 - semver: 7.6.0 + semver: 7.6.2 spdx-expression-parse: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): - resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 aria-query: 5.3.0 - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 axe-core: 4.7.0 axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.18 + es-iterator-helpers: 1.0.19 eslint: 8.57.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - dev: true + object.entries: 1.1.8 + object.fromentries: 2.0.8 - /eslint-plugin-mocha@10.4.3(eslint@8.57.0): - resolution: {integrity: sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - eslint: '>=7.0.0' + eslint-plugin-mocha@10.4.3(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-utils: 3.0.0(eslint@8.57.0) globals: 13.24.0 rambda: 7.5.0 - dev: true - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.0): dependencies: eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) - prettier: 3.2.5 + prettier: 3.3.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 - dev: true + optionalDependencies: + '@types/eslint': 8.56.10 + eslint-config-prettier: 9.1.0(eslint@8.57.0) - /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-compiler@0.0.0-experimental-51a85ea-20240601(eslint@8.57.0): + dependencies: + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.24.6) + eslint: 8.57.0 + hermes-parser: 0.20.1 + zod: 3.23.8 + zod-validation-error: 3.3.0(zod@3.23.8) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 - dev: true - /eslint-plugin-react@7.34.1(eslint@8.57.0): - resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + eslint-plugin-react@7.34.2(eslint@8.57.0): dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 array.prototype.toreversed: 1.1.2 array.prototype.tosorted: 1.1.3 doctrine: 2.1.0 - es-iterator-helpers: 1.0.18 + es-iterator-helpers: 1.0.19 eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 - dev: true - - /eslint-scope@4.0.3: - resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} - engines: {node: '>=4.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false + string.prototype.matchall: 4.0.11 - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-utils@3.0.0(eslint@8.57.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' + eslint-utils@3.0.0(eslint@8.57.0): dependencies: eslint: 8.57.0 eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true + eslint-visitor-keys@2.1.0: {} - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 @@ -9626,96 +14756,50 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: true + esprima@2.7.3: {} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - /estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} - dev: true + estraverse@1.9.3: {} - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + estraverse@5.3.0: {} - /estree-to-babel@3.2.1: - resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} - engines: {node: '>=8.3.0'} + estree-to-babel@3.2.1: dependencies: - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 c8: 7.14.0 transitivePeerDependencies: - supports-color - dev: false - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true + esutils@2.0.3: {} - /eventemitter3@3.1.2: - resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} - dev: true + etag@1.8.1: {} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true + eventemitter3@3.1.2: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + eventemitter3@4.0.7: {} - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - dev: false + events@3.3.0: {} - /exceljs@4.4.0: - resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} - engines: {node: '>=8.3.0'} + exceljs@4.4.0: dependencies: archiver: 5.3.2 dayjs: 1.11.11 @@ -9726,11 +14810,8 @@ packages: tmp: 0.2.1 unzipper: 0.10.14 uuid: 8.3.2 - dev: false - /execa@5.0.0: - resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} - engines: {node: '>=10'} + execa@5.0.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -9741,11 +14822,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -9756,26 +14834,23 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@9.1.0: dependencies: + '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 7.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 npm-run-path: 5.3.0 - onetime: 6.0.0 + pretty-ms: 9.0.0 signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true + strip-final-newline: 4.0.0 + yoctocolors: 2.0.2 - /expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} + expand-brackets@2.1.4: dependencies: debug: 2.6.9 define-property: 0.2.5 @@ -9786,27 +14861,16 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: false - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: true + expand-template@2.0.3: {} - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - dev: true - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: true + exponential-backoff@3.1.1: {} - /express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + express@4.18.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -9841,38 +14905,25 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - /extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} + extend-shallow@3.0.2: dependencies: assign-symbols: 1.0.0 is-extendable: 1.0.1 - dev: false - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true + extend@3.0.2: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} + extglob@2.0.4: dependencies: array-unique: 0.3.2 define-property: 1.0.0 @@ -9884,125 +14935,72 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: false - /fast-csv@4.3.6: - resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} - engines: {node: '>=10.0.0'} + fast-csv@4.3.6: dependencies: '@fast-csv/format': 4.3.5 '@fast-csv/parse': 4.3.6 - dev: false - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: true + fast-fifo@1.3.2: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: true - /fast-json-patch@3.1.1: - resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} - dev: true + fast-json-patch@3.1.1: {} - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-url-parser@1.1.3: - resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} + fast-url-parser@1.1.3: dependencies: punycode: 1.4.1 - dev: true - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} + fastest-levenshtein@1.0.16: {} - /fastq@1.17.0: - resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} + fastq@1.17.0: dependencies: reusify: 1.0.4 - dev: true - /fg-loadcss@3.1.0: - resolution: {integrity: sha512-UgtXKza8nBUO6UWW4c+MOprRL4W5WbIkzPJafnw6y6f5jhA3FiSZkWz8eXeAeX+mC4A/qq0ByDLiAk6erNARaQ==} - engines: {node: '>= 11.9.0'} - dev: false + fg-loadcss@3.1.0: {} - /figgy-pudding@3.5.2: - resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} - deprecated: This module is no longer supported. - dev: false - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + figures@6.1.0: dependencies: - flat-cache: 3.2.0 - dev: true + is-unicode-supported: 2.0.0 - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - requiresBuild: true - dev: false - optional: true + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - dev: true - /fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} + fill-range@4.0.0: dependencies: extend-shallow: 2.0.1 is-number: 3.0.0 repeat-string: 1.6.1 to-regex-range: 2.1.1 - dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - dev: true - - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} + finalhandler@1.1.2: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -10013,11 +15011,8 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@1.2.0: dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -10028,311 +15023,167 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true - /find-babel-config@2.1.1: - resolution: {integrity: sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==} + find-babel-config@2.1.1: dependencies: json5: 2.2.3 path-exists: 4.0.0 - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} + find-cache-dir@2.1.0: dependencies: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - /find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} + find-cache-dir@4.0.0: dependencies: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 - dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-root@1.1.0: {} - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + find-up@2.1.0: dependencies: locate-path: 2.0.0 - dev: true - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@6.3.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: true - /finity@0.5.4: - resolution: {integrity: sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA==} - dev: true + finity@0.5.4: {} - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true + keyv: 4.5.4 + rimraf: 3.0.2 - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true + flat@5.0.2: {} - /flow-parser@0.227.0: - resolution: {integrity: sha512-nOygtGKcX/siZK/lFzpfdHEfOkfGcTW7rNroR1Zsz6T/JxSahPALXVt5qVHq/fgvMJuv096BTKbgxN3PzVBaDA==} - engines: {node: '>=0.4.0'} - dev: false + flatted@3.2.9: {} - /flush-write-stream@1.1.1: - resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false + flow-parser@0.227.0: {} - /follow-redirects@1.15.5(debug@4.3.4): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: + follow-redirects@1.15.5(debug@4.3.4): + optionalDependencies: debug: 4.3.4(supports-color@8.1.1) - dev: true - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: false + for-in@1.0.2: {} - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} + foreground-child@2.0.0: dependencies: cross-spawn: 7.0.3 signal-exit: 3.0.7 - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} + form-data@2.5.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /format-util@1.0.5: - resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} - dev: true + format-util@1.0.5: {} - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true + forwarded@0.2.0: {} - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fraction.js@4.3.7: {} - /fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} + fragment-cache@0.2.1: dependencies: map-cache: 0.2.2 - dev: false - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false + fresh@0.5.2: {} - /fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - dev: true + fromentries@1.3.2: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-constants@1.0.0: {} - /fs-exists-sync@0.1.0: - resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} - engines: {node: '>=0.10.0'} - dev: true + fs-exists-sync@0.1.0: {} - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - dev: true - /fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs-minipass@3.0.3: dependencies: minipass: 7.0.4 - dev: true - - /fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - dev: true - - /fs-write-stream-atomic@1.0.10: - resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} - dependencies: - graceful-fs: 4.2.11 - iferr: 0.1.5 - imurmurhash: 0.1.4 - readable-stream: 2.3.8 - dev: false - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs-readdir-recursive@1.1.0: {} - /fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 - requiresBuild: true - dependencies: - bindings: 1.5.0 - nan: 2.18.0 - dev: false - optional: true + fs.realpath@1.0.0: {} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.2: optional: true - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} + fstream@1.0.12: dependencies: graceful-fs: 4.2.11 inherits: 2.0.4 mkdirp: 0.5.6 rimraf: 2.7.1 - dev: false - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + gauge@4.0.4: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -10342,47 +15193,32 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: true - /gaxios@6.1.1: - resolution: {integrity: sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==} - engines: {node: '>=14'} + gaxios@6.1.1(encoding@0.1.13): dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 is-stream: 2.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - dev: true - /gcp-metadata@6.1.0: - resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} - engines: {node: '>=14'} + gcp-metadata@6.1.0(encoding@0.1.13): dependencies: - gaxios: 6.1.1 + gaxios: 6.1.1(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding - supports-color - dev: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -10390,136 +15226,78 @@ packages: has-symbols: 1.0.3 hasown: 2.0.2 - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true + get-pkg-repo@4.2.1: dependencies: '@hutson/parse-repository-url': 3.0.2 hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 - dev: true - - /get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - dev: true - /get-stdin@6.0.0: - resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} - engines: {node: '>=4'} - dev: true + get-port@5.1.1: {} - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true + get-stdin@6.0.0: {} - /get-stream@6.0.0: - resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.0: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - dev: false + get-value@2.0.6: {} - /git-config-path@1.0.1: - resolution: {integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==} - engines: {node: '>=0.10.0'} + git-config-path@1.0.1: dependencies: extend-shallow: 2.0.1 fs-exists-sync: 0.1.0 homedir-polyfill: 1.0.3 - dev: true - /git-raw-commits@3.0.0: - resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} - engines: {node: '>=14'} - hasBin: true + git-raw-commits@3.0.0: dependencies: dargs: 7.0.0 meow: 8.1.2 split2: 3.2.2 - dev: true - /git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} + git-remote-origin-url@2.0.0: dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 - dev: true - /git-semver-tags@5.0.1: - resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} - engines: {node: '>=14'} - hasBin: true + git-semver-tags@5.0.1: dependencies: meow: 8.1.2 - semver: 7.6.0 - dev: true + semver: 7.6.2 - /git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@7.0.0: dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 - dev: true - /git-url-parse@13.1.0: - resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} + git-url-parse@13.1.0: dependencies: git-up: 7.0.0 - dev: true - /gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + gitconfiglocal@1.0.0: dependencies: ini: 1.3.8 - dev: true - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true + github-from-package@0.0.0: {} - /glob-gitignore@1.0.14: - resolution: {integrity: sha512-YuAEPqL58bOQDqDF2kMv009rIjSAtPs+WPzyGbwRWK+wD0UWQVRoP34Pz6yJ6ivco65C9tZnaIt0I3JCuQ8NZQ==} - engines: {node: '>= 6'} + glob-gitignore@1.0.14: dependencies: glob: 7.2.3 ignore: 5.3.1 @@ -10527,37 +15305,18 @@ packages: lodash.union: 4.6.0 make-array: 1.0.5 util.inherits: 1.0.3 - dev: true - - /glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - requiresBuild: true - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - dev: false - optional: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob-to-regexp@0.4.1: {} - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 @@ -10565,18 +15324,15 @@ packages: minipass: 7.0.4 path-scurry: 1.10.1 - /glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + glob@5.0.15: dependencies: inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -10585,47 +15341,32 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true - /glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} + glob@9.3.5: dependencies: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 path-scurry: 1.10.1 - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -10633,22 +15374,16 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@13.2.2: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 ignore: 5.3.1 merge2: 1.4.1 slash: 4.0.0 - dev: true - /globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} - engines: {node: '>=18'} + globby@14.0.1: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 @@ -10656,11 +15391,8 @@ packages: path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 - dev: true - /gm@1.25.0: - resolution: {integrity: sha512-4kKdWXTtgQ4biIo7hZA396HT062nDVVHPjQcurNZ3o/voYN+o5FUC5kOwuORbpExp3XbTJ3SU7iRipiIhQtovw==} - engines: {node: '>=14'} + gm@1.25.0: dependencies: array-parallel: 0.1.3 array-series: 0.1.5 @@ -10668,88 +15400,52 @@ packages: debug: 3.2.7 transitivePeerDependencies: - supports-color - dev: true - /google-auth-library@9.9.0: - resolution: {integrity: sha512-9l+zO07h1tDJdIHN74SpnWIlNR+OuOemXlWJlLP9pXy6vFtizgpEzMuwJa4lqY9UAdiAv5DVd5ql0Am916I+aA==} - engines: {node: '>=14'} + google-auth-library@9.10.0(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.1.1 - gcp-metadata: 6.1.0 - gtoken: 7.0.1 + gaxios: 6.1.1(encoding@0.1.13) + gcp-metadata: 6.1.0(encoding@0.1.13) + gtoken: 7.0.1(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - dev: true - /googleapis-common@7.0.1: - resolution: {integrity: sha512-mgt5zsd7zj5t5QXvDanjWguMdHAcJmmDrF9RkInCecNsyV7S7YtGqm5v2IWONNID88osb7zmx5FtrAP12JfD0w==} - engines: {node: '>=14.0.0'} + googleapis-common@7.0.1(encoding@0.1.13): dependencies: extend: 3.0.2 - gaxios: 6.1.1 - google-auth-library: 9.9.0 + gaxios: 6.1.1(encoding@0.1.13) + google-auth-library: 9.10.0(encoding@0.1.13) qs: 6.11.2 url-template: 2.0.8 uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gtoken@7.0.1: - resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} - engines: {node: '>=14.0.0'} + gtoken@7.0.1(encoding@0.1.13): dependencies: - gaxios: 6.1.1 + gaxios: 6.1.1(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - dev: true - /gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + handlebars@4.7.8: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -10757,203 +15453,109 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - dev: true + has-flag@1.0.0: {} - /has-flag@2.0.0: - resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} - engines: {node: '>=0.10.0'} - dev: true + has-flag@2.0.0: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true + has-unicode@2.0.1: {} - /has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} + has-value@0.3.1: dependencies: get-value: 2.0.6 has-values: 0.1.4 isobject: 2.1.0 - dev: false - /has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} + has-value@1.0.0: dependencies: get-value: 2.0.6 has-values: 1.0.0 isobject: 3.0.1 - dev: false - /has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - dev: false + has-values@0.1.4: {} - /has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} + has-values@1.0.0: dependencies: is-number: 3.0.0 kind-of: 4.0.0 - dev: false - - /has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - dev: true - - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - dev: false - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - dev: false + has@1.0.4: {} - /hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} + hasha@5.2.2: dependencies: is-stream: 2.0.1 type-fest: 0.8.1 - dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true + he@1.2.0: {} - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hermes-estree@0.20.1: {} + + hermes-parser@0.20.1: dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - dev: false + hermes-estree: 0.20.1 - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 18.2.0 - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + hosted-git-info@2.8.9: {} - /hosted-git-info@3.0.8: - resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} - engines: {node: '>=10'} + hosted-git-info@3.0.8: dependencies: lru-cache: 6.0.0 - dev: true - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /hosted-git-info@6.1.1: - resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hosted-git-info@6.1.1: dependencies: lru-cache: 7.18.3 - dev: true - /hosted-git-info@7.0.1: - resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} - engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@7.0.1: dependencies: lru-cache: 10.2.0 - dev: true - /html-element-map@1.3.1: - resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} + html-element-map@1.3.1: dependencies: array.prototype.filter: 1.0.3 call-bind: 1.0.7 - dev: true - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 - dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@2.0.2: {} - /html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true + html-minifier-terser@6.1.0: dependencies: camel-case: 4.1.2 clean-css: 5.3.3 @@ -10962,271 +15564,156 @@ packages: param-case: 3.0.4 relateurl: 0.2.7 terser: 5.27.0 - dev: true - /html-tokenize@2.0.1: - resolution: {integrity: sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==} - hasBin: true + html-tokenize@2.0.1: dependencies: buffer-from: 0.1.2 inherits: 2.0.4 minimist: 1.2.8 readable-stream: 1.0.34 through2: 0.4.2 - dev: false - /html-webpack-plugin@5.6.0(webpack@5.91.0): - resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} - engines: {node: '>=10.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true + html-webpack-plugin@5.6.0(webpack@5.91.0(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 + optionalDependencies: webpack: 5.91.0(webpack-cli@5.1.4) - dev: true - /htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 domhandler: 4.3.1 domutils: 2.8.0 entities: 2.2.0 - dev: true - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + htmlparser2@8.0.2: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true + http-cache-semantics@4.1.1: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 follow-redirects: 1.15.5(debug@4.3.4) requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: true - - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true - - /https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - dev: false - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} + https-proxy-agent@7.0.4: dependencies: agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@7.0.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: true - /hyperlinker@1.0.0: - resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} - engines: {node: '>=4'} - dev: true + hyperlinker@1.0.0: {} - /hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} - dev: false + hyphenate-style-name@1.0.4: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /iferr@0.1.5: - resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} - dev: false + ieee754@1.2.1: {} - /ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ignore-walk@5.0.1: dependencies: minimatch: 5.1.6 - dev: true - /ignore-walk@6.0.4: - resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@6.0.4: dependencies: minimatch: 9.0.4 - dev: true - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false + immediate@3.0.6: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - dev: true + indent-string@4.0.0: {} - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: false + indent-string@5.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: false - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /init-package-json@5.0.0: - resolution: {integrity: sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + init-package-json@5.0.0: dependencies: npm-package-arg: 10.1.0 promzard: 1.0.0 read: 2.1.0 read-package-json: 6.0.4 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 validate-npm-package-name: 5.0.0 - dev: true - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} + inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -11243,528 +15730,279 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 - dev: true - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.4 - dev: true + side-channel: 1.0.6 - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false + internmap@2.0.3: {} - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: true + interpret@1.4.0: {} - /interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} + interpret@3.1.1: {} - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: true + ip@2.0.0: {} - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true + ipaddr.js@1.9.1: {} - /is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} + is-accessor-descriptor@1.0.1: dependencies: hasown: 2.0.2 - dev: false - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: true + is-alphabetical@1.0.4: {} - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + is-alphanumerical@1.0.4: dependencies: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - dev: true - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + is-arguments@1.1.1: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: true + is-arrayish@0.3.2: {} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - - /is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dependencies: - binary-extensions: 1.13.1 - dev: false - optional: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - requiresBuild: true + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: true + is-buffer@1.1.6: {} - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true + is-buffer@2.0.5: {} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true + is-ci@3.0.1: dependencies: ci-info: 3.9.0 - dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.2 - /is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} + is-data-descriptor@1.0.1: dependencies: hasown: 2.0.2 - dev: false - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: true + is-decimal@1.0.4: {} - /is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} + is-descriptor@0.1.7: dependencies: is-accessor-descriptor: 1.0.1 is-data-descriptor: 1.0.1 - dev: false - /is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} + is-descriptor@1.0.3: dependencies: is-accessor-descriptor: 1.0.1 is-data-descriptor: 1.0.1 - dev: false - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-electron@2.2.2: - resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} - dev: true + is-electron@2.2.2: {} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + is-extendable@0.1.1: {} - /is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} + is-extendable@1.0.1: dependencies: is-plain-object: 2.0.4 - dev: false - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - dev: true - - /is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dependencies: - is-extglob: 2.1.1 - dev: false - optional: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: true - - /is-in-browser@1.1.3: - resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} + is-hexadecimal@1.0.4: {} - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true + is-in-browser@1.1.3: {} - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: true + is-interactive@1.0.0: {} - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true + is-lambda@1.0.1: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-map@2.0.2: {} - /is-node-process@1.2.0: - resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - dev: true + is-negative-zero@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} + is-number@3.0.0: dependencies: kind-of: 3.2.2 - dev: false - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: true + is-plain-obj@2.1.0: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: {} - /is-port-reachable@4.0.0: - resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-port-reachable@4.0.0: {} - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + is-potential-custom-element-name@1.0.1: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true + is-set@2.0.2: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + is-ssh@1.4.0: dependencies: protocols: 2.0.1 - dev: true - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true + is-stream@1.1.0: {} - /is-stream@2.0.0: - resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.0: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@4.0.1: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-subset@0.1.1: - resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} - dev: true + is-subset@0.1.1: {} - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + is-typedarray@1.0.0: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true + is-unicode-supported@0.1.0: {} - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true + is-unicode-supported@2.0.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakmap@2.0.1: {} + + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: false + is-windows@1.0.2: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false + isarray@0.0.1: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - dev: true + isbinaryfile@4.0.10: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - dev: true + isexe@3.1.1: {} - /isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} + isobject@2.1.0: dependencies: isarray: 1.0.0 - dev: false - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + isobject@3.0.1: {} - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} + istanbul-lib-hook@3.0.0: dependencies: append-transform: 2.0.0 - dev: true - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} + istanbul-lib-instrument@4.0.3: dependencies: - '@babel/core': 7.24.5 + '@babel/core': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} + istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 cross-spawn: 7.0.3 @@ -11772,41 +16010,27 @@ packages: p-map: 3.0.0 rimraf: 3.0.2 uuid: 8.3.2 - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.4(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} + istanbul-reports@3.1.6: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - /istanbul@0.4.5: - resolution: {integrity: sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==} - deprecated: |- - This module is no longer maintained, try this instead: - npm i nyc - Visit https://istanbul.js.org/integrations for other alternatives. - hasBin: true + istanbul@0.4.5: dependencies: abbrev: 1.0.9 async: 1.5.2 @@ -11822,129 +16046,88 @@ packages: supports-color: 3.2.3 which: 1.3.1 wordwrap: 1.0.0 - dev: true - /iterate-iterator@1.0.2: - resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} - dev: true + iterate-iterator@1.0.2: {} - /iterate-value@1.0.2: - resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} + iterate-value@1.0.2: dependencies: es-get-iterator: 1.1.3 iterate-iterator: 1.0.2 - dev: true - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 - dev: true + set-function-name: 2.0.2 - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - /jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} - hasBin: true + jake@10.8.7: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: true - /jalaali-js@1.2.6: - resolution: {integrity: sha512-io974va+Qyu+UfuVX3UIAgJlxLhAMx9Y8VMfh+IG00Js7hXQo1qNQuwSiSa0xxco0SVgx5HWNkaiCcV+aZ8WPw==} + jalaali-js@1.2.6: {} - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - dev: true - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + jest-get-type@29.6.3: {} - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 18.19.33 merge-stream: 2.0.0 supports-color: 8.1.1 - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jscodeshift-add-imports@1.0.10(jscodeshift@0.13.1): - resolution: {integrity: sha512-VUe9DJ3zkWIR62zSRQnmsOVeyt77yD8knvYNna/PzRZlF9j799hJw5sqTZu4EX16XLIqS3FxWz3nXuGuiw9iyQ==} - peerDependencies: - jscodeshift: ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 + jscodeshift-add-imports@1.0.10(jscodeshift@0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6))): dependencies: - '@babel/traverse': 7.24.5 - jscodeshift: 0.13.1(@babel/preset-env@7.24.5) - jscodeshift-find-imports: 2.0.4(jscodeshift@0.13.1) + '@babel/traverse': 7.24.6 + jscodeshift: 0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6)) + jscodeshift-find-imports: 2.0.4(jscodeshift@0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6))) transitivePeerDependencies: - supports-color - dev: false - /jscodeshift-find-imports@2.0.4(jscodeshift@0.13.1): - resolution: {integrity: sha512-HxOzjWDOFFSCf8EKSTQGqCxXeRFqZszOywnZ0HuMB9YPDFHVpxftGRsY+QS+Qq8o2qUojlmNU3JEHts5DWYS1A==} - peerDependencies: - jscodeshift: ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 + jscodeshift-find-imports@2.0.4(jscodeshift@0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6))): dependencies: - jscodeshift: 0.13.1(@babel/preset-env@7.24.5) - dev: false + jscodeshift: 0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6)) - /jscodeshift@0.13.1(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 + jscodeshift@0.13.1(@babel/preset-env@7.24.6(@babel/core@7.24.6)): dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/preset-flow': 7.23.3(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/register': 7.23.7(@babel/core@7.24.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.6) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.6) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.6) + '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) + '@babel/preset-env': 7.24.6(@babel/core@7.24.6) + '@babel/preset-flow': 7.23.3(@babel/core@7.24.6) + '@babel/preset-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/register': 7.24.6(@babel/core@7.24.6) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.6) chalk: 4.1.2 flow-parser: 0.227.0 graceful-fs: 4.2.11 @@ -11956,140 +16139,86 @@ packages: write-file-atomic: 2.4.3 transitivePeerDependencies: - supports-color - dev: false - /jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} - dev: true + jsdoc-type-pratt-parser@4.0.0: {} - /jsdom@23.1.0: - resolution: {integrity: sha512-wRscu8dBFxi7O65Cvi0jFRDv0Qa7XEHPix8Qg/vlXHLAMQsRWV1EDeQHBermzXf4Dt7JtFgBLbva3iTcBZDXEQ==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + jsdom@24.1.0: dependencies: cssstyle: 4.0.1 data-urls: 5.0.0 decimal.js: 10.4.3 form-data: 4.0.0 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 + nwsapi: 2.2.10 parse5: 7.1.2 - rrweb-cssom: 0.6.0 + rrweb-cssom: 0.7.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.3 + tough-cookie: 4.1.4 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.0.0 - ws: 8.16.0 + ws: 8.17.0 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - dev: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + json-bigint@1.0.0: dependencies: bignumber.js: 9.1.2 - dev: true - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-parse-even-better-errors@3.0.1: - resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + json-parse-even-better-errors@3.0.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + json-stringify-safe@5.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + jsonc-parser@3.2.0: {} - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true + jsonc-parser@3.2.1: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - dev: true + jsonpointer@5.0.1: {} - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -12100,191 +16229,131 @@ packages: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.0 - dev: true + semver: 7.6.2 - /jss-plugin-camel-case@10.10.0: - resolution: {integrity: sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==} + jss-plugin-camel-case@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 hyphenate-style-name: 1.0.4 jss: 10.10.0 - dev: false - /jss-plugin-default-unit@10.10.0: - resolution: {integrity: sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==} + jss-plugin-default-unit@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 jss: 10.10.0 - dev: false - /jss-plugin-global@10.10.0: - resolution: {integrity: sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==} + jss-plugin-global@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 jss: 10.10.0 - dev: false - /jss-plugin-nested@10.10.0: - resolution: {integrity: sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==} + jss-plugin-nested@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 jss: 10.10.0 tiny-warning: 1.0.3 - dev: false - /jss-plugin-props-sort@10.10.0: - resolution: {integrity: sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==} + jss-plugin-props-sort@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 jss: 10.10.0 - dev: false - /jss-plugin-rule-value-function@10.10.0: - resolution: {integrity: sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==} + jss-plugin-rule-value-function@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 jss: 10.10.0 tiny-warning: 1.0.3 - dev: false - /jss-plugin-template@10.10.0: - resolution: {integrity: sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w==} + jss-plugin-template@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 jss: 10.10.0 tiny-warning: 1.0.3 - dev: true - /jss-plugin-vendor-prefixer@10.10.0: - resolution: {integrity: sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==} + jss-plugin-vendor-prefixer@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 css-vendor: 2.0.8 jss: 10.10.0 - dev: false - /jss-rtl@0.3.0(jss@10.10.0): - resolution: {integrity: sha512-rg9jJmP1bAyhNOAp+BDZgOP/lMm4+oQ76qGueupDQ68Wq+G+6SGvCZvhIEg8OHSONRWOwFT6skCI+APGi8DgmA==} - peerDependencies: - jss: ^10.0.0 + jss-rtl@0.3.0(jss@10.10.0): dependencies: jss: 10.10.0 rtl-css-js: 1.16.1 - dev: true - /jss@10.10.0: - resolution: {integrity: sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==} + jss@10.10.0: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 csstype: 3.1.3 is-in-browser: 1.1.3 tiny-warning: 1.0.3 - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 - object.values: 1.1.7 - dev: true + object.values: 1.2.0 - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + jszip@3.10.1: dependencies: lie: 3.3.0 pako: 1.0.11 readable-stream: 2.3.8 setimmediate: 1.0.5 - dev: false - /junk@4.0.1: - resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} - engines: {node: '>=12.20'} - dev: true + junk@4.0.1: {} - /just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} - dev: true + just-extend@6.2.0: {} - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - dev: true - /jwa@2.0.0: - resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} + jwa@2.0.0: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - dev: true - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@3.2.2: dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 - dev: true - /jws@4.0.0: - resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + jws@4.0.0: dependencies: jwa: 2.0.0 safe-buffer: 5.2.1 - dev: true - /karma-chrome-launcher@3.2.0: - resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} + karma-chrome-launcher@3.2.0: dependencies: which: 1.3.1 - dev: true - /karma-mocha@2.0.1(patch_hash=r6idlcdpax26bbzwxyjicxb5ra): - resolution: {integrity: sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==} + karma-mocha@2.0.1(patch_hash=r6idlcdpax26bbzwxyjicxb5ra): dependencies: minimist: 1.2.8 - dev: true - patched: true - /karma-parallel@0.3.1(karma@6.4.3): - resolution: {integrity: sha512-64jxNYamYi/9Y67h4+FfViSYhwDgod3rLuq+ZdZ0c3XeZFp/3q3v3HVkd8b5Czp3hCB+LLF8DIv4zlR4xFqbRw==} - engines: {node: '>=6'} - peerDependencies: - karma: '>= 1.0.0' + karma-parallel@0.3.1(karma@6.4.3): dependencies: istanbul: 0.4.5 karma: 6.4.3 lodash: 4.17.21 - dev: true - /karma-sourcemap-loader@0.4.0: - resolution: {integrity: sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA==} + karma-sourcemap-loader@0.4.0: dependencies: graceful-fs: 4.2.11 - dev: true - /karma-webpack@5.0.1(webpack@5.91.0): - resolution: {integrity: sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ==} - engines: {node: '>= 18'} - peerDependencies: - webpack: ^5.0.0 + karma-webpack@5.0.1(webpack@5.91.0(webpack-cli@5.1.4)): dependencies: glob: 7.2.3 minimatch: 9.0.4 webpack: 5.91.0(webpack-cli@5.1.4) webpack-merge: 4.2.2 - dev: true - /karma@6.4.3: - resolution: {integrity: sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==} - engines: {node: '>= 10'} - hasBin: true + karma@6.4.3: dependencies: '@colors/colors': 1.5.0 body-parser: 1.20.2 @@ -12315,60 +16384,38 @@ packages: - debug - supports-color - utf-8-validate - dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 - dev: false - /kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} + kind-of@4.0.0: dependencies: is-buffer: 1.1.6 - dev: false - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true + language-subtag-registry@0.3.22: {} - /language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.22 - dev: true - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: false - /lerna@8.1.2: - resolution: {integrity: sha512-RCyBAn3XsqqvHbz3TxLfD7ylqzCi1A2UJnFEZmhURgx589vM3qYWQa/uOMeEEf565q6cAdtmulITciX1wgkAtw==} - engines: {node: '>=18.0.0'} - hasBin: true + lerna@8.1.3(encoding@0.1.13): dependencies: - '@lerna/create': 8.1.2(typescript@5.4.5) + '@lerna/create': 8.1.3(encoding@0.1.13)(typescript@5.4.5) '@npmcli/run-script': 7.0.2 '@nx/devkit': 17.3.0(nx@17.3.0) '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 19.0.11 + '@octokit/rest': 19.0.11(encoding@0.1.13) byte-size: 8.1.1 chalk: 4.1.0 clone-deep: 4.0.1 @@ -12404,7 +16451,7 @@ packages: make-dir: 4.0.0 minimatch: 3.0.5 multimatch: 5.0.0 - node-fetch: 2.6.7 + node-fetch: 2.6.7(encoding@0.1.13) npm-package-arg: 8.1.1 npm-packlist: 5.1.1 npm-registry-fetch: 14.0.5 @@ -12422,12 +16469,12 @@ packages: read-package-json: 6.0.4 resolve-from: 5.0.0 rimraf: 4.4.1 - semver: 7.6.0 + semver: 7.6.2 signal-exit: 3.0.7 slash: 3.0.0 ssri: 9.0.1 strong-log-transformer: 2.1.0 - tar: 6.1.11 + tar: 6.2.1 temp-dir: 1.0.0 typescript: 5.4.5 upath: 2.0.1 @@ -12445,310 +16492,175 @@ packages: - debug - encoding - supports-color - dev: true - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + levn@0.3.0: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 - dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - - /li@1.3.0: - resolution: {integrity: sha512-z34TU6GlMram52Tss5mt1m//ifRIpKH5Dqm7yUVOdHI+BQCs9qGPHFaCUTIzsWX7edN30aa2WrPwR7IO10FHaw==} - dev: true - /libnpmaccess@7.0.2: - resolution: {integrity: sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + libnpmaccess@7.0.2: dependencies: npm-package-arg: 10.1.0 npm-registry-fetch: 14.0.5 transitivePeerDependencies: - supports-color - dev: true - /libnpmpublish@7.3.0: - resolution: {integrity: sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + libnpmpublish@7.3.0: dependencies: ci-info: 3.9.0 normalize-package-data: 5.0.0 npm-package-arg: 10.1.0 npm-registry-fetch: 14.0.5 proc-log: 3.0.0 - semver: 7.6.0 + semver: 7.6.2 sigstore: 1.9.0 ssri: 10.0.5 transitivePeerDependencies: - supports-color - dev: true - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lie@3.3.0: dependencies: immediate: 3.0.6 - dev: false - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + lines-and-columns@2.0.4: {} - /linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 - dev: true - /listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - dev: false + listenercount@1.0.1: {} - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} + load-json-file@6.2.0: dependencies: graceful-fs: 4.2.11 parse-json: 5.2.0 strip-bom: 4.0.0 type-fest: 0.6.0 - dev: true - - /loader-runner@2.4.0: - resolution: {integrity: sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - dev: false - - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - /loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 - dev: false + loader-runner@4.3.0: {} - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + loader-utils@2.0.4: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: true + lodash.clonedeep@4.5.0: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.debounce@4.0.8: {} - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false + lodash.defaults@4.2.0: {} - /lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + lodash.difference@4.5.0: {} - /lodash.escape@4.0.1: - resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==} - dev: true + lodash.escape@4.0.1: {} - /lodash.escaperegexp@4.1.2: - resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - dev: false + lodash.escaperegexp@4.1.2: {} - /lodash.find@4.6.0: - resolution: {integrity: sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==} - dev: true + lodash.find@4.6.0: {} - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: false + lodash.flatten@4.4.0: {} - /lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - dev: true + lodash.flattendeep@4.4.0: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true + lodash.get@4.4.2: {} - /lodash.groupby@4.6.0: - resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} - dev: false + lodash.groupby@4.6.0: {} - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: true + lodash.includes@4.3.0: {} - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + lodash.isboolean@3.0.3: {} - /lodash.isempty@4.4.0: - resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} - dev: true + lodash.isempty@4.4.0: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash.isequal@4.5.0: {} - /lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + lodash.isfunction@3.0.9: {} - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: true + lodash.isinteger@4.0.4: {} - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true + lodash.ismatch@4.4.0: {} - /lodash.isnil@4.0.0: - resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} - dev: false + lodash.isnil@4.0.0: {} - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: true + lodash.isnumber@3.0.3: {} - /lodash.isobject@3.0.2: - resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==} - dev: true + lodash.isobject@3.0.2: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.isplainobject@4.0.6: {} - /lodash.isregexp@4.0.1: - resolution: {integrity: sha512-rw9+95tYcUa9nQ1FgdtKvO+hReLGNqnNMHfLq8SwK5Mo6D0R0tIsnRHGHaTHSKeYBaLCJ1JvXWdz4UmpPZ2bag==} - dev: true + lodash.isregexp@4.0.1: {} - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: true + lodash.isstring@4.0.1: {} - /lodash.isundefined@3.0.1: - resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} - dev: false + lodash.isundefined@3.0.1: {} - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true + lodash.kebabcase@4.1.1: {} - /lodash.keys@4.2.0: - resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} - dev: true + lodash.keys@4.2.0: {} - /lodash.mapvalues@4.6.0: - resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} - dev: true + lodash.mapvalues@4.6.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: true + lodash.once@4.1.1: {} - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true + lodash.snakecase@4.1.1: {} - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + lodash.union@4.6.0: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: false + lodash.uniq@4.5.0: {} - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true + lodash.upperfirst@4.3.1: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: true - /log4js@6.9.1: - resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} - engines: {node: '>=8.0'} + log4js@6.9.1: dependencies: date-format: 4.0.14 debug: 4.3.4(supports-color@8.1.1) @@ -12757,96 +16669,58 @@ packages: streamroller: 3.1.5 transitivePeerDependencies: - supports-color - dev: true - /longest-streak@2.0.4: - resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} - dev: true + longest-streak@2.0.4: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: true - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + lru-cache@10.2.0: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + lru-cache@7.18.3: {} - /luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} - engines: {node: '>=12'} + luxon@3.4.4: {} - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true + lz-string@1.5.0: {} - /make-array@1.0.5: - resolution: {integrity: sha512-sgK2SAzxT19rWU+qxKUcn6PAh/swiIiz2F8C2cZjLc1z4iwYIfdoihqFIDQ8BDzAGtWPYJ6Sr13K1j/DXynDLA==} - engines: {node: '>=0.10.0'} - dev: true + make-array@1.0.5: {} - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.2 - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: - semver: 7.6.0 + semver: 7.6.2 - /make-fetch-happen@11.1.1: - resolution: {integrity: sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + make-fetch-happen@11.1.1: dependencies: agentkeepalive: 4.5.0 cacache: 17.1.4 @@ -12865,11 +16739,8 @@ packages: ssri: 10.0.5 transitivePeerDependencies: - supports-color - dev: true - /make-fetch-happen@13.0.0: - resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} - engines: {node: ^16.14.0 || >=18.0.0} + make-fetch-happen@13.0.0: dependencies: '@npmcli/agent': 2.2.0 cacache: 18.0.2 @@ -12884,33 +16755,18 @@ packages: ssri: 10.0.5 transitivePeerDependencies: - supports-color - dev: true - /map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - dev: false + map-cache@0.2.2: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} + map-visit@1.0.0: dependencies: object-visit: 1.0.1 - dev: false - /markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true + markdown-it@14.1.0: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -12918,29 +16774,16 @@ packages: mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 - dev: true - /markdown-to-jsx@7.4.7(react@18.2.0): - resolution: {integrity: sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==} - engines: {node: '>= 10'} - peerDependencies: - react: '>= 0.14.0' + markdown-to-jsx@7.4.7(react@18.2.0): dependencies: react: 18.2.0 - dev: false - /markdownlint-cli2-formatter-default@0.0.4(markdownlint-cli2@0.13.0): - resolution: {integrity: sha512-xm2rM0E+sWgjpPn1EesPXx5hIyrN2ddUnUwnbCsD/ONxYtw3PX6LydvdH6dciWAoFDpwzbHM1TO7uHfcMd6IYg==} - peerDependencies: - markdownlint-cli2: '>=0.0.4' + markdownlint-cli2-formatter-default@0.0.4(markdownlint-cli2@0.13.0): dependencies: markdownlint-cli2: 0.13.0 - dev: true - /markdownlint-cli2@0.13.0: - resolution: {integrity: sha512-Pg4nF7HlopU97ZXtrcVISWp3bdsuc5M0zXyLp2/sJv2zEMlInrau0ZKK482fQURzVezJzWBpNmu4u6vGAhij+g==} - engines: {node: '>=18'} - hasBin: true + markdownlint-cli2@0.13.0: dependencies: globby: 14.0.1 js-yaml: 4.1.0 @@ -12948,36 +16791,17 @@ packages: markdownlint: 0.34.0 markdownlint-cli2-formatter-default: 0.0.4(markdownlint-cli2@0.13.0) micromatch: 4.0.5 - dev: true - /markdownlint-micromark@0.1.9: - resolution: {integrity: sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==} - engines: {node: '>=18'} - dev: true + markdownlint-micromark@0.1.9: {} - /markdownlint@0.34.0: - resolution: {integrity: sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==} - engines: {node: '>=18'} + markdownlint@0.34.0: dependencies: markdown-it: 14.1.0 markdownlint-micromark: 0.1.9 - dev: true - - /marked@5.1.2: - resolution: {integrity: sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==} - engines: {node: '>= 16'} - hasBin: true - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false + marked@5.1.2: {} - /mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + mdast-util-from-markdown@0.8.5: dependencies: '@types/mdast': 3.0.15 mdast-util-to-string: 2.0.0 @@ -12986,10 +16810,8 @@ packages: unist-util-stringify-position: 2.0.3 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-to-markdown@0.6.5: - resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + mdast-util-to-markdown@0.6.5: dependencies: '@types/unist': 2.0.10 longest-streak: 2.0.4 @@ -12997,56 +16819,24 @@ packages: parse-entities: 2.0.0 repeat-string: 1.6.1 zwitch: 1.0.5 - dev: true - /mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} - dev: true + mdast-util-to-string@2.0.0: {} - /mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - dev: true + mdurl@2.0.0: {} - /media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true + media-typer@0.3.0: {} - /memfs-or-file-map-to-github-branch@1.2.1: - resolution: {integrity: sha512-I/hQzJ2a/pCGR8fkSQ9l5Yx+FQ4e7X6blNHyWBm2ojeFLT3GVzGkTj7xnyWpdclrr7Nq4dmx3xrvu70m3ypzAQ==} + memfs-or-file-map-to-github-branch@1.2.1(encoding@0.1.13): dependencies: - '@octokit/rest': 18.12.0 + '@octokit/rest': 18.12.0(encoding@0.1.13) transitivePeerDependencies: - encoding - dev: true - - /memory-fs@0.2.0: - resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} - dev: true - - /memory-fs@0.4.1: - resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} - dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - dev: false - /memory-fs@0.5.0: - resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - dev: false + memory-fs@0.2.0: {} - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true + meow@12.1.1: {} - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -13059,37 +16849,23 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true - /merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true + merge-descriptors@1.0.1: {} - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + methods@1.1.2: {} - /micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + micromark@2.11.4: dependencies: debug: 4.3.4(supports-color@8.1.1) parse-entities: 2.0.0 transitivePeerDependencies: - supports-color - dev: true - /micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} + micromatch@3.1.10: dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -13106,276 +16882,132 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true - - /miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - dev: false - /mime-db@1.33.0: - resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.33.0: {} - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-types@2.1.18: - resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} - engines: {node: '>= 0.6'} + mime-types@2.1.18: dependencies: mime-db: 1.33.0 - dev: true - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true + mime@1.6.0: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true + mime@2.6.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + mimic-fn@2.1.0: {} - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: false + mimic-response@3.1.0: {} - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - dev: false + min-indent@1.0.1: {} - /minimatch@3.0.5: - resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + minimatch@3.0.5: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} + minimatch@5.0.1: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - /minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@8.0.4: dependencies: brace-expansion: 2.0.1 - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} + minipass-collect@1.0.2: dependencies: minipass: 3.3.6 - dev: true - /minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} + minipass-collect@2.0.1: dependencies: minipass: 7.0.4 - dev: true - /minipass-fetch@3.0.4: - resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@3.0.4: dependencies: minipass: 7.0.4 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: true - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 - dev: true - /minipass-json-stream@1.0.1: - resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + minipass-json-stream@1.0.1: dependencies: jsonparse: 1.3.1 minipass: 3.3.6 - dev: true - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 - dev: true - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + minipass-sized@1.0.3: dependencies: minipass: 3.3.6 - dev: true - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - dev: true - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} + minipass@4.2.8: {} - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true + minipass@5.0.0: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} + minipass@7.0.4: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true - - /mississippi@3.0.0: - resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} - engines: {node: '>=4.0.0'} - dependencies: - concat-stream: 1.6.2 - duplexify: 3.7.1 - end-of-stream: 1.4.4 - flush-write-stream: 1.1.1 - from2: 2.3.0 - parallel-transform: 1.2.0 - pump: 3.0.0 - pumpify: 1.5.1 - stream-each: 1.2.3 - through2: 2.0.5 - dev: false - /mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} + mixin-deep@1.3.2: dependencies: for-in: 1.0.2 is-extendable: 1.0.1 - dev: false - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true + mkdirp-classic@0.5.3: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@1.0.4: {} - /mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} - engines: {node: '>= 14.0.0'} - hasBin: true + mocha@10.4.0: dependencies: ansi-colors: 4.1.1 browser-stdout: 1.3.1 @@ -13397,117 +17029,64 @@ packages: yargs: 16.2.0 yargs-parser: 20.2.4 yargs-unparser: 2.0.0 - dev: true - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true + modify-values@1.0.1: {} - /moment-hijri@2.1.2: - resolution: {integrity: sha512-p5ZOA1UzBHAAXiePh37XRjjwuyH78+1ShYZ7R6jogxketewG7kTCUjUmcP9c4Qsx8D8cqxwUWrESjtgdT6tNoA==} + moment-hijri@2.1.2: dependencies: moment: 2.30.1 - /moment-jalaali@0.10.0: - resolution: {integrity: sha512-XICH1+UHd3zyaE1bXWQBlhoXBqbzEyFfT0TrifNobHxLALRuTSwXn376bX8FmkYg9mZimevwwdd6EB57s5wuFA==} + moment-jalaali@0.10.0: dependencies: jalaali-js: 1.2.6 moment: 2.30.1 moment-timezone: 0.5.45 rimraf: 3.0.2 - /moment-timezone@0.5.45: - resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + moment-timezone@0.5.45: dependencies: moment: 2.30.1 - /moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - - /moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - dev: true + moment@2.30.1: {} - /move-concurrently@1.0.1: - resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} - dependencies: - aproba: 1.2.0 - copy-concurrently: 1.0.5 - fs-write-stream-atomic: 1.0.10 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - dev: false + moo@0.5.2: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true + mri@1.2.0: {} - /mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} + mrmime@2.0.0: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} + multimatch@5.0.0: dependencies: '@types/minimatch': 3.0.5 array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 minimatch: 3.1.2 - dev: true - /multipipe@1.0.2: - resolution: {integrity: sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==} + multipipe@1.0.2: dependencies: duplexer2: 0.1.4 object-assign: 4.1.1 - dev: false - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true + mute-stream@0.0.8: {} - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + mute-stream@1.0.0: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false - - /nan@2.18.0: - resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} - requiresBuild: true - dev: false - optional: true - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + nanoid@3.3.7: {} - /nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} + nanomatch@1.2.13: dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 @@ -13522,59 +17101,27 @@ packages: to-regex: 3.0.2 transitivePeerDependencies: - supports-color - dev: false - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: true + napi-build-utils@1.0.2: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /nearley@2.20.1: - resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} - hasBin: true + nearley@2.20.1: dependencies: commander: 2.20.3 moo: 0.5.2 railroad-diagrams: 1.0.0 randexp: 0.4.6 - dev: true - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neo-async@2.6.2: {} - /nested-error-stacks@2.1.1: - resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - dev: true + nested-error-stacks@2.1.1: {} - /next@14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(@playwright/test@1.43.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true + next@14.2.3(@babel/core@7.24.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 14.2.3 - '@opentelemetry/api': 1.8.0 - '@playwright/test': 1.43.1 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001606 @@ -13582,7 +17129,7 @@ packages: postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.2.0) optionalDependencies: '@next/swc-darwin-arm64': 14.2.3 '@next/swc-darwin-x64': 14.2.3 @@ -13593,85 +17140,55 @@ packages: '@next/swc-win32-arm64-msvc': 14.2.3 '@next/swc-win32-ia32-msvc': 14.2.3 '@next/swc-win32-x64-msvc': 14.2.3 + '@opentelemetry/api': 1.8.0 + '@playwright/test': 1.44.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /nise@5.1.7: - resolution: {integrity: sha512-wWtNUhkT7k58uvWTB/Gy26eA/EJKtPZFVAhEilN5UYVmmGRYOURbejRUyKm0Uu9XVEW7K5nBOZfR8VMB4QR2RQ==} + nise@5.1.7: dependencies: '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 11.2.2 '@sinonjs/text-encoding': 0.7.2 just-extend: 6.2.0 path-to-regexp: 6.2.1 - dev: true - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: true - /node-abi@3.54.0: - resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==} - engines: {node: '>=10'} + node-abi@3.54.0: dependencies: - semver: 7.6.0 - dev: true + semver: 7.6.2 - /node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - dev: true + node-addon-api@6.1.0: {} - /node-cleanup@2.1.2: - resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==} - dev: true + node-cleanup@2.1.2: {} - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} + node-dir@0.1.17: dependencies: minimatch: 3.1.2 - dev: false - /node-environment-flags@1.0.6: - resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} + node-environment-flags@1.0.6: dependencies: object.getownpropertydescriptors: 2.1.7 semver: 5.7.2 - dev: true - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.6.7(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 - dev: true + optionalDependencies: + encoding: 0.1.13 - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 - dev: true + optionalDependencies: + encoding: 0.1.13 - /node-gyp@10.0.1: - resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true + node-gyp@10.0.1: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 @@ -13680,221 +17197,115 @@ packages: make-fetch-happen: 13.0.0 nopt: 7.2.0 proc-log: 3.0.0 - semver: 7.6.0 - tar: 6.2.0 + semver: 7.6.2 + tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - - /node-libs-browser@2.2.1: - resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==} - dependencies: - assert: 1.5.1 - browserify-zlib: 0.2.0 - buffer: 4.9.2 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - crypto-browserify: 3.12.0 - domain-browser: 1.2.0 - events: 3.3.0 - https-browserify: 1.0.0 - os-browserify: 0.3.0 - path-browserify: 0.0.1 - process: 0.11.10 - punycode: 1.4.1 - querystring-es3: 0.2.1 - readable-stream: 2.3.8 - stream-browserify: 2.0.2 - stream-http: 2.8.3 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.0 - url: 0.11.3 - util: 0.11.1 - vm-browserify: 1.1.2 - dev: false - - /node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - dev: true - /node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} + node-machine-id@1.1.12: {} + + node-preload@0.2.1: dependencies: process-on-spawn: 1.0.0 - dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.14: {} - /nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} - hasBin: true + nopt@3.0.6: dependencies: abbrev: 1.1.1 - dev: true - /nopt@7.2.0: - resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + nopt@7.2.0: dependencies: abbrev: 2.0.0 - dev: true - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@5.0.0: - resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@6.0.0: - resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} - engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@6.0.0: dependencies: hosted-git-info: 7.0.1 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dependencies: - remove-trailing-separator: 1.1.0 - dev: false - optional: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - requiresBuild: true - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true + normalize-range@0.1.2: {} - /npm-bundled@1.1.2: - resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + npm-bundled@1.1.2: dependencies: npm-normalize-package-bin: 1.0.1 - dev: true - /npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-bundled@3.0.0: dependencies: npm-normalize-package-bin: 3.0.1 - dev: true - /npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@6.3.0: dependencies: - semver: 7.6.0 - dev: true + semver: 7.6.2 - /npm-normalize-package-bin@1.0.1: - resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} - dev: true + npm-normalize-package-bin@1.0.1: {} - /npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + npm-normalize-package-bin@3.0.1: {} - /npm-package-arg@10.1.0: - resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-package-arg@10.1.0: dependencies: hosted-git-info: 6.1.1 proc-log: 3.0.0 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-name: 5.0.0 - dev: true - /npm-package-arg@11.0.1: - resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-package-arg@11.0.1: dependencies: hosted-git-info: 7.0.1 proc-log: 3.0.0 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-name: 5.0.0 - dev: true - /npm-package-arg@8.1.1: - resolution: {integrity: sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==} - engines: {node: '>=10'} + npm-package-arg@8.1.1: dependencies: hosted-git-info: 3.0.8 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-name: 3.0.0 - dev: true - /npm-packlist@5.1.1: - resolution: {integrity: sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + npm-packlist@5.1.1: dependencies: glob: 8.1.0 ignore-walk: 5.0.1 npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 - dev: true - /npm-packlist@8.0.2: - resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-packlist@8.0.2: dependencies: ignore-walk: 6.0.4 - dev: true - /npm-pick-manifest@9.0.0: - resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-pick-manifest@9.0.0: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.1 - semver: 7.6.0 - dev: true + semver: 7.6.2 - /npm-registry-fetch@14.0.5: - resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-registry-fetch@14.0.5: dependencies: make-fetch-happen: 11.1.1 minipass: 5.0.0 @@ -13905,11 +17316,8 @@ packages: proc-log: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /npm-registry-fetch@16.1.0: - resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-registry-fetch@16.1.0: dependencies: make-fetch-happen: 13.0.0 minipass: 7.0.4 @@ -13920,58 +17328,31 @@ packages: proc-log: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 - dev: true - /nprogress@0.2.0: - resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} - dev: false + nprogress@0.2.0: {} - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: true - - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true - - /nx@17.3.0: - resolution: {integrity: sha512-CoY0qUrO8xErbA/v/bbfDGs+KaD9MCO7PReqmIeyrtDNwFl6vnb+U2MpBxCsRP+YH2Oa8hI8Lu+kcnPktx2v6A==} - hasBin: true - requiresBuild: true - peerDependencies: - '@swc-node/register': ^1.6.7 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true + + nwsapi@2.2.10: {} + + nx@17.3.0: dependencies: '@nrwl/tao': 17.3.0 '@yarnpkg/lockfile': 1.1.0 @@ -14020,12 +17401,8 @@ packages: '@nx/nx-win32-x64-msvc': 17.3.0 transitivePeerDependencies: - debug - dev: true - /nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true + nyc@15.1.0: dependencies: '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 @@ -14056,175 +17433,110 @@ packages: yargs: 15.4.1 transitivePeerDependencies: - supports-color - dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + object-assign@4.1.1: {} - /object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} + object-copy@0.1.0: dependencies: copy-descriptor: 0.1.1 define-property: 0.2.5 kind-of: 3.2.2 - dev: false - /object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} + object-hash@2.2.0: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.1: {} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} + object-is@1.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: true - /object-keys@0.4.0: - resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} - dev: false + object-keys@0.4.0: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + object-keys@1.1.1: {} - /object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} + object-visit@1.0.1: dependencies: isobject: 3.0.1 - dev: false - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} - engines: {node: '>= 0.4'} + object.entries@1.1.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - dev: true + es-object-atoms: 1.0.0 - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - dev: true + es-object-atoms: 1.0.0 - /object.getownpropertydescriptors@2.1.7: - resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} - engines: {node: '>= 0.8'} + object.getownpropertydescriptors@2.1.7: dependencies: array.prototype.reduce: 1.0.6 call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 safe-array-concat: 1.1.2 - dev: true - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + object.groupby@1.0.1: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 get-intrinsic: 1.2.4 - dev: true - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 es-abstract: 1.23.3 - dev: true + es-object-atoms: 1.0.0 - /object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + object.pick@1.3.0: dependencies: isobject: 3.0.1 - dev: false - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 - dev: true + es-object-atoms: 1.0.0 - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + on-finished@2.3.0: dependencies: ee-first: 1.1.1 - dev: true - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 - dev: true - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true + on-headers@1.0.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true - /opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true + opener@1.5.2: {} - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + optionator@0.8.3: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -14232,11 +17544,8 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.5 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -14244,11 +17553,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} + ora@5.3.0: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -14258,11 +17564,8 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -14273,216 +17576,113 @@ packages: log-symbols: 4.1.0 strip-ansi: 6.0.1 wcwidth: 1.0.1 - dev: true - - /os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - dev: false - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true - - /outvariant@1.4.2: - resolution: {integrity: sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ==} - dev: true - /override-require@1.1.1: - resolution: {integrity: sha512-eoJ9YWxFcXbrn2U8FKT6RV+/Kj7fiGAB1VvHzbYKt8xM5ZuKZgCGvnHzDxmreEjcBH28ejg5MiOH4iyY1mQnkg==} - dev: true + os-tmpdir@1.0.2: {} - /p-cancelable@1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - dev: true + override-require@1.1.1: {} - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true + p-cancelable@1.1.0: {} - /p-event@5.0.1: - resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-event@5.0.1: dependencies: p-timeout: 5.1.0 - dev: true - /p-filter@3.0.0: - resolution: {integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-filter@3.0.0: dependencies: p-map: 5.5.0 - dev: true - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true + p-finally@1.0.0: {} - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + p-limit@1.3.0: dependencies: p-try: 1.0.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - dev: true - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-map-series@2.1.0: - resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} - engines: {node: '>=8'} - dev: true + p-map-series@2.1.0: {} - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + p-map@3.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-map@5.5.0: - resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} - engines: {node: '>=12'} + p-map@5.5.0: dependencies: aggregate-error: 4.0.1 - dev: true - /p-map@6.0.0: - resolution: {integrity: sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==} - engines: {node: '>=16'} - dev: true + p-map@6.0.0: {} - /p-pipe@3.1.0: - resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} - engines: {node: '>=8'} - dev: true + p-pipe@3.1.0: {} - /p-queue@2.4.2: - resolution: {integrity: sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==} - engines: {node: '>=4'} - dev: true + p-queue@2.4.2: {} - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} + p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 - dev: true - /p-reduce@2.1.0: - resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} - engines: {node: '>=8'} - dev: true + p-reduce@2.1.0: {} - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + p-retry@4.6.2: dependencies: '@types/retry': 0.12.0 retry: 0.13.1 - dev: true - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 - dev: true - /p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - dev: true + p-timeout@5.1.0: {} - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-try@2.2.0: {} - /p-waterfall@2.1.1: - resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} - engines: {node: '>=8'} + p-waterfall@2.1.1: dependencies: p-reduce: 2.1.0 - dev: true - /package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} + package-hash@4.0.0: dependencies: graceful-fs: 4.2.11 hasha: 5.2.2 lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 - dev: true - /pacote@17.0.6: - resolution: {integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true + pacote@17.0.6: dependencies: '@npmcli/git': 5.0.4 '@npmcli/installed-package-contents': 2.0.2 @@ -14501,53 +17701,25 @@ packages: read-package-json-fast: 3.0.2 sigstore: 2.2.0 ssri: 10.0.5 - tar: 6.2.0 + tar: 6.2.1 transitivePeerDependencies: - bluebird - supports-color - dev: true - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false - /parallel-transform@1.2.0: - resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} - dependencies: - cyclist: 1.0.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false + pako@1.0.11: {} - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-asn1@5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} - dependencies: - asn1.js: 5.4.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - pbkdf2: 3.1.2 - safe-buffer: 5.2.1 - dev: false - - /parse-diff@0.7.1: - resolution: {integrity: sha512-1j3l8IKcy4yRK2W4o9EYvJLSzpAVwz4DXqCewYyx2vEwk2gcf3DBPqc8Fj4XV3K33OYJ08A8fWwyu/ykD/HUSg==} - dev: true + parse-diff@0.7.1: {} - /parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@2.0.0: dependencies: character-entities: 1.2.4 character-entities-legacy: 1.1.4 @@ -14555,308 +17727,165 @@ packages: is-alphanumerical: 1.0.4 is-decimal: 1.0.4 is-hexadecimal: 1.0.4 - dev: true - /parse-git-config@2.0.3: - resolution: {integrity: sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A==} - engines: {node: '>=6'} + parse-git-config@2.0.3: dependencies: expand-tilde: 2.0.2 git-config-path: 1.0.1 ini: 1.3.8 - dev: true - /parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: true + parse-github-url@1.0.2: {} - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-link-header@2.0.0: - resolution: {integrity: sha512-xjU87V0VyHZybn2RrCX5TIFGxTVZE6zqqZWMPlIKiSKuWh/X5WZdt+w1Ki1nXB+8L/KtL+nZ4iq+sfI6MrhhMw==} + parse-link-header@2.0.0: dependencies: xtend: 4.0.2 - dev: true - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true + parse-ms@4.0.0: {} - /parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + parse-passwd@1.0.0: {} + + parse-path@7.0.0: dependencies: protocols: 2.0.1 - dev: true - /parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-url@8.1.0: dependencies: parse-path: 7.0.0 - dev: true - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse5-htmlparser2-tree-adapter@7.0.0: dependencies: domhandler: 5.0.3 parse5: 7.1.2 - dev: true - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: true - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true + parseurl@1.3.3: {} - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: true - /pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - dev: false - - /path-browserify@0.0.1: - resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} - dev: false - - /path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - requiresBuild: true - dev: false - optional: true + pascalcase@0.1.1: {} - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: true + path-is-inside@1.0.2: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - /path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true + path-to-regexp@0.1.7: {} - /path-to-regexp@2.2.1: - resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==} - dev: true + path-to-regexp@2.2.1: {} - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true + path-to-regexp@6.2.1: {} - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - /path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - dev: true + path-type@4.0.0: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + path-type@5.0.0: {} - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - dev: false + pathval@1.1.1: {} - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: true + performance-now@2.1.0: {} - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /picomatch@3.0.1: - resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} - engines: {node: '>=10'} - dev: true + picomatch@3.0.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true + pify@2.3.0: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pify@3.0.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + pify@4.0.1: {} - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - dev: true + pify@5.0.0: {} - /pinpoint@1.1.0: - resolution: {integrity: sha512-+04FTD9x7Cls2rihLlo57QDCcHoLBGn5Dk51SwtFBWkUWLxZaBXyNVpCw1S+atvE7GmnFjeaRZ0WLq3UYuqAdg==} - dev: true + pinpoint@1.1.0: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + pirates@4.0.6: {} - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 - dev: true - /pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} + pkg-up@3.1.0: dependencies: find-up: 3.0.0 - /playwright-core@1.43.1: - resolution: {integrity: sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==} - engines: {node: '>=16'} - hasBin: true + playwright-core@1.44.1: {} - /playwright@1.43.1: - resolution: {integrity: sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==} - engines: {node: '>=16'} - hasBin: true + playwright@1.44.1: dependencies: - playwright-core: 1.43.1 + playwright-core: 1.44.1 optionalDependencies: fsevents: 2.3.2 - /please-upgrade-node@3.2.0: - resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + please-upgrade-node@3.2.0: dependencies: semver-compare: 1.0.0 - dev: true - /posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - dev: false + posix-character-classes@0.1.1: {} - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss-value-parser@4.2.0: {} - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.31: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - dev: false - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.38: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.2.0 - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true + prebuild-install@7.1.1: dependencies: detect-libc: 2.0.2 expand-template: 2.0.3 @@ -14870,62 +17899,39 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: true - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.1.2: {} - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.3.0: {} - /pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + pretty-error@4.0.0: dependencies: lodash: 4.17.21 renderkid: 3.0.0 - dev: true - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true - - /pretty-quick@4.0.0(prettier@3.2.5): - resolution: {integrity: sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - prettier: ^3.0.0 + + pretty-ms@9.0.0: + dependencies: + parse-ms: 4.0.0 + + pretty-quick@4.0.0(prettier@3.3.0): dependencies: execa: 5.1.1 find-up: 5.0.0 @@ -14933,62 +17939,34 @@ packages: mri: 1.2.0 picocolors: 1.0.0 picomatch: 3.0.1 - prettier: 3.2.5 + prettier: 3.3.0 tslib: 2.6.2 - dev: true - /prettyjson@1.2.5: - resolution: {integrity: sha512-rksPWtoZb2ZpT5OVgtmy0KHVM+Dca3iVwWY9ifwhcexfjebtgjg3wmrUt9PvJ59XIYBcknQeYHD8IAnVlh9lAw==} - hasBin: true + prettyjson@1.2.5: dependencies: colors: 1.4.0 minimist: 1.2.8 - dev: true - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} + prismjs@1.29.0: {} - /proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + proc-log@3.0.0: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-nextick-args@2.0.1: {} - /process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} - engines: {node: '>=8'} + process-on-spawn@1.0.0: dependencies: fromentries: 1.3.2 - dev: true - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + process@0.11.10: {} - /promise-inflight@1.0.1(bluebird@3.7.2): - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dependencies: - bluebird: 3.7.2 + promise-inflight@1.0.1: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: true - /promise.allsettled@1.0.7: - resolution: {integrity: sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==} - engines: {node: '>= 0.4'} + promise.allsettled@1.0.7: dependencies: array.prototype.map: 1.0.6 call-bind: 1.0.7 @@ -14996,250 +17974,112 @@ packages: es-abstract: 1.23.3 get-intrinsic: 1.2.4 iterate-value: 1.0.2 - dev: true - /promzard@1.0.0: - resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + promzard@1.0.0: dependencies: read: 2.1.0 - dev: true - /prop-types-exact@1.2.0: - resolution: {integrity: sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==} + prop-types-exact@1.2.0: dependencies: has: 1.0.4 object.assign: 4.1.5 reflect.ownkeys: 0.2.0 - dev: true - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 18.2.0 - /protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} - dev: true + protocols@2.0.1: {} - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: true - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true - - /prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: false - - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true + proxy-from-env@1.1.0: {} - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - dependencies: - bn.js: 4.12.0 - browserify-rsa: 4.1.0 - create-hash: 1.2.0 - parse-asn1: 5.1.6 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - dev: false + pseudomap@1.0.2: {} - /pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false + psl@1.9.0: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - /pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - dev: false - - /punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - dev: true - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode.js@2.3.1: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + punycode@1.4.1: {} - /qjobs@1.2.0: - resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} - engines: {node: '>=0.9'} - dev: true + punycode@2.3.1: {} - /qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true + qjobs@1.2.0: {} - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} + qs@6.11.0: dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 - /query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} + qs@6.11.2: dependencies: - decode-uri-component: 0.2.2 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - dev: true - - /querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - dev: false + side-channel: 1.0.6 - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + querystringify@2.2.0: {} - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + queue-tick@1.0.1: {} - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true + quick-lru@4.0.1: {} - /raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + raf@3.4.1: dependencies: performance-now: 2.1.0 - dev: true - /railroad-diagrams@1.0.0: - resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} - dev: true + railroad-diagrams@1.0.0: {} - /rambda@7.5.0: - resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} - dev: true + rambda@7.5.0: {} - /randexp@0.4.6: - resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} - engines: {node: '>=0.12'} + randexp@0.4.6: dependencies: discontinuous-range: 1.0.0 ret: 0.1.15 - dev: true - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - /randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + randombytes@2.1.0: dependencies: - randombytes: 2.1.0 safe-buffer: 5.2.1 - dev: false - /range-parser@1.2.0: - resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} - engines: {node: '>= 0.6'} - dev: true + range-parser@1.2.0: {} - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true + range-parser@1.2.1: {} - /raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} + raw-body@2.5.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true - - /raw-loader@1.0.0(webpack@4.47.0): - resolution: {integrity: sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==} - engines: {node: '>= 6.9.0'} - peerDependencies: - webpack: ^4.3.0 - dependencies: - loader-utils: 1.4.2 - schema-utils: 1.0.0 - webpack: 4.47.0(webpack-cli@5.1.4) - dev: false - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true - /react-docgen@5.4.3: - resolution: {integrity: sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==} - engines: {node: '>=8.10.0'} - hasBin: true + react-docgen@5.4.3: dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/runtime': 7.24.5 + '@babel/core': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/runtime': 7.24.6 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -15249,209 +18089,131 @@ packages: strip-indent: 3.0.0 transitivePeerDependencies: - supports-color - dev: false - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - /react-hook-form@7.51.4(react@18.2.0): - resolution: {integrity: sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==} - engines: {node: '>=12.22.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 + react-hook-form@7.51.5(react@18.2.0): dependencies: react: 18.2.0 - dev: false - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.2.0: {} - /react-reconciler@0.29.0(react@18.2.0): - resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^18.2.0 + react-reconciler@0.29.0(react@18.2.0): dependencies: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - dev: true - /react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react-router-dom@6.23.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@remix-run/router': 1.15.3 + '@remix-run/router': 1.16.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.22.3(react@18.2.0) + react-router: 6.23.1(react@18.2.0) - /react-router@6.22.3(react@18.2.0): - resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' + react-router@6.23.1(react@18.2.0): dependencies: - '@remix-run/router': 1.15.3 + '@remix-run/router': 1.16.1 react: 18.2.0 - /react-runner@1.0.3(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-KyAzNzSVdrBc4A7aGW3FD0wVuujfgcBlyIGF0QVicJu0ucMpLYyTHE+PgBu82Iq698TPKRH+eEi6Mrq/e7OffA==} - peerDependencies: - react: ^16.0.0 || ^17 || ^18 - react-dom: ^16.0.0 || ^17 || ^18 + react-runner@1.0.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) sucrase: 3.35.0 - dev: false - /react-shallow-renderer@16.15.0(react@18.2.0): - resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-shallow-renderer@16.15.0(react@18.2.0): dependencies: object-assign: 4.1.1 react: 18.2.0 react-is: 18.2.0 - dev: true - /react-simple-code-editor@0.13.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-XYeVwRZwgyKtjNIYcAEgg2FaQcCZwhbarnkJIV20U2wkCU9q/CPFBo8nRXrK4GXUz3AvbqZFsZRrpUTkqqEYyQ==} - peerDependencies: - react: '*' - react-dom: '*' + react-simple-code-editor@0.13.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /react-test-renderer@18.2.0(react@18.2.0): - resolution: {integrity: sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==} - peerDependencies: - react: ^18.2.0 + react-test-renderer@18.2.0(react@18.2.0): dependencies: react: 18.2.0 react-is: 18.2.0 react-shallow-renderer: 16.15.0(react@18.2.0) scheduler: 0.23.0 - dev: true - /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' + react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - /read-cmd-shim@4.0.0: - resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + read-cmd-shim@4.0.0: {} - /read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json-fast@3.0.2: dependencies: json-parse-even-better-errors: 3.0.1 npm-normalize-package-bin: 3.0.1 - dev: true - /read-package-json@6.0.4: - resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-package-json@6.0.4: dependencies: glob: 10.3.10 json-parse-even-better-errors: 3.0.1 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 - dev: true - /read-package-json@7.0.0: - resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} - engines: {node: ^16.14.0 || >=18.0.0} + read-package-json@7.0.0: dependencies: glob: 10.3.10 json-parse-even-better-errors: 3.0.1 normalize-package-data: 6.0.0 npm-normalize-package-bin: 3.0.1 - dev: true - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + read-pkg-up@3.0.0: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /read@2.1.0: - resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read@2.1.0: dependencies: mute-stream: 1.0.0 - dev: true - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + readable-stream@1.0.34: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 - dev: false - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -15461,82 +18223,47 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdir-glob@1.1.3: dependencies: minimatch: 5.1.6 - dev: false - - /readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10 - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - requiresBuild: true + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /readline-sync@1.4.10: - resolution: {integrity: sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==} - engines: {node: '>= 0.8.0'} - dev: true + readline-sync@1.4.10: {} - /recast@0.20.5: - resolution: {integrity: sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==} - engines: {node: '>= 4'} + recast@0.20.5: dependencies: ast-types: 0.14.2 esprima: 4.0.1 source-map: 0.6.1 tslib: 2.6.2 - /recast@0.23.6: - resolution: {integrity: sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==} - engines: {node: '>= 4'} + recast@0.23.9: dependencies: ast-types: 0.16.1 esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 tslib: 2.6.2 - dev: false - /rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} + rechoir@0.8.0: dependencies: resolve: 1.22.8 - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} - engines: {node: '>= 0.4'} + reflect.getprototypeof@1.0.4: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -15544,54 +18271,36 @@ packages: get-intrinsic: 1.2.4 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: true - /reflect.ownkeys@0.2.0: - resolution: {integrity: sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==} - dev: true + reflect.ownkeys@0.2.0: {} - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerate@1.4.2: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true + regenerator-runtime@0.13.11: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regenerator-runtime@0.14.1: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.24.5 + '@babel/runtime': 7.24.6 - /regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} + regex-not@1.0.2: dependencies: extend-shallow: 3.0.2 safe-regex: 1.1.0 - dev: false - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 - set-function-name: 2.0.1 - dev: true + set-function-name: 2.0.2 - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -15600,390 +18309,214 @@ packages: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - /registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + registry-auth-token@3.3.2: dependencies: rc: 1.2.8 safe-buffer: 5.2.1 - dev: true - /registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} + registry-url@3.1.0: dependencies: rc: 1.2.8 - dev: true - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + regjsparser@0.9.1: dependencies: jsesc: 0.5.0 - /relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: true + relateurl@0.2.7: {} - /release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} + release-zalgo@1.0.0: dependencies: es6-error: 4.1.1 - dev: true - /remark-parse@9.0.0: - resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} + remark-parse@9.0.0: dependencies: mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - dev: true - /remark-stringify@9.0.1: - resolution: {integrity: sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==} + remark-stringify@9.0.1: dependencies: mdast-util-to-markdown: 0.6.5 - dev: true - /remark@13.0.0: - resolution: {integrity: sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==} + remark@13.0.0: dependencies: remark-parse: 9.0.0 remark-stringify: 9.0.1 unified: 9.2.2 transitivePeerDependencies: - supports-color - dev: true - - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - requiresBuild: true - dev: false - optional: true - /renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + renderkid@3.0.0: dependencies: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 lodash: 4.17.21 strip-ansi: 6.0.1 - dev: true - /repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - dev: false - - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} + repeat-element@1.1.4: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + repeat-string@1.6.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true + require-from-string@2.0.2: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + require-main-filename@2.0.0: {} - /reselect@4.1.8: - resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + requires-port@1.0.0: {} - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true + reselect@4.1.8: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: false + resolve-url@0.2.1: {} - /resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - dev: true + resolve@1.1.7: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: true - /ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} + ret@0.1.15: {} - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: true + retry@0.12.0: {} - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true + retry@0.13.1: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: true + rfdc@1.3.1: {} - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - hasBin: true + rimraf@2.6.3: dependencies: glob: 7.2.3 - dev: false - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true + rimraf@2.7.1: dependencies: glob: 7.2.3 - dev: false - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - /rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true + rimraf@4.4.1: dependencies: glob: 9.3.5 - dev: true - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true + rimraf@5.0.7: dependencies: glob: 10.3.10 - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - dev: false + robust-predicates@3.0.2: {} - /robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - dev: false + rrweb-cssom@0.6.0: {} - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true + rrweb-cssom@0.7.0: {} - /rst-selector-parser@2.2.3: - resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==} + rst-selector-parser@2.2.3: dependencies: lodash.flattendeep: 4.4.0 nearley: 2.20.1 - dev: true - /rtl-css-js@1.16.1: - resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + rtl-css-js@1.16.1: dependencies: - '@babel/runtime': 7.24.5 - dev: true + '@babel/runtime': 7.24.6 - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true + run-async@2.4.1: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - - /run-queue@1.0.3: - resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} - dependencies: - aproba: 1.2.0 - dev: false - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + safe-regex@1.1.0: dependencies: ret: 0.1.15 - dev: false - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} + saxes@5.0.1: dependencies: xmlchars: 2.2.0 - dev: false - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - /schema-utils@1.0.0: - resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} - engines: {node: '>= 4'} - dependencies: - ajv: 6.12.6 - ajv-errors: 1.0.1(ajv@6.12.6) - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} + schema-utils@4.2.0: dependencies: '@types/json-schema': 7.0.15 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true - /search-insights@2.13.0: - resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} - dev: false + search-insights@2.13.0: {} - /semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - dev: true + semver-compare@1.0.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.3: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 + semver@7.6.2: {} - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@0.18.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -16000,27 +18533,16 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true - - /serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} - dependencies: - randombytes: 2.1.0 - dev: false - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.0: dependencies: randombytes: 2.1.0 - dev: true - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - /serve-handler@6.1.5: - resolution: {integrity: sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==} + serve-handler@6.1.5: dependencies: bytes: 3.0.0 content-disposition: 0.5.2 @@ -16030,11 +18552,8 @@ packages: path-is-inside: 1.0.2 path-to-regexp: 2.2.1 range-parser: 1.2.0 - dev: true - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@1.15.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -16042,12 +18561,8 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true - /serve@14.2.3: - resolution: {integrity: sha512-VqUFMC7K3LDGeGnJM9h56D3XGKb6KGgOw0cVNtA26yYXHCcpxf3xwCTUaQoWlVS7i8Jdh3GjQkOB23qsXyjoyQ==} - engines: {node: '>= 14'} - hasBin: true + serve@14.2.3: dependencies: '@zeit/schemas': 2.36.0 ajv: 8.12.0 @@ -16062,15 +18577,10 @@ packages: update-check: 1.5.4 transitivePeerDependencies: - supports-color - dev: true - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true + set-blocking@2.0.0: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -16079,98 +18589,61 @@ packages: gopd: 1.0.1 has-property-descriptors: 1.0.2 - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} + set-value@2.0.1: dependencies: extend-shallow: 2.0.1 is-extendable: 0.1.1 is-plain-object: 2.0.4 split-string: 3.1.0 - dev: false - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true + setimmediate@1.0.5: {} - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - dev: false + setprototypeof@1.2.0: {} - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false + shallowequal@1.1.0: {} - /sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - requiresBuild: true + sharp@0.32.6: dependencies: color: 4.2.3 detect-libc: 2.0.2 node-addon-api: 6.1.0 prebuild-install: 7.1.1 - semver: 7.6.0 + semver: 7.6.2 simple-get: 4.0.1 tar-fs: 3.0.4 tunnel-agent: 0.6.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true + shell-quote@1.8.1: {} - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 + es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@4.1.0: {} - /sigstore@1.9.0: - resolution: {integrity: sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + sigstore@1.9.0: dependencies: '@sigstore/bundle': 1.1.0 '@sigstore/protobuf-specs': 0.2.1 @@ -16179,11 +18652,8 @@ packages: make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color - dev: true - /sigstore@2.2.0: - resolution: {integrity: sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==} - engines: {node: ^16.14.0 || >=18.0.0} + sigstore@2.2.0: dependencies: '@sigstore/bundle': 2.1.1 '@sigstore/core': 0.2.0 @@ -16193,28 +18663,20 @@ packages: '@sigstore/verify': 0.1.0 transitivePeerDependencies: - supports-color - dev: true - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true + simple-concat@1.0.1: {} - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: true - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - dev: true - /sinon@16.1.3: - resolution: {integrity: sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==} + sinon@16.1.3: dependencies: '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 10.3.0 @@ -16222,60 +18684,34 @@ packages: diff: 5.1.0 nise: 5.1.7 supports-color: 7.2.0 - dev: true - /sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@2.0.4: dependencies: '@polka/url': 1.0.0-next.24 mrmime: 2.0.0 totalist: 3.0.1 - /slash@2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - dev: true + slash@2.0.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true + slash@4.0.0: {} - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - dev: true + slash@5.1.0: {} - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true + smart-buffer@4.2.0: {} - /snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} + snapdragon-node@2.1.1: dependencies: define-property: 1.0.0 isobject: 3.0.1 snapdragon-util: 3.0.1 - dev: false - /snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} + snapdragon-util@3.0.1: dependencies: kind-of: 3.2.2 - dev: false - /snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} + snapdragon@0.8.2: dependencies: base: 0.11.2 debug: 2.6.9 @@ -16287,30 +18723,22 @@ packages: use: 3.1.1 transitivePeerDependencies: - supports-color - dev: false - /socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + socket.io-adapter@2.5.2: dependencies: ws: 8.11.0 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} + socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.0 debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - dev: true - /socket.io@4.7.4: - resolution: {integrity: sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==} - engines: {node: '>=10.2.0'} + socket.io@4.7.4: dependencies: accepts: 1.3.8 base64id: 2.0.0 @@ -16323,99 +18751,61 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: true - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} + socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) socks: 2.7.1 transitivePeerDependencies: - supports-color - dev: true - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} - engines: {node: '>= 14'} + socks-proxy-agent@8.0.2: dependencies: agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) socks: 2.7.1 transitivePeerDependencies: - supports-color - dev: true - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks@2.7.1: dependencies: ip: 2.0.0 smart-buffer: 4.2.0 - dev: true - /sort-keys@2.0.0: - resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} - engines: {node: '>=4'} + sort-keys@2.0.0: dependencies: is-plain-obj: 1.1.0 - dev: true - /source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - dev: false - - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + source-map-js@1.2.0: {} - /source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated + source-map-resolve@0.5.3: dependencies: atob: 2.1.2 decode-uri-component: 0.2.2 resolve-url: 0.2.1 source-map-url: 0.4.1 urix: 0.1.0 - dev: false - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - dev: false + source-map-url@0.4.1: {} - /source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - requiresBuild: true + source-map@0.2.0: dependencies: amdefine: 1.0.1 - dev: true optional: true - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} + source-map@0.5.7: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} - dev: true + spawn-command@0.0.2: {} - /spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} + spawn-wrap@2.0.0: dependencies: foreground-child: 2.0.0 is-windows: 1.0.2 @@ -16423,372 +18813,204 @@ packages: rimraf: 3.0.2 signal-exit: 3.0.7 which: 2.0.2 - dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 - dev: true - /spdx-exceptions@2.4.0: - resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} - dev: true + spdx-exceptions@2.4.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.16 - dev: true - /spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.16 - dev: true - - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: true - /split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} - dev: true + spdx-license-ids@3.0.16: {} - /split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} + split-string@3.1.0: dependencies: extend-shallow: 3.0.2 - dev: false - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: true - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + split@1.0.1: dependencies: through: 2.3.8 - dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /ssri@10.0.5: - resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@10.0.5: dependencies: minipass: 7.0.4 - dev: true - - /ssri@6.0.2: - resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} - dependencies: - figgy-pudding: 3.5.2 - dev: false - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ssri@9.0.1: dependencies: minipass: 3.3.6 - dev: true - /static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} + static-extend@0.1.2: dependencies: define-property: 0.2.5 object-copy: 0.1.0 - dev: false - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true + statuses@1.5.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true + statuses@2.0.1: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.7 - dev: true - - /stream-browserify@2.0.2: - resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false - /stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-browserify@3.0.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 - dev: true - - /stream-each@1.2.3: - resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} - dependencies: - end-of-stream: 1.4.4 - stream-shift: 1.0.3 - dev: false - - /stream-http@2.8.3: - resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==} - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 2.3.8 - to-arraybuffer: 1.0.1 - xtend: 4.0.2 - dev: false - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: false - - /streamroller@3.1.5: - resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} - engines: {node: '>=8.0'} + streamroller@3.1.5: dependencies: date-format: 4.0.14 debug: 4.3.4(supports-color@8.1.1) fs-extra: 8.1.0 transitivePeerDependencies: - supports-color - dev: true - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + streamsearch@1.1.0: {} - /streamx@2.15.6: - resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + streamx@2.15.6: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - dev: true - /strict-event-emitter@0.5.1: - resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - dev: true - - /strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} - dev: true - - /string-replace-loader@3.1.0(webpack@5.91.0): - resolution: {integrity: sha512-5AOMUZeX5HE/ylKDnEa/KKBqvlnFmRZudSOjVJHxhoJg9QYTwl1rECx7SLR8BBH7tfxb4Rp7EM2XVfQFxIhsbQ==} - peerDependencies: - webpack: ^5 + string-replace-loader@3.1.0(webpack@5.91.0(webpack-cli@5.1.4)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.91.0(webpack-cli@5.1.4) - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 + gopd: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.7 regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.1 - side-channel: 1.0.4 - dev: true + set-function-name: 2.0.2 + side-channel: 1.0.6 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false + string_decoder@0.10.31: {} - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@4.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true + strong-log-transformer@2.1.0: dependencies: duplexer: 0.1.2 minimist: 1.2.8 through: 2.3.8 - dev: true - /styled-components@6.1.8(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} - engines: {node: '>= 16'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' + styled-components@6.1.11(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@emotion/is-prop-valid': 1.2.1 - '@emotion/unitless': 0.8.0 - '@types/stylis': 4.2.0 + '@emotion/is-prop-valid': 1.2.2 + '@emotion/unitless': 0.8.1 + '@types/stylis': 4.2.5 css-to-react-native: 3.2.0 - csstype: 3.1.2 - postcss: 8.4.31 + csstype: 3.1.3 + postcss: 8.4.38 react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - shallowequal: 1.1.0 - stylis: 4.3.1 - tslib: 2.5.0 - dev: false - - /styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + react-dom: 18.2.0(react@18.2.0) + shallowequal: 1.1.0 + stylis: 4.3.2 + tslib: 2.6.2 + + styled-jsx@5.1.1(@babel/core@7.24.6)(react@18.2.0): dependencies: - '@babel/core': 7.24.5 client-only: 0.0.1 react: 18.2.0 - dev: false + optionalDependencies: + '@babel/core': 7.24.6 - /stylis-plugin-rtl@2.1.1(stylis@4.3.1): - resolution: {integrity: sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==} - peerDependencies: - stylis: 4.x + stylis-plugin-rtl@2.1.1(stylis@4.3.2): dependencies: cssjanus: 2.1.0 - stylis: 4.3.1 + stylis: 4.3.2 - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + stylis@4.2.0: {} - /stylis@4.3.1: - resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + stylis@4.3.2: {} - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 @@ -16797,91 +19019,55 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: false - /supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} + supports-color@3.2.3: dependencies: has-flag: 1.0.0 - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-hyperlinks@1.0.1: - resolution: {integrity: sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==} - engines: {node: '>=4'} + supports-hyperlinks@1.0.1: dependencies: has-flag: 2.0.0 supports-color: 5.5.0 - dev: true - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true + symbol-tree@3.2.4: {} - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 - dev: true - - /tapable@0.1.10: - resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} - engines: {node: '>=0.6'} - dev: true - /tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - dev: false + tapable@0.1.10: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + tapable@2.2.1: {} - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true - /tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + tar-fs@3.0.4: dependencies: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 3.1.7 - dev: true - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -16889,29 +19075,13 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 - /tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar-stream@3.1.7: dependencies: b4a: 1.6.4 fast-fifo: 1.3.2 streamx: 2.15.6 - dev: true - - /tar@6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 3.3.6 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -16919,53 +19089,23 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true - /temp-dir@1.0.0: - resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} - engines: {node: '>=4'} - dev: true + temp-dir@1.0.0: {} - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} + temp@0.8.4: dependencies: rimraf: 2.6.3 - dev: false - /terser-webpack-plugin@1.4.5(webpack@4.47.0): - resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} - engines: {node: '>= 6.9.0'} - peerDependencies: - webpack: ^4.0.0 + terser-webpack-plugin@5.3.10(webpack@5.91.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))): dependencies: - cacache: 12.0.4 - find-cache-dir: 2.1.0 - is-wsl: 1.1.0 - schema-utils: 1.0.0 - serialize-javascript: 4.0.0 - source-map: 0.6.1 - terser: 4.8.1 - webpack: 4.47.0(webpack-cli@5.1.4) - webpack-sources: 1.4.3 - worker-farm: 1.7.0 - dev: false + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.91.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0)) - /terser-webpack-plugin@5.3.10(webpack@5.91.0): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(webpack@5.91.0(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 @@ -16974,358 +19114,196 @@ packages: terser: 5.27.0 webpack: 5.91.0(webpack-cli@5.1.4) - /terser@4.8.1: - resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - acorn: 8.11.3 - commander: 2.20.3 - source-map: 0.6.1 - source-map-support: 0.5.21 - dev: false - - /terser@5.27.0: - resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} - engines: {node: '>=10'} - hasBin: true + terser@5.27.0: dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true + text-extensions@1.9.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: false - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: false - /through2@0.4.2: - resolution: {integrity: sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==} + through2@0.4.2: dependencies: readable-stream: 1.0.34 xtend: 2.1.2 - dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} - dependencies: - setimmediate: 1.0.5 - dev: false + through@2.3.8: {} - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: false + tiny-invariant@1.3.3: {} - /tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + tiny-warning@1.0.3: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tmp@0.2.1: dependencies: rimraf: 3.0.2 - /to-arraybuffer@1.0.1: - resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==} - dev: false - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} + to-object-path@0.3.0: dependencies: kind-of: 3.2.2 - dev: false - /to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} + to-regex-range@2.1.1: dependencies: is-number: 3.0.0 repeat-string: 1.6.1 - dev: false - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} + to-regex@3.0.2: dependencies: define-property: 2.0.2 extend-shallow: 3.0.2 regex-not: 1.0.2 safe-regex: 1.1.0 - dev: false - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true + toidentifier@1.0.1: {} - /totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + totalist@3.0.1: {} - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} + tough-cookie@4.1.4: dependencies: psl: 1.9.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 - dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true + tr46@0.0.3: {} - /tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + tr46@5.0.0: dependencies: punycode: 2.3.1 - dev: true - /traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - dev: false + traverse@0.3.9: {} - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + trim-newlines@3.0.1: {} - /trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - dev: true + trough@1.0.5: {} - /ts-api-utils@1.3.0(typescript@5.4.5): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.3.0(typescript@5.4.5): dependencies: typescript: 5.4.5 - dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false + ts-interface-checker@0.1.13: {} - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: false - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - dev: true + tsscmp@1.0.6: {} - /tsx@4.7.3: - resolution: {integrity: sha512-+fQnMqIp/jxZEXLcj6WzYy9FhcS5/Dfk8y4AtzJ6ejKcKqmfTF8Gso/jtrzDggCF2zTU20gJa6n8XqPYwDAUYQ==} - engines: {node: '>=18.0.0'} - hasBin: true + tsx@4.11.0: dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.3 + esbuild: 0.20.2 + get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 - dev: true - - /tty-browserify@0.0.0: - resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} - dev: false - /tuf-js@1.1.7: - resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + tuf-js@1.1.7: dependencies: '@tufjs/models': 1.0.4 debug: 4.3.4(supports-color@8.1.1) make-fetch-happen: 11.1.1 transitivePeerDependencies: - supports-color - dev: true - /tuf-js@2.2.0: - resolution: {integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==} - engines: {node: ^16.14.0 || >=18.0.0} + tuf-js@2.2.0: dependencies: '@tufjs/models': 2.0.0 debug: 4.3.4(supports-color@8.1.1) make-fetch-happen: 13.0.0 transitivePeerDependencies: - supports-color - dev: true - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - dev: true - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 - dev: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true + type-fest@0.18.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true + type-fest@0.21.3: {} - /type-fest@0.4.1: - resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} - engines: {node: '>=6'} - dev: true + type-fest@0.4.1: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + type-fest@2.19.0: {} - /type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: true - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -17333,11 +19311,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -17345,77 +19320,45 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typedarray@0.0.6: {} - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.4.5: {} - /ua-parser-js@0.7.37: - resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==} - dev: true + ua-parser-js@0.7.37: {} - /uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - dev: true + uc.micro@2.1.0: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.17.4: optional: true - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} + unicode-canonical-property-names-ecmascript@2.0.0: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} + unicode-match-property-value-ecmascript@2.1.0: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + unicode-property-aliases-ecmascript@2.1.0: {} - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - dev: true + unicorn-magic@0.1.0: {} - /unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} + unified@9.2.2: dependencies: '@types/unist': 2.0.10 bail: 1.0.5 @@ -17424,103 +19367,55 @@ packages: is-plain-obj: 2.1.0 trough: 1.0.5 vfile: 4.2.1 - dev: true - /union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} + union-value@1.0.1: dependencies: arr-union: 3.1.0 get-value: 2.0.6 is-extendable: 0.1.1 set-value: 2.0.1 - dev: false - - /unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - dependencies: - unique-slug: 2.0.2 - dev: false - /unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 - dev: true - - /unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} - dependencies: - imurmurhash: 0.1.4 - dev: false - /unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + unique-slug@4.0.0: dependencies: imurmurhash: 0.1.4 - dev: true - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: true + unist-util-is@4.1.0: {} - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.10 - dev: true - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + unist-util-visit-parents@3.1.1: dependencies: '@types/unist': 2.0.10 unist-util-is: 4.1.0 - dev: true - /unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + unist-util-visit@2.0.3: dependencies: '@types/unist': 2.0.10 unist-util-is: 4.1.0 unist-util-visit-parents: 3.1.1 - dev: true - /universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - dev: true + universal-user-agent@6.0.1: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.1.2: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + universalify@0.2.0: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true + unpipe@1.0.0: {} - /unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} + unset-value@1.0.0: dependencies: has-value: 0.3.1 isobject: 3.0.1 - dev: false - /unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + unzipper@0.10.14: dependencies: big-integer: 1.6.52 binary: 0.3.0 @@ -17532,243 +19427,114 @@ packages: listenercount: 1.0.1 readable-stream: 2.3.8 setimmediate: 1.0.5 - dev: false - - /upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - requiresBuild: true - dev: false - optional: true - /upath@2.0.1: - resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} - engines: {node: '>=4'} - dev: true + upath@2.0.1: {} - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.23.0): dependencies: browserslist: 4.23.0 escalade: 3.1.1 picocolors: 1.0.0 - /update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + update-check@1.5.4: dependencies: registry-auth-token: 3.3.2 registry-url: 3.1.0 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: false - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - - /url-template@2.0.8: - resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} - dev: true - - /url@0.11.3: - resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} - dependencies: - punycode: 1.4.1 - qs: 6.11.2 - dev: false + urix@0.1.0: {} - /urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - dev: true + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 - /use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - dev: false + url-template@2.0.8: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + urlpattern-polyfill@8.0.2: {} - /util.inherits@1.0.3: - resolution: {integrity: sha512-gMirHcfcq5D87nXDwbZqf5vl65S0mpMZBsHXJsXOO3Hc3G+JoQLwgaJa1h+PL7h3WhocnuLqoe8CuvMlztkyCA==} - engines: {node: '>=4'} - dev: true + use@3.1.1: {} - /util@0.10.4: - resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} - dependencies: - inherits: 2.0.3 - dev: false + util-deprecate@1.0.2: {} - /util@0.11.1: - resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==} - dependencies: - inherits: 2.0.3 - dev: false + util.inherits@1.0.3: {} - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + util@0.12.5: dependencies: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 which-typed-array: 1.1.15 - dev: true - /utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: true + utila@0.4.0: {} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true + utils-merge@1.0.1: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: true + uuid@9.0.1: {} - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.2.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - dev: false - /v8flags@3.2.0: - resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} - engines: {node: '>= 0.10'} + v8flags@3.2.0: dependencies: homedir-polyfill: 1.0.3 - dev: true - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - /validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + validate-npm-package-name@3.0.0: dependencies: builtins: 1.0.3 - dev: true - /validate-npm-package-name@5.0.0: - resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@5.0.0: dependencies: builtins: 5.0.1 - dev: true - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true + vary@1.1.2: {} - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 2.0.3 - dev: true - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + vfile@4.2.1: dependencies: '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 - dev: true - /vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - dev: false - - /void-elements@2.0.1: - resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} - engines: {node: '>=0.10.0'} - dev: true + void-elements@2.0.1: {} - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - dev: true - - /watchpack-chokidar2@2.0.1: - resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} - requiresBuild: true - dependencies: - chokidar: 2.1.8 - transitivePeerDependencies: - - supports-color - dev: false - optional: true - - /watchpack@1.7.5: - resolution: {integrity: sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==} - dependencies: - graceful-fs: 4.2.11 - neo-async: 2.6.2 - optionalDependencies: - chokidar: 3.5.3 - watchpack-chokidar2: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: false - /watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true + webidl-conversions@3.0.1: {} - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: {} - /webpack-bundle-analyzer@4.10.1: - resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} - engines: {node: '>= 10.13.0'} - hasBin: true + webpack-bundle-analyzer@4.10.2: dependencies: '@discoveryjs/json-ext': 0.5.7 acorn: 8.11.3 @@ -17778,7 +19544,6 @@ packages: escape-string-regexp: 4.0.0 gzip-size: 6.0.0 html-escaper: 2.0.2 - is-plain-object: 5.0.0 opener: 1.5.2 picocolors: 1.0.0 sirv: 2.0.4 @@ -17787,27 +19552,12 @@ packages: - bufferutil - utf-8-validate - /webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0): - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true + webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.91.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.91.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.91.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))(webpack@5.91.0(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -17817,84 +19567,56 @@ packages: interpret: 3.1.1 rechoir: 0.8.0 webpack: 5.91.0(webpack-cli@5.1.4) - webpack-bundle-analyzer: 4.10.1 webpack-merge: 5.10.0 + optionalDependencies: + webpack-bundle-analyzer: 4.10.2 - /webpack-merge@4.2.2: - resolution: {integrity: sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==} + webpack-merge@4.2.2: dependencies: lodash: 4.17.21 - dev: true - /webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + webpack-merge@5.10.0: dependencies: clone-deep: 4.0.1 flat: 5.0.2 wildcard: 2.0.1 - /webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - dev: false - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + webpack-sources@3.2.3: {} - /webpack@4.47.0(webpack-cli@5.1.4): - resolution: {integrity: sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==} - engines: {node: '>=6.11.5'} - hasBin: true - peerDependencies: - webpack-cli: '*' - webpack-command: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webpack-command: - optional: true + webpack@5.91.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0)): dependencies: - '@webassemblyjs/ast': 1.9.0 - '@webassemblyjs/helper-module-context': 1.9.0 - '@webassemblyjs/wasm-edit': 1.9.0 - '@webassemblyjs/wasm-parser': 1.9.0 - acorn: 6.4.2 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 4.5.0 - eslint-scope: 4.0.3 - json-parse-better-errors: 1.0.2 - loader-runner: 2.4.0 - loader-utils: 1.4.2 - memory-fs: 0.4.1 - micromatch: 3.1.10 - mkdirp: 0.5.6 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 neo-async: 2.6.2 - node-libs-browser: 2.2.1 - schema-utils: 1.0.0 - tapable: 1.1.3 - terser-webpack-plugin: 1.4.5(webpack@4.47.0) - watchpack: 1.7.5 - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0) - webpack-sources: 1.4.3 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.91.0(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0))) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0) transitivePeerDependencies: - - supports-color - dev: false + - '@swc/core' + - esbuild + - uglify-js - /webpack@5.91.0(webpack-cli@5.1.4): - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.91.0(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -17917,55 +19639,41 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(webpack@5.91.0(webpack-cli@5.1.4)) watchpack: 2.4.1 - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.1)(webpack@5.91.0) webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.91.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true + whatwg-mimetype@4.0.0: {} - /whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@14.0.0: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 - dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - dev: true - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 @@ -17979,144 +19687,91 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.1 which-typed-array: 1.1.15 - dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.1: dependencies: is-map: 2.0.2 is-set: 2.0.2 is-weakmap: 2.0.1 is-weakset: 2.0.2 - dev: true - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true + which-module@2.0.1: {} - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true + which@4.0.0: dependencies: isexe: 3.1.1 - dev: true - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: true - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: true - - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + wildcard@2.0.1: {} - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + word-wrap@1.2.5: {} - /worker-farm@1.7.0: - resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} - dependencies: - errno: 0.1.8 - dev: false + wordwrap@1.0.0: {} - /workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - dev: true + workerpool@6.2.1: {} - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + write-file-atomic@2.4.3: dependencies: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - /write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 - dev: true - /write-json-file@3.2.0: - resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} - engines: {node: '>=6'} + write-json-file@3.2.0: dependencies: detect-indent: 5.0.0 graceful-fs: 4.2.11 @@ -18124,133 +19779,62 @@ packages: pify: 4.0.1 sort-keys: 2.0.0 write-file-atomic: 2.4.3 - dev: true - /write-pkg@4.0.0: - resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} - engines: {node: '>=8'} + write-pkg@4.0.0: dependencies: sort-keys: 2.0.0 type-fest: 0.4.1 write-json-file: 3.2.0 - dev: true - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@7.5.9: {} - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.11.0: {} - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.17.0: {} - /xcase@2.0.1: - resolution: {integrity: sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==} - dev: true + xcase@2.0.1: {} - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true + xml-name-validator@5.0.0: {} - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xmlchars@2.2.0: {} - /xtend@2.1.2: - resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} - engines: {node: '>=0.4'} + xtend@2.1.2: dependencies: object-keys: 0.4.0 - dev: false - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@4.0.3: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true + yallist@2.1.2: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + yaml@1.10.2: {} - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - dev: true - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.4: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 decamelize: 4.0.0 flat: 5.0.2 is-plain-obj: 2.1.0 - dev: true - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -18263,11 +19847,8 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - dev: true - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -18277,9 +19858,7 @@ packages: y18n: 5.0.8 yargs-parser: 20.2.9 - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -18289,45 +19868,22 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} - /zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} + yoctocolors@2.0.2: {} + + zip-stream@4.1.1: dependencies: archiver-utils: 3.0.4 compress-commons: 4.1.2 readable-stream: 3.6.2 - dev: false - /zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - dev: true - - github.com/mui/material-ui/3c888ed6cf0774815c32c6309e8cea2d8b5e684b(@opentelemetry/api@1.8.0): - resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/3c888ed6cf0774815c32c6309e8cea2d8b5e684b} - id: github.com/mui/material-ui/3c888ed6cf0774815c32c6309e8cea2d8b5e684b - name: '@mui/monorepo' - version: 6.0.0-alpha.6 - requiresBuild: true + zod-validation-error@3.3.0(zod@3.23.8): dependencies: - '@googleapis/sheets': 5.0.5 - '@netlify/functions': 2.6.3(@opentelemetry/api@1.8.0) - '@slack/bolt': 3.18.0 - execa: 8.0.1 - google-auth-library: 9.9.0 - transitivePeerDependencies: - - '@opentelemetry/api' - - bufferutil - - debug - - encoding - - supports-color - - utf-8-validate - dev: true + zod: 3.23.8 + + zod@3.23.8: {} + + zwitch@1.0.5: {} diff --git a/renovate.json b/renovate.json index 821bce585422..5c6bf29584a6 100644 --- a/renovate.json +++ b/renovate.json @@ -6,7 +6,7 @@ "commitMessageTopic": "{{depName}}", "dependencyDashboard": true, "rebaseWhen": "conflicted", - "ignoreDeps": ["jsdom"], + "ignoreDeps": ["@mui/joy"], "labels": ["dependencies"], "stopUpdatingLabel": "on hold", "packageRules": [ @@ -35,11 +35,6 @@ "matchPackageNames": ["core-js"], "allowedVersions": "< 2.0.0" }, - { - "groupName": "raw-loader", - "matchPackageNames": ["raw-loader"], - "allowedVersions": "< 2.0.0" - }, { "groupName": "React", "matchPackageNames": [ @@ -89,7 +84,6 @@ "matchPackageNames": [ "@mui/base", "@mui/icons-material", - "@mui/joy", "@mui/lab", "@mui/material", "@mui/styles", diff --git a/scripts/buildApiDocs/chartsSettings/getComponentInfo.ts b/scripts/buildApiDocs/chartsSettings/getComponentInfo.ts index bb32c62e0d5b..179bbe8bbfe6 100644 --- a/scripts/buildApiDocs/chartsSettings/getComponentInfo.ts +++ b/scripts/buildApiDocs/chartsSettings/getComponentInfo.ts @@ -75,6 +75,7 @@ export function getComponentImports(name: string, filename: string) { const reExportPackage = [rootImportPath]; + // TODO x-charts-pro uncomment when making the package public // if (rootImportPath === '@mui/x-charts') { // reExportPackage.push('@mui/x-charts-pro'); // } diff --git a/scripts/buildApiDocs/chartsSettings/index.ts b/scripts/buildApiDocs/chartsSettings/index.ts index 7cba0ef04d64..6589a2972339 100644 --- a/scripts/buildApiDocs/chartsSettings/index.ts +++ b/scripts/buildApiDocs/chartsSettings/index.ts @@ -48,6 +48,7 @@ export default apiPages; rootPath: path.join(process.cwd(), 'packages/x-charts'), entryPointPath: 'src/index.ts', }, + // TODO x-charts-pro // { // name: 'charts-pro', // rootPath: path.join(process.cwd(), 'packages/x-charts-pro'), diff --git a/scripts/x-charts.exports.json b/scripts/x-charts.exports.json index 8e34fbddc6b8..4863552e605e 100644 --- a/scripts/x-charts.exports.json +++ b/scripts/x-charts.exports.json @@ -35,7 +35,17 @@ { "name": "BarElementProps", "kind": "TypeAlias" }, { "name": "BarElementSlotProps", "kind": "Interface" }, { "name": "BarElementSlots", "kind": "Interface" }, + { "name": "BarItem", "kind": "TypeAlias" }, { "name": "BarItemIdentifier", "kind": "TypeAlias" }, + { "name": "BarLabel", "kind": "Function" }, + { "name": "barLabelClasses", "kind": "Variable" }, + { "name": "BarLabelClasses", "kind": "Interface" }, + { "name": "BarLabelClassKey", "kind": "TypeAlias" }, + { "name": "BarLabelContext", "kind": "TypeAlias" }, + { "name": "BarLabelOwnerState", "kind": "Interface" }, + { "name": "BarLabelProps", "kind": "TypeAlias" }, + { "name": "BarLabelSlotProps", "kind": "Interface" }, + { "name": "BarLabelSlots", "kind": "Interface" }, { "name": "BarPlot", "kind": "Function" }, { "name": "BarPlotProps", "kind": "Interface" }, { "name": "BarPlotSlotProps", "kind": "Interface" }, @@ -82,6 +92,7 @@ { "name": "ChartsOnAxisClickHandler", "kind": "Function" }, { "name": "ChartsOnAxisClickHandlerProps", "kind": "Interface" }, { "name": "ChartsPieSorting", "kind": "TypeAlias" }, + { "name": "ChartsPluginType", "kind": "TypeAlias" }, { "name": "ChartsReferenceLine", "kind": "Function" }, { "name": "ChartsReferenceLineClasses", "kind": "Interface" }, { "name": "ChartsReferenceLineClassKey", "kind": "TypeAlias" }, @@ -106,6 +117,7 @@ { "name": "cheerfulFiestaPalette", "kind": "Variable" }, { "name": "cheerfulFiestaPaletteDark", "kind": "Variable" }, { "name": "cheerfulFiestaPaletteLight", "kind": "Variable" }, + { "name": "ColorProcessorsConfig", "kind": "TypeAlias" }, { "name": "ComputedPieRadius", "kind": "Interface" }, { "name": "ContinuousScaleName", "kind": "TypeAlias" }, { "name": "CurveType", "kind": "TypeAlias" }, @@ -140,6 +152,7 @@ { "name": "getAxisHighlightUtilityClass", "kind": "Function" }, { "name": "getAxisUtilityClass", "kind": "Function" }, { "name": "getBarElementUtilityClass", "kind": "Function" }, + { "name": "getBarLabelUtilityClass", "kind": "Function" }, { "name": "getChartsGridUtilityClass", "kind": "Function" }, { "name": "getChartsTooltipUtilityClass", "kind": "Function" }, { "name": "getGaugeUtilityClass", "kind": "Function" }, @@ -153,11 +166,17 @@ { "name": "getReferenceLineUtilityClass", "kind": "Function" }, { "name": "getSeriesToDisplay", "kind": "Function" }, { "name": "getValueToPositionMapper", "kind": "Function" }, + { "name": "HighlightedContext", "kind": "Variable" }, + { "name": "HighlightedProvider", "kind": "Function" }, + { "name": "HighlightedProviderProps", "kind": "TypeAlias" }, + { "name": "HighlightedState", "kind": "TypeAlias" }, { "name": "HighlightElementClassKey", "kind": "TypeAlias" }, + { "name": "HighlightItemData", "kind": "TypeAlias" }, { "name": "HighlightOptions", "kind": "TypeAlias" }, { "name": "HighlightScope", "kind": "TypeAlias" }, { "name": "isBarSeries", "kind": "Function" }, { "name": "isDefaultizedBarSeries", "kind": "Function" }, + { "name": "ItemHighlightedState", "kind": "TypeAlias" }, { "name": "LayoutConfig", "kind": "TypeAlias" }, { "name": "legendClasses", "kind": "Variable" }, { "name": "LegendRendererProps", "kind": "Interface" }, @@ -265,9 +284,14 @@ { "name": "useChartId", "kind": "Function" }, { "name": "useDrawingArea", "kind": "Function" }, { "name": "useGaugeState", "kind": "Function" }, + { "name": "useHighlighted", "kind": "Function" }, + { "name": "useItemHighlighted", "kind": "Function" }, { "name": "useSvgRef", "kind": "Function" }, + { "name": "useXColorScale", "kind": "Function" }, { "name": "useXScale", "kind": "Function" }, + { "name": "useYColorScale", "kind": "Function" }, { "name": "useYScale", "kind": "Function" }, + { "name": "useZColorScale", "kind": "Function" }, { "name": "ZAxisContextProvider", "kind": "Function" }, { "name": "ZAxisContextProviderProps", "kind": "TypeAlias" } ] diff --git a/scripts/x-data-grid-premium.exports.json b/scripts/x-data-grid-premium.exports.json index 9723176f8754..8958c94d078b 100644 --- a/scripts/x-data-grid-premium.exports.json +++ b/scripts/x-data-grid-premium.exports.json @@ -175,6 +175,7 @@ { "name": "GridColumnHeaderSeparatorSides", "kind": "Enum" }, { "name": "GridColumnHeaderSortIcon", "kind": "Variable" }, { "name": "GridColumnHeaderSortIconProps", "kind": "Interface" }, + { "name": "GridColumnHeadersProps", "kind": "Interface" }, { "name": "GridColumnHeaderTitle", "kind": "Function" }, { "name": "GridColumnHeaderTitleProps", "kind": "Interface" }, { "name": "GridColumnIcon", "kind": "Variable" }, diff --git a/scripts/x-data-grid-pro.exports.json b/scripts/x-data-grid-pro.exports.json index 314428c421b6..6a7d1870c023 100644 --- a/scripts/x-data-grid-pro.exports.json +++ b/scripts/x-data-grid-pro.exports.json @@ -151,6 +151,7 @@ { "name": "GridColumnHeaderSeparatorSides", "kind": "Enum" }, { "name": "GridColumnHeaderSortIcon", "kind": "Variable" }, { "name": "GridColumnHeaderSortIconProps", "kind": "Interface" }, + { "name": "GridColumnHeadersProps", "kind": "Interface" }, { "name": "GridColumnHeaderTitle", "kind": "Function" }, { "name": "GridColumnHeaderTitleProps", "kind": "Interface" }, { "name": "GridColumnIcon", "kind": "Variable" }, diff --git a/scripts/x-data-grid.exports.json b/scripts/x-data-grid.exports.json index 16a74ef16850..c23d717cd34b 100644 --- a/scripts/x-data-grid.exports.json +++ b/scripts/x-data-grid.exports.json @@ -143,6 +143,7 @@ { "name": "GridColumnHeaderSeparatorSides", "kind": "Enum" }, { "name": "GridColumnHeaderSortIcon", "kind": "Variable" }, { "name": "GridColumnHeaderSortIconProps", "kind": "Interface" }, + { "name": "GridColumnHeadersProps", "kind": "Interface" }, { "name": "GridColumnHeaderTitle", "kind": "Function" }, { "name": "GridColumnHeaderTitleProps", "kind": "Interface" }, { "name": "GridColumnIcon", "kind": "Variable" }, diff --git a/test/e2e/fixtures/DatePicker/SingleDesktopDateRangePickerWithTZ.tsx b/test/e2e/fixtures/DatePicker/SingleDesktopDateRangePickerWithTZ.tsx new file mode 100644 index 000000000000..0f920bf2aa9b --- /dev/null +++ b/test/e2e/fixtures/DatePicker/SingleDesktopDateRangePickerWithTZ.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; +import dayjs from 'dayjs'; +import utc from 'dayjs/plugin/utc'; +import timezone from 'dayjs/plugin/timezone'; +import { DateRangePicker } from '@mui/x-date-pickers-pro/DateRangePicker'; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import { SingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; + +dayjs.extend(utc); +dayjs.extend(timezone); + +export default function BasicDesktopDateRangePicker() { + return ( + <LocalizationProvider dateAdapter={AdapterDayjs}> + <DateRangePicker + enableAccessibleFieldDOMStructure + slots={{ field: SingleInputDateRangeField }} + defaultValue={[dayjs('2024-04-12'), dayjs('2024-04-14')]} + /> + </LocalizationProvider> + ); +} diff --git a/test/e2e/index.test.ts b/test/e2e/index.test.ts index 3aded68ad784..ea00f52f8c1c 100644 --- a/test/e2e/index.test.ts +++ b/test/e2e/index.test.ts @@ -1009,6 +1009,28 @@ async function initializeEnvironment( expect(await page.getByRole('textbox').inputValue()).to.equal('04/11/2022 – 04/13/2022'); }); + + it('should not change timezone when changing the start date from non DST to DST', async () => { + // firefox in CI is not happy with this test + if (browserType.name() === 'firefox') { + return; + } + const thrownErrors: string[] = []; + context.on('weberror', (webError) => { + thrownErrors.push(webError.error().message); + }); + + await renderFixture('DatePicker/SingleDesktopDateRangePickerWithTZ'); + + // open the picker + await page.getByRole('group').click(); + + await page.getByRole('spinbutton', { name: 'Month' }).first().press('ArrowDown'); + + expect(thrownErrors).not.to.contain( + 'MUI X: The timezone of the start and the end date should be the same.', + ); + }); }); }); }); diff --git a/test/karma.conf.js b/test/karma.conf.js index 25c0eb8f68ec..483d8e8ca368 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -54,7 +54,7 @@ module.exports = function setKarmaConfig(config) { devtool: CI ? 'inline-source-map' : 'eval-source-map', target: 'web', optimization: { - nodeEnv: false, // https://twitter.com/wsokra/status/1378643098893443072 + nodeEnv: false, // https://x.com/wsokra/status/1378643098893443072 }, plugins: [ new webpack.DefinePlugin({ diff --git a/test/karma.tests.js b/test/karma.tests.js index c701b7a5916d..e041b5849b8c 100644 --- a/test/karma.tests.js +++ b/test/karma.tests.js @@ -1,5 +1,5 @@ /* eslint-env mocha */ -import '@mui-internal/test-utils/setupKarma'; +import '@mui/internal-test-utils/setupKarma'; import './utils/init'; import { createXMochaHooks } from './utils/mochaHooks'; diff --git a/test/package.json b/test/package.json index fe176bc1c9f0..2034242eb797 100644 --- a/test/package.json +++ b/test/package.json @@ -6,18 +6,19 @@ "typescript": "tsc -p tsconfig.json" }, "devDependencies": { - "@babel/runtime": "^7.24.5", + "@babel/runtime": "^7.24.6", "@emotion/cache": "^11.11.0", "@emotion/react": "^11.11.4", - "@mui/material": "^5.15.14", + "@mui/material": "^5.15.19", "@mui/x-data-grid": "workspace:*", "@mui/x-data-grid-pro": "workspace:*", "@mui/x-date-pickers": "workspace:*", "@mui/x-date-pickers-pro": "workspace:*", "@mui/x-license": "workspace:*", "@react-spring/web": "^9.7.3", - "@playwright/test": "^1.43.1", + "@playwright/test": "^1.44.1", "@types/chai": "^4.3.16", + "@types/karma": "^6.3.8", "@types/moment-jalaali": "^0.7.9", "@types/prop-types": "^15.7.12", "@types/react": "^18.2.60", @@ -28,8 +29,8 @@ "prop-types": "^15.8.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.22.3", - "stylis": "^4.3.1", + "react-router-dom": "^6.23.1", + "stylis": "^4.3.2", "stylis-plugin-rtl": "^2.1.1" } } diff --git a/test/tsconfig.json b/test/tsconfig.json index 839ef704ade6..49092d4a0907 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -2,10 +2,12 @@ "extends": "../tsconfig.json", "compilerOptions": { "types": [ - "mocha", + "@mui/internal-test-utils/initMatchers", "@mui/material/themeCssVarsAugmentation", - "dayjs/plugin/utc.d.ts", + "chai-dom", "dayjs/plugin/timezone.d.ts", + "dayjs/plugin/utc.d.ts", + "mocha", "moment-timezone" ] }, diff --git a/test/utils/describeConformance.ts b/test/utils/describeConformance.ts index 872a5c803551..85129ca7a171 100644 --- a/test/utils/describeConformance.ts +++ b/test/utils/describeConformance.ts @@ -1,7 +1,7 @@ import { describeConformance as baseDescribeConformance, ConformanceOptions, -} from '@mui-internal/test-utils'; +} from '@mui/internal-test-utils'; import { ThemeProvider, createTheme } from '@mui/material/styles'; export function describeConformance( diff --git a/test/utils/helperFn.ts b/test/utils/helperFn.ts index 76f7f2a54e01..068d37943e5d 100644 --- a/test/utils/helperFn.ts +++ b/test/utils/helperFn.ts @@ -1,5 +1,5 @@ import { spy } from 'sinon'; -import { act, screen } from '@mui-internal/test-utils'; +import { act, screen } from '@mui/internal-test-utils'; import { gridClasses } from '@mui/x-data-grid'; import { unwrapPrivateAPI } from '@mui/x-data-grid/internals'; import type { GridApiCommon } from '@mui/x-data-grid/models/api/gridApiCommon'; diff --git a/test/utils/init.ts b/test/utils/init.ts index 9691ca052c83..3ab7c9cbc25c 100644 --- a/test/utils/init.ts +++ b/test/utils/init.ts @@ -1,4 +1,4 @@ -import '@mui-internal/test-utils/init'; +import '@mui/internal-test-utils/init'; import './licenseRelease'; import './addChaiAssertions'; import './setupPickers'; diff --git a/test/utils/pickers/calendar.ts b/test/utils/pickers/calendar.ts index 00d90d8d5059..c06241ae0dc1 100644 --- a/test/utils/pickers/calendar.ts +++ b/test/utils/pickers/calendar.ts @@ -1,4 +1,4 @@ -import { fireEvent, createEvent } from '@mui-internal/test-utils'; +import { fireEvent, createEvent } from '@mui/internal-test-utils'; export const rangeCalendarDayTouches = { '2018-01-01': { diff --git a/test/utils/pickers/clock.ts b/test/utils/pickers/clock.ts index c2f00bcc1f3a..36800671c066 100644 --- a/test/utils/pickers/clock.ts +++ b/test/utils/pickers/clock.ts @@ -1,6 +1,6 @@ import { CLOCK_WIDTH } from '@mui/x-date-pickers/TimeClock/shared'; import { clockPointerClasses } from '@mui/x-date-pickers/TimeClock'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; export const getClockTouchEvent = ( value: number | string, diff --git a/test/utils/pickers/createPickerRenderer.tsx b/test/utils/pickers/createPickerRenderer.tsx index 7d13e994f8cd..6013582361c5 100644 --- a/test/utils/pickers/createPickerRenderer.tsx +++ b/test/utils/pickers/createPickerRenderer.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; -import { createRenderer, CreateRendererOptions, RenderOptions } from '@mui-internal/test-utils'; +import { createRenderer, CreateRendererOptions, RenderOptions } from '@mui/internal-test-utils'; import { AdapterClassToUse, AdapterName, adapterToUse, availableAdapters } from './adapters'; interface CreatePickerRendererOptions extends CreateRendererOptions { diff --git a/test/utils/pickers/describeAdapters/describeAdapters.ts b/test/utils/pickers/describeAdapters/describeAdapters.ts index c60e40927456..87b2bcf67f80 100644 --- a/test/utils/pickers/describeAdapters/describeAdapters.ts +++ b/test/utils/pickers/describeAdapters/describeAdapters.ts @@ -1,7 +1,7 @@ import * as React from 'react'; import moment from 'moment'; import momentTZ from 'moment-timezone'; -import createDescribe from '@mui-internal/test-utils/createDescribe'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; import { AdapterName, buildFieldInteractions, diff --git a/test/utils/pickers/describeGregorianAdapter/describeGregorianAdapter.ts b/test/utils/pickers/describeGregorianAdapter/describeGregorianAdapter.ts index 09aa0c0a3ffc..be64e37fa3af 100644 --- a/test/utils/pickers/describeGregorianAdapter/describeGregorianAdapter.ts +++ b/test/utils/pickers/describeGregorianAdapter/describeGregorianAdapter.ts @@ -1,4 +1,4 @@ -import createDescribe from '@mui-internal/test-utils/createDescribe'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; import { MuiPickersAdapter, PickerValidDate } from '@mui/x-date-pickers/models'; import { testCalculations } from './testCalculations'; import { testLocalization } from './testLocalization'; diff --git a/test/utils/pickers/describeGregorianAdapter/testCalculations.ts b/test/utils/pickers/describeGregorianAdapter/testCalculations.ts index a8439902d70c..90b8f60581e9 100644 --- a/test/utils/pickers/describeGregorianAdapter/testCalculations.ts +++ b/test/utils/pickers/describeGregorianAdapter/testCalculations.ts @@ -118,6 +118,12 @@ export const testCalculations: DescribeGregorianAdapterTestSuite = ({ ).to.be.lessThan(5); } }); + + it('should work without args', () => { + const date = adapter.date().valueOf(); + + expect(Math.abs(date - Date.now())).to.be.lessThan(5); + }); }); it('Method: getTimezone', () => { diff --git a/test/utils/pickers/describeHijriAdapter/describeHijriAdapter.ts b/test/utils/pickers/describeHijriAdapter/describeHijriAdapter.ts index ff5ecb2af047..8f5c520b3e15 100644 --- a/test/utils/pickers/describeHijriAdapter/describeHijriAdapter.ts +++ b/test/utils/pickers/describeHijriAdapter/describeHijriAdapter.ts @@ -1,4 +1,4 @@ -import createDescribe from '@mui-internal/test-utils/createDescribe'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; import { MuiPickersAdapter, PickerValidDate } from '@mui/x-date-pickers/models'; import { testCalculations } from './testCalculations'; import { testLocalization } from './testLocalization'; diff --git a/test/utils/pickers/describeJalaliAdapter/describeJalaliAdapter.ts b/test/utils/pickers/describeJalaliAdapter/describeJalaliAdapter.ts index a09f6257d486..15c7968352d7 100644 --- a/test/utils/pickers/describeJalaliAdapter/describeJalaliAdapter.ts +++ b/test/utils/pickers/describeJalaliAdapter/describeJalaliAdapter.ts @@ -1,4 +1,4 @@ -import createDescribe from '@mui-internal/test-utils/createDescribe'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; import { MuiPickersAdapter, PickerValidDate } from '@mui/x-date-pickers/models'; import { testCalculations } from './testCalculations'; import { testLocalization } from './testLocalization'; diff --git a/test/utils/pickers/describePicker/describePicker.tsx b/test/utils/pickers/describePicker/describePicker.tsx index aee9affd8606..4332a4c15710 100644 --- a/test/utils/pickers/describePicker/describePicker.tsx +++ b/test/utils/pickers/describePicker/describePicker.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, fireEvent, createDescribe } from '@mui-internal/test-utils'; +import { screen, fireEvent, createDescribe } from '@mui/internal-test-utils'; import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon'; import { DescribePickerOptions } from './describePicker.types'; @@ -148,7 +148,7 @@ function innerDescribePicker(ElementToTest: React.ElementType, options: Describe } }); - it.skip('should render toolbar when `hidden` is `false`', function test() { + it('should render toolbar when `hidden` is `false`', function test() { if (hasNoView) { this.skip(); } @@ -178,6 +178,34 @@ function innerDescribePicker(ElementToTest: React.ElementType, options: Describe expect(screen.queryByTestId('pickers-toolbar')).to.equal(null); }); }); + + describe('prop: disableOpenPicker', () => { + it('should not render the open picker button, but still render the picker if its open', function test() { + if (variant === 'static') { + this.skip(); + } + + render( + <ElementToTest + disableOpenPicker + {...propsToOpen} + slotProps={{ + layout: { + classes: { + contentWrapper: 'test-pickers-content-wrapper', + }, + }, + }} + />, + ); + + expect(screen.queryByRole('button', { name: /Choose/ })).to.equal(null); + // check if anything has been rendered inside the layout content wrapper + expect(document.querySelector('.test-pickers-content-wrapper')?.hasChildNodes()).to.equal( + true, + ); + }); + }); } /** diff --git a/test/utils/pickers/describePicker/describePicker.types.ts b/test/utils/pickers/describePicker/describePicker.types.ts index 0d620ec32abc..342ec13c02cc 100644 --- a/test/utils/pickers/describePicker/describePicker.types.ts +++ b/test/utils/pickers/describePicker/describePicker.types.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { MuiRenderResult } from '@mui-internal/test-utils/createRenderer'; +import { MuiRenderResult } from '@mui/internal-test-utils/createRenderer'; export interface DescribePickerOptions { fieldType: 'single-input' | 'multi-input'; diff --git a/test/utils/pickers/describeRangeValidation/describeRangeValidation.tsx b/test/utils/pickers/describeRangeValidation/describeRangeValidation.tsx index c54414e161f6..c416657ce2e6 100644 --- a/test/utils/pickers/describeRangeValidation/describeRangeValidation.tsx +++ b/test/utils/pickers/describeRangeValidation/describeRangeValidation.tsx @@ -1,6 +1,6 @@ /* eslint-env mocha */ import * as React from 'react'; -import createDescribe from '@mui-internal/test-utils/createDescribe'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; import { testDayViewRangeValidation } from './testDayViewRangeValidation'; import { testTextFieldRangeValidation } from './testTextFieldRangeValidation'; import { DescribeRangeValidationInputOptions } from './describeRangeValidation.types'; diff --git a/test/utils/pickers/describeRangeValidation/testDayViewRangeValidation.tsx b/test/utils/pickers/describeRangeValidation/testDayViewRangeValidation.tsx index fc1a3865ab93..4a3c51de3d09 100644 --- a/test/utils/pickers/describeRangeValidation/testDayViewRangeValidation.tsx +++ b/test/utils/pickers/describeRangeValidation/testDayViewRangeValidation.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { adapterToUse } from 'test/utils/pickers'; const isDisabled = (el: HTMLElement) => el.getAttribute('disabled') !== null; diff --git a/test/utils/pickers/describeRangeValidation/testTextFieldKeyboardRangeValidation.tsx b/test/utils/pickers/describeRangeValidation/testTextFieldKeyboardRangeValidation.tsx index 23095de081ea..c25c09224a9a 100644 --- a/test/utils/pickers/describeRangeValidation/testTextFieldKeyboardRangeValidation.tsx +++ b/test/utils/pickers/describeRangeValidation/testTextFieldKeyboardRangeValidation.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; import { adapterToUse, getAllFieldInputRoot } from 'test/utils/pickers'; -import { act } from '@mui-internal/test-utils/createRenderer'; +import { act } from '@mui/internal-test-utils/createRenderer'; import { DescribeRangeValidationTestSuite } from './describeRangeValidation.types'; const testInvalidStatus = (expectedAnswer: boolean[], isSingleInput?: boolean) => { diff --git a/test/utils/pickers/describeValidation/describeValidation.ts b/test/utils/pickers/describeValidation/describeValidation.ts index 2804f418ee9c..3bf0fae984d6 100644 --- a/test/utils/pickers/describeValidation/describeValidation.ts +++ b/test/utils/pickers/describeValidation/describeValidation.ts @@ -1,6 +1,6 @@ /* eslint-env mocha */ import * as React from 'react'; -import createDescribe from '@mui-internal/test-utils/createDescribe'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; import { testDayViewValidation } from './testDayViewValidation'; import { testMonthViewValidation } from './testMonthViewValidation'; import { testTextFieldValidation } from './testTextFieldValidation'; diff --git a/test/utils/pickers/describeValidation/describeValidation.types.ts b/test/utils/pickers/describeValidation/describeValidation.types.ts index 8c6c60dea047..66d1f7720def 100644 --- a/test/utils/pickers/describeValidation/describeValidation.types.ts +++ b/test/utils/pickers/describeValidation/describeValidation.types.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { MuiRenderResult, createRenderer } from '@mui-internal/test-utils/createRenderer'; +import { MuiRenderResult, createRenderer } from '@mui/internal-test-utils/createRenderer'; import { DateOrTimeView } from '@mui/x-date-pickers/models'; import { PickerComponentFamily } from '../describe.types'; diff --git a/test/utils/pickers/describeValidation/testDayViewValidation.tsx b/test/utils/pickers/describeValidation/testDayViewValidation.tsx index 30e40ea1fd08..78338bff92d8 100644 --- a/test/utils/pickers/describeValidation/testDayViewValidation.tsx +++ b/test/utils/pickers/describeValidation/testDayViewValidation.tsx @@ -1,6 +1,6 @@ import { expect } from 'chai'; import * as React from 'react'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { adapterToUse } from 'test/utils/pickers'; import { DescribeValidationTestSuite } from './describeValidation.types'; diff --git a/test/utils/pickers/describeValidation/testMinutesViewValidation.tsx b/test/utils/pickers/describeValidation/testMinutesViewValidation.tsx index c2298e4ec26d..b1cba8a58f2e 100644 --- a/test/utils/pickers/describeValidation/testMinutesViewValidation.tsx +++ b/test/utils/pickers/describeValidation/testMinutesViewValidation.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { adapterToUse } from 'test/utils/pickers'; import { DescribeValidationTestSuite } from './describeValidation.types'; diff --git a/test/utils/pickers/describeValidation/testMonthViewValidation.tsx b/test/utils/pickers/describeValidation/testMonthViewValidation.tsx index 29f8e73c24b6..96045d7e8eb0 100644 --- a/test/utils/pickers/describeValidation/testMonthViewValidation.tsx +++ b/test/utils/pickers/describeValidation/testMonthViewValidation.tsx @@ -1,6 +1,6 @@ import { expect } from 'chai'; import * as React from 'react'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { adapterToUse } from 'test/utils/pickers'; import { DescribeValidationTestSuite } from './describeValidation.types'; diff --git a/test/utils/pickers/describeValidation/testYearViewValidation.tsx b/test/utils/pickers/describeValidation/testYearViewValidation.tsx index 3789b83fcddb..eb593cadbcef 100644 --- a/test/utils/pickers/describeValidation/testYearViewValidation.tsx +++ b/test/utils/pickers/describeValidation/testYearViewValidation.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { expect } from 'chai'; -import { screen } from '@mui-internal/test-utils'; +import { screen } from '@mui/internal-test-utils'; import { adapterToUse } from 'test/utils/pickers'; import { DescribeValidationTestSuite } from './describeValidation.types'; diff --git a/test/utils/pickers/describeValue/describeValue.tsx b/test/utils/pickers/describeValue/describeValue.tsx index f2ab91a3aea3..26d42b7204c7 100644 --- a/test/utils/pickers/describeValue/describeValue.tsx +++ b/test/utils/pickers/describeValue/describeValue.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import createDescribe from '@mui-internal/test-utils/createDescribe'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; import { BasePickerInputProps, UsePickerValueNonStaticProps } from '@mui/x-date-pickers/internals'; import { buildFieldInteractions, BuildFieldInteractionsResponse } from 'test/utils/pickers'; import { PickerComponentFamily } from '../describe.types'; diff --git a/test/utils/pickers/describeValue/describeValue.types.ts b/test/utils/pickers/describeValue/describeValue.types.ts index d5aea04bf040..27332ec2b719 100644 --- a/test/utils/pickers/describeValue/describeValue.types.ts +++ b/test/utils/pickers/describeValue/describeValue.types.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { createRenderer, MuiRenderResult } from '@mui-internal/test-utils/createRenderer'; +import { createRenderer, MuiRenderResult } from '@mui/internal-test-utils/createRenderer'; import { BuildFieldInteractionsResponse, FieldPressCharacter, diff --git a/test/utils/pickers/describeValue/testControlledUnControlled.tsx b/test/utils/pickers/describeValue/testControlledUnControlled.tsx index 493b9c66cce4..ae4e204f8252 100644 --- a/test/utils/pickers/describeValue/testControlledUnControlled.tsx +++ b/test/utils/pickers/describeValue/testControlledUnControlled.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { inputBaseClasses } from '@mui/material/InputBase'; import { getAllFieldInputRoot, diff --git a/test/utils/pickers/describeValue/testPickerActionBar.tsx b/test/utils/pickers/describeValue/testPickerActionBar.tsx index c58458a91776..adbb86a48967 100644 --- a/test/utils/pickers/describeValue/testPickerActionBar.tsx +++ b/test/utils/pickers/describeValue/testPickerActionBar.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { adapterToUse, getExpectedOnChangeCount, diff --git a/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx b/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx index d6ac1bcd576c..b38b5a9d2bd3 100644 --- a/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx +++ b/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { getExpectedOnChangeCount, getFieldInputRoot, openPicker } from 'test/utils/pickers'; import { DescribeValueTestSuite } from './describeValue.types'; diff --git a/test/utils/pickers/describeValue/testShortcuts.tsx b/test/utils/pickers/describeValue/testShortcuts.tsx index 56ffe7449613..bd7617b6dd98 100644 --- a/test/utils/pickers/describeValue/testShortcuts.tsx +++ b/test/utils/pickers/describeValue/testShortcuts.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; import { expectPickerChangeHandlerValue } from 'test/utils/pickers'; -import { userEvent, screen } from '@mui-internal/test-utils'; +import { userEvent, screen } from '@mui/internal-test-utils'; import { DescribeValueTestSuite } from './describeValue.types'; export const testShortcuts: DescribeValueTestSuite<any, 'picker'> = (ElementToTest, options) => { diff --git a/test/utils/pickers/fields.tsx b/test/utils/pickers/fields.tsx index 291971368603..fe3222a0c397 100644 --- a/test/utils/pickers/fields.tsx +++ b/test/utils/pickers/fields.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { createTheme, ThemeProvider } from '@mui/material/styles'; -import { createRenderer, screen, userEvent, act, fireEvent } from '@mui-internal/test-utils'; +import { createRenderer, screen, userEvent, act, fireEvent } from '@mui/internal-test-utils'; import { FieldRef, FieldSection, FieldSectionType } from '@mui/x-date-pickers/models'; import { pickersSectionListClasses } from '@mui/x-date-pickers/PickersSectionList'; import { pickersInputBaseClasses } from '@mui/x-date-pickers/PickersTextField'; diff --git a/test/utils/pickers/openPicker.ts b/test/utils/pickers/openPicker.ts index 2de6210fca38..ac9e934c55ea 100644 --- a/test/utils/pickers/openPicker.ts +++ b/test/utils/pickers/openPicker.ts @@ -1,4 +1,4 @@ -import { screen, userEvent } from '@mui-internal/test-utils'; +import { screen, userEvent } from '@mui/internal-test-utils'; import { getFieldSectionsContainer } from 'test/utils/pickers/fields'; import { pickersInputBaseClasses } from '@mui/x-date-pickers/PickersTextField'; diff --git a/test/utils/pickers/viewHandlers.ts b/test/utils/pickers/viewHandlers.ts index 689589174033..cfc23d1b4d90 100644 --- a/test/utils/pickers/viewHandlers.ts +++ b/test/utils/pickers/viewHandlers.ts @@ -1,4 +1,4 @@ -import { fireTouchChangedEvent, userEvent, screen } from '@mui-internal/test-utils'; +import { fireTouchChangedEvent, userEvent, screen } from '@mui/internal-test-utils'; import { getClockTouchEvent, formatFullTimeValue } from 'test/utils/pickers'; import { MuiPickersAdapter, TimeView } from '@mui/x-date-pickers/models'; import { formatMeridiem } from '@mui/x-date-pickers/internals'; diff --git a/test/utils/setupJSDOM.js b/test/utils/setupJSDOM.js index c99ab9ee3407..f4bccd2b204b 100644 --- a/test/utils/setupJSDOM.js +++ b/test/utils/setupJSDOM.js @@ -1,4 +1,4 @@ -const coreExports = require('@mui-internal/test-utils/setupJSDOM'); +const coreExports = require('@mui/internal-test-utils/setupJSDOM'); require('./licenseRelease'); require('./addChaiAssertions'); diff --git a/test/utils/tree-view/describeTreeView/describeTreeView.tsx b/test/utils/tree-view/describeTreeView/describeTreeView.tsx index 309fd9f5634d..82feb196b543 100644 --- a/test/utils/tree-view/describeTreeView/describeTreeView.tsx +++ b/test/utils/tree-view/describeTreeView/describeTreeView.tsx @@ -1,32 +1,32 @@ import * as React from 'react'; -import createDescribe from '@mui-internal/test-utils/createDescribe'; -import { createRenderer, ErrorBoundary } from '@mui-internal/test-utils'; +import createDescribe from '@mui/internal-test-utils/createDescribe'; +import { createRenderer, ErrorBoundary } from '@mui/internal-test-utils'; import { RichTreeView } from '@mui/x-tree-view/RichTreeView'; import { RichTreeViewPro } from '@mui/x-tree-view-pro/RichTreeViewPro'; import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem'; import { TreeItem2 } from '@mui/x-tree-view/TreeItem2'; import { TreeViewAnyPluginSignature, TreeViewPublicAPI } from '@mui/x-tree-view/internals/models'; -import { MuiRenderResult } from '@mui-internal/test-utils/createRenderer'; +import { MuiRenderResult } from '@mui/internal-test-utils/createRenderer'; import { DescribeTreeViewTestRunner, DescribeTreeViewRenderer, - DescribeTreeViewRendererReturnValue, + DescribeTreeViewJSXRenderer, DescribeTreeViewItem, + DescribeTreeViewRendererUtils, } from './describeTreeView.types'; -const innerDescribeTreeView = <TPlugins extends TreeViewAnyPluginSignature[]>( +const innerDescribeTreeView = <TSignatures extends TreeViewAnyPluginSignature[]>( message: string, - testRunner: DescribeTreeViewTestRunner<TPlugins>, + testRunner: DescribeTreeViewTestRunner<TSignatures>, ): void => { const { render } = createRenderer(); - const getUtils = ( - result: MuiRenderResult, - ): Omit<DescribeTreeViewRendererReturnValue<TPlugins>, 'setProps' | 'setItems' | 'apiRef'> => { + const getUtils = (result: MuiRenderResult): DescribeTreeViewRendererUtils => { const getRoot = () => result.getByRole('tree'); - const getAllItemRoots = () => result.queryAllByRole('treeitem'); + const getAllTreeItemIds = () => + result.queryAllByRole('treeitem').map((item) => item.dataset.testid!); const getFocusedItemId = () => { const activeElement = document.activeElement; @@ -58,9 +58,15 @@ const innerDescribeTreeView = <TPlugins extends TreeViewAnyPluginSignature[]>( const isItemSelected = (id: string) => getItemRoot(id).getAttribute('aria-selected') === 'true'; + const getSelectedTreeItems = () => + result + .queryAllByRole('treeitem') + .filter((item) => item.getAttribute('aria-selected') === 'true') + .map((item) => item.dataset.testid!); + return { getRoot, - getAllItemRoots, + getAllTreeItemIds, getFocusedItemId, getItemRoot, getItemContent, @@ -70,14 +76,20 @@ const innerDescribeTreeView = <TPlugins extends TreeViewAnyPluginSignature[]>( getItemIconContainer, isItemExpanded, isItemSelected, + getSelectedTreeItems, }; }; + const jsxRenderer: DescribeTreeViewJSXRenderer = (element) => { + const result = render(element); + return getUtils(result); + }; + const createRendererForComponentWithItemsProp = ( TreeViewComponent: typeof RichTreeView, TreeItemComponent: typeof TreeItem | typeof TreeItem2, ) => { - const wrappedRenderer: DescribeTreeViewRenderer<TPlugins> = ({ + const objectRenderer: DescribeTreeViewRenderer<TSignatures> = ({ items: rawItems, withErrorBoundary, slotProps, @@ -120,19 +132,22 @@ const innerDescribeTreeView = <TPlugins extends TreeViewAnyPluginSignature[]>( return { setProps: result.setProps, setItems: (newItems) => result.setProps({ items: newItems }), - apiRef: apiRef as unknown as { current: TreeViewPublicAPI<TPlugins> }, + apiRef: apiRef as unknown as { current: TreeViewPublicAPI<TSignatures> }, ...getUtils(result), }; }; - return wrappedRenderer; + return { + render: objectRenderer, + renderFromJSX: jsxRenderer, + }; }; - const createRendererForComponentWithJSXItems = ( + const createRenderersForComponentWithJSXItems = ( TreeViewComponent: typeof SimpleTreeView, TreeItemComponent: typeof TreeItem | typeof TreeItem2, ) => { - const wrappedRenderer: DescribeTreeViewRenderer<TPlugins> = ({ + const objectRenderer: DescribeTreeViewRenderer<TSignatures> = ({ items: rawItems, withErrorBoundary, slots, @@ -167,80 +182,95 @@ const innerDescribeTreeView = <TPlugins extends TreeViewAnyPluginSignature[]>( return { setProps: result.setProps, setItems: (newItems) => result.setProps({ children: newItems.map(renderItem) }), - apiRef: apiRef as unknown as { current: TreeViewPublicAPI<TPlugins> }, + apiRef: apiRef as unknown as { current: TreeViewPublicAPI<TSignatures> }, ...getUtils(result), }; }; - return wrappedRenderer; + return { + render: objectRenderer, + renderFromJSX: jsxRenderer, + }; }; describe(message, () => { describe('RichTreeView + TreeItem', () => { testRunner({ - render: createRendererForComponentWithItemsProp(RichTreeView, TreeItem), + ...createRendererForComponentWithItemsProp(RichTreeView, TreeItem), setup: 'RichTreeView + TreeItem', - treeViewComponent: 'RichTreeView', - treeItemComponent: 'TreeItem', + treeViewComponentName: 'RichTreeView', + treeItemComponentName: 'TreeItem', + TreeViewComponent: RichTreeView, + TreeItemComponent: TreeItem, }); }); describe('RichTreeView + TreeItem2', () => { testRunner({ - render: createRendererForComponentWithItemsProp(RichTreeView, TreeItem2), + ...createRendererForComponentWithItemsProp(RichTreeView, TreeItem2), setup: 'RichTreeView + TreeItem2', - treeViewComponent: 'RichTreeView', - treeItemComponent: 'TreeItem2', + treeViewComponentName: 'RichTreeView', + treeItemComponentName: 'TreeItem2', + TreeViewComponent: RichTreeView, + TreeItemComponent: TreeItem2, }); }); describe('RichTreeViewPro + TreeItem', () => { testRunner({ - render: createRendererForComponentWithItemsProp(RichTreeViewPro, TreeItem), + ...createRendererForComponentWithItemsProp(RichTreeViewPro, TreeItem), setup: 'RichTreeViewPro + TreeItem', - treeViewComponent: 'RichTreeViewPro', - treeItemComponent: 'TreeItem', + treeViewComponentName: 'RichTreeViewPro', + treeItemComponentName: 'TreeItem', + TreeViewComponent: RichTreeViewPro, + TreeItemComponent: TreeItem, }); }); describe('RichTreeViewPro + TreeItem2', () => { testRunner({ - render: createRendererForComponentWithItemsProp(RichTreeViewPro, TreeItem2), + ...createRendererForComponentWithItemsProp(RichTreeViewPro, TreeItem2), setup: 'RichTreeViewPro + TreeItem2', - treeViewComponent: 'RichTreeViewPro', - treeItemComponent: 'TreeItem2', + treeViewComponentName: 'RichTreeViewPro', + treeItemComponentName: 'TreeItem2', + TreeViewComponent: RichTreeViewPro, + TreeItemComponent: TreeItem2, }); }); describe('SimpleTreeView + TreeItem', () => { testRunner({ - render: createRendererForComponentWithJSXItems(SimpleTreeView, TreeItem), + ...createRenderersForComponentWithJSXItems(SimpleTreeView, TreeItem), setup: 'SimpleTreeView + TreeItem', - treeViewComponent: 'SimpleTreeView', - treeItemComponent: 'TreeItem', + treeViewComponentName: 'SimpleTreeView', + treeItemComponentName: 'TreeItem', + TreeViewComponent: SimpleTreeView, + TreeItemComponent: TreeItem, }); }); describe('SimpleTreeView + TreeItem2', () => { testRunner({ - render: createRendererForComponentWithJSXItems(SimpleTreeView, TreeItem2), + ...createRenderersForComponentWithJSXItems(SimpleTreeView, TreeItem2), setup: 'SimpleTreeView + TreeItem2', - treeViewComponent: 'SimpleTreeView', - treeItemComponent: 'TreeItem2', + treeViewComponentName: 'SimpleTreeView', + treeItemComponentName: 'TreeItem2', + TreeViewComponent: SimpleTreeView, + TreeItemComponent: TreeItem2, }); }); }); }; -type Params<TPlugins extends TreeViewAnyPluginSignature[]> = [ +type Params<TSignatures extends TreeViewAnyPluginSignature[]> = [ string, - DescribeTreeViewTestRunner<TPlugins>, + DescribeTreeViewTestRunner<TSignatures>, ]; type DescribeTreeView = { - <TPlugins extends TreeViewAnyPluginSignature[]>(...args: Params<TPlugins>): void; - skip: <TPlugins extends TreeViewAnyPluginSignature[]>(...args: Params<TPlugins>) => void; - only: <TPlugins extends TreeViewAnyPluginSignature[]>(...args: Params<TPlugins>) => void; + <TSignatures extends TreeViewAnyPluginSignature[]>(...args: Params<TSignatures>): void; + skip: <TSignatures extends TreeViewAnyPluginSignature[]>(...args: Params<TSignatures>) => void; + only: <TSignatures extends TreeViewAnyPluginSignature[]>(...args: Params<TSignatures>) => void; }; /** diff --git a/test/utils/tree-view/describeTreeView/describeTreeView.types.ts b/test/utils/tree-view/describeTreeView/describeTreeView.types.ts index f9bc6b88f63a..8aff13f693ed 100644 --- a/test/utils/tree-view/describeTreeView/describeTreeView.types.ts +++ b/test/utils/tree-view/describeTreeView/describeTreeView.types.ts @@ -1,33 +1,17 @@ import * as React from 'react'; import { - MergePluginsProperty, + MergeSignaturesProperty, TreeViewAnyPluginSignature, TreeViewPublicAPI, } from '@mui/x-tree-view/internals/models'; import { TreeItemProps } from '@mui/x-tree-view/TreeItem'; import { TreeItem2Props } from '@mui/x-tree-view/TreeItem2'; -export type DescribeTreeViewTestRunner<TPlugins extends TreeViewAnyPluginSignature[]> = ( - params: DescribeTreeViewTestRunnerParams<TPlugins>, +export type DescribeTreeViewTestRunner<TSignatures extends TreeViewAnyPluginSignature[]> = ( + params: DescribeTreeViewTestRunnerParams<TSignatures>, ) => void; -export interface DescribeTreeViewRendererReturnValue< - TPlugins extends TreeViewAnyPluginSignature[], -> { - /** - * Passes new props to the Tree View. - * @param {Partial<TreeViewUsedParams<TPlugin>>} props A subset of the props accepted by the Tree View. - */ - setProps: (props: Partial<MergePluginsProperty<TPlugins, 'params'>>) => void; - /** - * Passes new items to the Tree View. - * @param {readyonly DescribeTreeViewItem[]} items The new items. - */ - setItems: (items: readonly DescribeTreeViewItem[]) => void; - /** - * The ref object that allows Tree View manipulation. - */ - apiRef: { current: TreeViewPublicAPI<TPlugins> }; +export interface DescribeTreeViewRendererUtils { /** * Returns the `root` slot of the Tree View. * @returns {HTMLElement} `root` slot of the Tree View. @@ -40,10 +24,10 @@ export interface DescribeTreeViewRendererReturnValue< */ getFocusedItemId: () => string | null; /** - * Returns the `root` slot of all the items. - * @returns {HTMLElement[]} List of the `root` slot of all the items. + * Returns the item id of all the items currently rendered. + * @returns {HTMLElement[]} List of the item id of all the items currently rendered. */ - getAllItemRoots: () => HTMLElement[]; + getAllTreeItemIds: () => string[]; /** * Returns the `root` slot of the item with the given id. * @param {string} id The id of the item to retrieve. @@ -94,9 +78,33 @@ export interface DescribeTreeViewRendererReturnValue< * @returns {boolean} `true` if the item is selected, `false` otherwise. */ isItemSelected: (id: string) => boolean; + /** + * Returns the item id of all the items currently selected. + * @returns {HTMLElement[]} List of the item id of all the items currently selected. + */ + getSelectedTreeItems: () => string[]; } -export type DescribeTreeViewRenderer<TPlugins extends TreeViewAnyPluginSignature[]> = < +export interface DescribeTreeViewRendererReturnValue< + TSignatures extends TreeViewAnyPluginSignature[], +> extends DescribeTreeViewRendererUtils { + /** + * The ref object that allows Tree View manipulation. + */ + apiRef: { current: TreeViewPublicAPI<TSignatures> }; + /** + * Passes new props to the Tree View. + * @param {Partial<TreeViewUsedParams<TSignatures>>} props A subset of the props accepted by the Tree View. + */ + setProps: (props: Partial<MergeSignaturesProperty<TSignatures, 'params'>>) => void; + /** + * Passes new items to the Tree View. + * @param {readyonly DescribeTreeViewItem[]} items The new items. + */ + setItems: (items: readonly DescribeTreeViewItem[]) => void; +} + +export type DescribeTreeViewRenderer<TSignatures extends TreeViewAnyPluginSignature[]> = < R extends DescribeTreeViewItem, >( params: { @@ -105,24 +113,61 @@ export type DescribeTreeViewRenderer<TPlugins extends TreeViewAnyPluginSignature * If `true`, the Tree View will be wrapped with an error boundary. */ withErrorBoundary?: boolean; - } & Omit<MergePluginsProperty<TPlugins, 'params'>, 'slots' | 'slotProps'> & { - slots?: MergePluginsProperty<TPlugins, 'slots'> & { + } & Omit<MergeSignaturesProperty<TSignatures, 'params'>, 'slots' | 'slotProps'> & { + slots?: MergeSignaturesProperty<TSignatures, 'slots'> & { item?: React.ElementType<TreeItemProps | TreeItem2Props>; }; - slotProps?: MergePluginsProperty<TPlugins, 'slotProps'> & { + slotProps?: MergeSignaturesProperty<TSignatures, 'slotProps'> & { item?: Partial<TreeItemProps> | Partial<TreeItem2Props>; }; }, -) => DescribeTreeViewRendererReturnValue<TPlugins>; +) => DescribeTreeViewRendererReturnValue<TSignatures>; + +export type DescribeTreeViewJSXRenderer = ( + element: React.ReactElement, +) => DescribeTreeViewRendererUtils; -type TreeViewComponent = 'RichTreeView' | 'RichTreeViewPro' | 'SimpleTreeView'; -type TreeItemComponent = 'TreeItem' | 'TreeItem2'; +type TreeViewComponentName = 'RichTreeView' | 'RichTreeViewPro' | 'SimpleTreeView'; +type TreeItemComponentName = 'TreeItem' | 'TreeItem2'; -interface DescribeTreeViewTestRunnerParams<TPlugins extends TreeViewAnyPluginSignature[]> { - render: DescribeTreeViewRenderer<TPlugins>; - setup: `${TreeViewComponent} + ${TreeItemComponent}`; - treeViewComponent: TreeViewComponent; - treeItemComponent: TreeItemComponent; +interface DescribeTreeViewTestRunnerParams<TSignatures extends TreeViewAnyPluginSignature[]> { + /** + * Render the Tree View with its props and items defined as parameters of the "render" function as follows: + * + * ```ts + * const response = render({ + * items: [{ id: '1', children: [] }], + * defaultExpandedItems: ['1'], + * }); + * ``` + */ + render: DescribeTreeViewRenderer<TSignatures>; + /** + * Render the Tree View by passing the JSX element to the renderFromJSX function as follows: + * + * ```tsx + * const response = renderFromJSX( + * <TreeViewComponent defaultExpandedItems={['1']}> + * <TreeItemComponent itemId={'1'} label={'1'} data-testid={'1'}> + * </TreeViewComponent> + * ); + * ``` + * + * `TreeViewComponent` and `TreeItemComponent` are passed as parameters to the `describeTreeView` function. + * The JSX should be adapted depending on the component being rendered. + * + * Warning: This method should only be used if `render` is not compatible with the test being written + * (most likely to advanced testing of the children rendering aspect on the SimpleTreeView) + * + * Warning: If you want to use the utils returned by the `renderFromJSX` function, + * each item should receive a `label` and a `data-testid` equal to its `id`. + */ + renderFromJSX: DescribeTreeViewJSXRenderer; + setup: `${TreeViewComponentName} + ${TreeItemComponentName}`; + treeViewComponentName: TreeViewComponentName; + treeItemComponentName: TreeItemComponentName; + TreeViewComponent: React.ElementType<any>; + TreeItemComponent: React.ElementType<any>; } export interface DescribeTreeViewItem { diff --git a/test/utils/tree-view/describeTreeView/index.ts b/test/utils/tree-view/describeTreeView/index.ts index 4459a7a95583..d545fcba8174 100644 --- a/test/utils/tree-view/describeTreeView/index.ts +++ b/test/utils/tree-view/describeTreeView/index.ts @@ -1,2 +1,5 @@ export { describeTreeView } from './describeTreeView'; -export type { DescribeTreeViewRendererReturnValue } from './describeTreeView.types'; +export type { + DescribeTreeViewRendererReturnValue, + DescribeTreeViewRendererUtils, +} from './describeTreeView.types'; diff --git a/tsconfig.json b/tsconfig.json index d862faac9216..a94255b6f09c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "extends": "@mui/monorepo/tsconfig.json", "compilerOptions": { "lib": ["dom", "dom.iterable", "esnext"], + "moduleResolution": "bundler", // Already tested with eslint "noUnusedLocals": false, "strict": true, @@ -22,6 +23,8 @@ "@mui/x-date-pickers-pro/*": ["./packages/x-date-pickers-pro/src/*"], "@mui/x-charts": ["./packages/x-charts/src"], "@mui/x-charts/*": ["./packages/x-charts/src/*"], + "@mui/x-charts-pro": ["./packages/x-charts-pro/src"], + "@mui/x-charts-pro/*": ["./packages/x-charts-pro/src/*"], "@mui/x-tree-view": ["./packages/x-tree-view/src"], "@mui/x-tree-view/*": ["./packages/x-tree-view/src/*"], "@mui/x-tree-view-pro": ["./packages/x-tree-view-pro/src"], @@ -30,8 +33,6 @@ "@mui/x-license/*": ["./packages/x-license/src/*"], "@mui/docs": ["./node_modules/@mui/monorepo/packages/mui-docs/src"], "@mui/docs/*": ["./node_modules/@mui/monorepo/packages/mui-docs/src/*"], - "@mui-internal/test-utils": ["./node_modules/@mui/monorepo/packages/test-utils/src"], - "@mui-internal/test-utils/*": ["./node_modules/@mui/monorepo/packages/test-utils/src/*"], "@mui-internal/api-docs-builder": ["./node_modules/@mui/monorepo/packages/api-docs-builder"], "@mui-internal/api-docs-builder/*": [ "./node_modules/@mui/monorepo/packages/api-docs-builder/*" diff --git a/webpackBaseConfig.js b/webpackBaseConfig.js index aea83b8b73c2..ab1b0fe068fd 100644 --- a/webpackBaseConfig.js +++ b/webpackBaseConfig.js @@ -15,6 +15,7 @@ module.exports = { '@mui/x-date-pickers': path.resolve(__dirname, './packages/x-date-pickers/src'), '@mui/x-date-pickers-pro': path.resolve(__dirname, './packages/x-date-pickers-pro/src'), '@mui/x-charts': path.resolve(__dirname, './packages/x-charts/src'), + '@mui/x-charts-pro': path.resolve(__dirname, './packages/x-charts-pro/src'), '@mui/x-tree-view': path.resolve(__dirname, './packages/x-tree-view/src'), '@mui/x-tree-view-pro': path.resolve(__dirname, './packages/x-tree-view-pro/src'), '@mui/x-license': path.resolve(__dirname, './packages/x-license/src'), @@ -22,11 +23,6 @@ module.exports = { __dirname, './node_modules/@mui/monorepo/packages/mui-material-nextjs/src', ), - - '@mui-internal/test-utils': path.resolve( - __dirname, - './node_modules/@mui/monorepo/packages/test-utils/src', - ), docs: path.resolve(__dirname, './node_modules/@mui/monorepo/docs'), docsx: path.resolve(__dirname, './docs'), }, @@ -48,10 +44,6 @@ module.exports = { cacheDirectory: true, }, }, - { - test: /\.md$/, - loader: 'raw-loader', - }, { test: /\.(ts|tsx)$/, loader: 'string-replace-loader',