diff --git a/.circleci/config.yml b/.circleci/config.yml index dba93579ac671..96f5576c4b6d8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -232,7 +232,7 @@ jobs: test_browser: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.44.1-focal + - image: mcr.microsoft.com/playwright:v1.49.0-noble steps: - checkout - install_js: @@ -263,7 +263,7 @@ jobs: test_e2e: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.44.1-focal + - image: mcr.microsoft.com/playwright:v1.49.0-noble steps: - checkout - install_js: @@ -274,7 +274,7 @@ jobs: test_e2e_website: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.44.1-focal + - image: mcr.microsoft.com/playwright:v1.49.0-noble steps: - checkout - install_js: @@ -287,11 +287,14 @@ jobs: test_regressions: <<: *default-job docker: - - image: mcr.microsoft.com/playwright:v1.44.1-focal + - image: mcr.microsoft.com/playwright:v1.49.0-noble steps: - checkout - install_js: browsers: true + - run: + name: Install ffmpeg + command: apt update && apt upgrade -y && apt install ffmpeg -y - run: name: Run visual regression tests command: xvfb-run pnpm test:regressions diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 000d98c93ec67..e32d3c4ead251 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -19,7 +19,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/init@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 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@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/analyze@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 diff --git a/.github/workflows/codspeed.yml b/.github/workflows/codspeed.yml index f235c31fa2ba2..9cb68e53e4831 100644 --- a/.github/workflows/codspeed.yml +++ b/.github/workflows/codspeed.yml @@ -50,7 +50,7 @@ jobs: - run: pnpm --filter @mui/x-charts build - run: pnpm --filter @mui/x-charts-pro build - name: Run benchmarks - uses: CodSpeedHQ/action@fa1dcde8d58f2ab0b407a6a24d6cc5a8c1444a8c + uses: CodSpeedHQ/action@513a19673a831f139e8717bf45ead67e47f00044 with: run: pnpm --filter @mui-x-internal/performance-charts test:performance token: ${{ secrets.CODSPEED_TOKEN }} diff --git a/.github/workflows/create-cherry-pick-pr.yml b/.github/workflows/create-cherry-pick-pr.yml index 524b9dc6c78ee..fdfe07ff19c31 100644 --- a/.github/workflows/create-cherry-pick-pr.yml +++ b/.github/workflows/create-cherry-pick-pr.yml @@ -2,6 +2,7 @@ name: Create cherry-pick PR on: pull_request_target: branches: + - 'next' - 'v*.x' - 'master' types: ['closed'] diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 252d4ba7cce10..486634ffc2645 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -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@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: sarif_file: results.sarif diff --git a/CHANGELOG.md b/CHANGELOG.md index cc8faf96a8c0a..eeee378b0778c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,235 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 8.0.0-alpha.3 + +_Dec 5, 2024_ + +We'd like to offer a big thanks to the 9 contributors who made this release possible. Here are some highlights ✨: + +- 💫 Support [Server-side lazy loading](https://mui.com/x/react-data-grid/server-side-data/lazy-loading/) on the Data Grid. Use [data source](https://mui.com/x/react-data-grid/server-side-data/#data-source) to fetch a range of rows on demand and update the rows in the same way as described in [Infinite loading](https://mui.com/x/react-data-grid/row-updates/#infinite-loading) and [Lazy loading](https://mui.com/x/react-data-grid/row-updates/#lazy-loading) without the need to use any additional event listeners and callbacks. +- 🎯 Improved [data caching](https://mui.com/x/react-data-grid/server-side-data/#data-caching). Check out our [recommendations](https://mui.com/x/react-data-grid/server-side-data/#improving-the-cache-hit-rate) for improving the cache hit rate. + +Special thanks go out to the community contributors who have helped make this release possible: +@ihsanberkozcan, @k-rajat19, @perezShaked. +Following are all team members who have contributed to this release: +@arminmeh, @cherniavskii, @flaviendelangle, @JCQuintas, @MBilalShafi, @noraleonte. + + + +### Data Grid + +#### Breaking changes + +- The "Select all" checkbox is now checked when all the selectable rows are selected, ignoring rows that are not selectable because of the `isRowSelectable` prop. +- The `rowPositionsDebounceMs` prop was removed. +- The `gridRowsDataRowIdToIdLookupSelector` selector was removed. Use the `gridRowsLookupSelector` selector in combination with the `getRowId()` API method instead. + ```diff + -const idToIdLookup = gridRowsDataRowIdToIdLookupSelector(apiRef); + -const rowId = idToIdLookup[id] + +const rowsLookup = gridRowsLookupSelector(apiRef); + +const rowId = apiRef.current.getRowId(rowsLookup[id]) + ``` +- The Grid is now more aligned with the WAI-ARIA authoring practices and sets the `role` attribute to `treegrid` if the Data Grid is used with row grouping feature. + +#### `@mui/x-data-grid@8.0.0-alpha.3` + +- [DataGrid] Fix deselection not working with `isRowSelectable` (#15692) @MBilalShafi +- [DataGrid] Make column autosizing work with flex columns (#15465) @cherniavskii +- [DataGrid] Remove `gridRowsDataRowIdToIdLookupSelector` selector (#15698) @arminmeh +- [DataGrid] Remove `rowPositionsDebounceMs` prop (#15482) @k-rajat19 +- [l10n] Improve Hebrew (he-IL) locale (#15699) @perezShaked +- [l10n] Improve Turkish (tr-TR) locale (#15734) @ihsanberkozcan + +#### `@mui/x-data-grid-pro@8.0.0-alpha.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@8.0.0-alpha.3`, plus: + +- [DataGridPro] Cleanup pinned rows on removal (#15697) @cherniavskii +- [DataGridPro] Server-side lazy loading (#13878) @arminmeh + +#### `@mui/x-data-grid-premium@8.0.0-alpha.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@8.0.0-alpha.3`, plus: + +- [DataGridPremium] Remove the `ariaV8` experimental flag (#15694) @arminmeh + +### Date and Time Pickers + +#### Breaking changes + +- The `onOpen()` and `onClose()` methods of the `usePickerContext()` hook have been replaced with a single `setOpen` method — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#usepickercontext). + +#### `@mui/x-date-pickers@8.0.0-alpha.3` + +- [pickers] Replace the `onOpen()` and `onClose()` methods of `usePickerContext()` with a single `setOpen()` method. (#15701) @flaviendelangle + +#### `@mui/x-date-pickers-pro@8.0.0-alpha.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@8.0.0-alpha.3`. + +### Charts + +#### `@mui/x-charts@8.0.0-alpha.3` + +- [charts] Improve SVG `pattern` and `gradient` support (#15720) @JCQuintas + +#### `@mui/x-charts-pro@8.0.0-alpha.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-charts@8.0.0-alpha.3`. + +### Tree View + +#### `@mui/x-tree-view@8.0.0-alpha.3` + +No changes since `@mui/x-tree-view-pro@v8.0.0-alpha.2`. + +#### `@mui/x-tree-view-pro@8.0.0-alpha.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-tree-view@8.0.0-alpha.3`. + +### Docs + +- [docs] Add a customization demo for the Date and Time Pickers overview page (#15118) @noraleonte +- [docs] Fix typo in charts axis documentation (#15743) @JCQuintas +- [docs] Improve SEO titles for the Data Grid (#15695) @MBilalShafi + +### Core + +- [core] Add `@mui/x-tree-view-pro` to `releaseChangelog` (#15316) @flaviendelangle +- [code-infra] Lock file maintenance (#11894) +- [code-infra] Check if `preset-safe` folder exists in codemod test (#15703) @JCQuintas +- [code-infra] Import Pickers `preset-safe` into global codemod config (#15659) @JCQuintas +- [code-infra] Playwright 1.49 (#15493) @JCQuintas +- [test] Force hover in headless Chrome (#15710) @cherniavskii + +## v8.0.0-alpha.2 + +_Nov 29, 2024_ + +We'd like to offer a big thanks to the 17 contributors who made this release possible. Here are some highlights ✨: + +- 👨🏽‍💻 Improve resize performance on the Data Gird. +- `` and `` components are now fully divided — [Learn more](https://next.mui.com/x/react-charts/composition/#overview). +- Users can create their own HTML components using chart data — [Learn more](https://next.mui.com/x/react-charts/components/#html-components). +- 🌍 Improve Spanish, Portuguese, Chinese locales on the Data Grid component. +- 🌍 Improve Dutch locale on the Date and Time Pickers components. +- 🐞 Bugfixes +- 📚 Documentation improvements + +Special thanks go out to the community contributors who have helped make this release possible: +@dloeda, @headironc, @jedesroches, @k-rajat19, @lauri865, @mathzdev, @nphmuller, @zinoroman. +Following are all team members who have contributed to this release: +@arminmeh, @alexfauquette, @cherniavskii, @flaviendelangle, @JCQuintas, @KenanYusuf, @LukasTy, @MBilalShafi, @oliviertassinari. + + + +### Data Grid + +#### Breaking changes + +- The `` component is not exported anymore. +- The `indeterminateCheckboxAction` prop has been removed. Clicking on an indeterminate checkbox "selects" the unselected descendants. +- The `apiRef.current.resize()` method was removed. +- The default value of the `rowSelectionPropagation` prop has been changed to `{ parents: true, descendants: true }` which means that the selection will be propagated to the parents and descendants by default. + To revert to the previous behavior, pass `rowSelectionPropagation` as `{ parents: false, descendants: false }`. +- If `estimatedRowCount` is used, the text provided to the [Table Pagination](/material-ui/api/table-pagination/) component from the Material UI library is updated and requires additional translations. Check the example at the end of [Index-based pagination section](/x/react-data-grid/pagination/#index-based-pagination). + +#### `@mui/x-data-grid@v8.0.0-alpha.2` + +- [DataGrid] Change test dom check from `/jsdom/` to `/jsdom|HappyDOM/`. (#15634) @jedesroches +- [DataGrid] Clear timers on unmount (#15620) @cherniavskii +- [DataGrid] Fix order of spread props on toolbar items (#15556) @KenanYusuf +- [DataGrid] Improve resize performance (#15549) @lauri865 +- [DataGrid] Make estimation label more accurate (#15632) @arminmeh +- [DataGrid] Remove `` export (#15573) @k-rajat19 +- [DataGrid] Remove `indeterminateCheckboxAction` prop (#15522) @MBilalShafi +- [DataGrid] Remove try/catch from `` due to performance issues (#15616) @lauri865 +- [DataGrid] Remove unused `resize` method (#15599) @cherniavskii +- [DataGrid] Support column virtualization with dynamic row height (#15541) @cherniavskii +- [DataGrid] Update the default value for `rowSelectionPropagation` (#15523) @MBilalShafi +- [l10n] Improve Chinese (zh-CN) locale (#15570) @headironc +- [l10n] Improve Portuguese (pt-PT) locale (#15561) @mathzdev + +#### `@mui/x-data-grid-pro@v8.0.0-alpha.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@v8.0.0-alpha.2`, plus: + +- [DataGridPro] Fix header filtering with `boolean` column type (#15528) @k-rajat19 +- [DataGridPro] Fix pagination state not updating if the data source response has no rows (#15622) @zinoroman +- [DataGridPro] Fix selection propagation issue on initialization (#15461) @MBilalShafi + +#### `@mui/x-data-grid-premium@v8.0.0-alpha.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@v8.0.0-alpha.2`. + +### Date and Time Pickers + +#### Breaking changes + +- The props received by the `layout` and the `toolbar` slots have been reworked — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#do-not-pass-the-section-type-as-a-generic). + +- The `TSection` generic of the `FieldRef` type has been replaced with the `TValue` generic — [Learn more](https://next.mui.com/x/migration/migration-pickers-v7/#slots-breaking-changes). + +#### `@mui/x-date-pickers@v8.0.0-alpha.2` + +- [l10n] Improve Dutch (nl-NL) locale (#15564) @nphmuller +- [pickers] Fix DST issue with `America/Asuncion` timezone and `AdapterMoment` (#15552) @flaviendelangle +- [pickers] Improve validation internals (#15419) @flaviendelangle +- [pickers] Remove `TSection` and strictly type `TValue` (#15434) @flaviendelangle +- [pickers] Remove `orientation`, `isLandscape`, `isRtl`, `wrapperVariant` and `disabled` props from `PickersLayout` (#15494) @flaviendelangle +- [pickers] Use the new `ownerState` in ``, `` and `` (#15499) @flaviendelangle +- [pickers] Use the new `ownerState` object in all the field components (#15510) @flaviendelangle + +#### `@mui/x-date-pickers-pro@v8.0.0-alpha.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@v8.0.0-alpha.2`. + +### Charts + +#### Breaking changes + +- Charts Container don't have a `
` wrapping them anymore. All props are now passed to the root `` instead of the `
`. + +#### `@mui/x-charts@v8.0.0-alpha.2` + +- [charts] Allow the creation of custom HTML components using charts data (#15511) @JCQuintas +- [charts] Flatten imports from `@mui/utils` and `@mui/system` (#15603) @alexfauquette +- [charts] Introduce the plugin system (#15513) @alexfauquette +- [charts] Prevent invalid `releasePointerCapture` (#15602) @alexfauquette +- [charts] Fix custom Tooltip demos (#15631) @alexfauquette + +#### `@mui/x-charts-pro@v8.0.0-alpha.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-charts@v8.0.0-alpha.2`. + +### Tree View + +#### `@mui/x-tree-view@v8.0.0-alpha.2` + +- [TreeView] Flatten import from `@mui/utils` and `@mui/system` (#15604) @alexfauquette + +#### `@mui/x-tree-view-pro@v8.0.0-alpha.2` + +Same changes as in `@mui/x-tree-view@v8.0.0-alpha.2`. + +### Docs + +- [docs] Fix 404 links (#15575) @oliviertassinari +- [docs] Fix bash comments (#15571) @oliviertassinari +- [docs] Fix Pickers theme augmentation example (#15672) @LukasTy +- [docs] Replace use of "e.g." with "for example" (#15572) @oliviertassinari +- [docs] Update stale `new` and `preview` tags in v8 docs (#15547) @JCQuintas +- [docs] Fix layout shift image on Tree View docs (#15626) @oliviertassinari +- [docs] Fix `anchorEl` API page for charts (#15625) @oliviertassinari +- [docs] Add documentation for the list view feature (#15344) @KenanYusuf + +### Core + +- [core] Follow `()` function convention for docs @oliviertassinari +- [core] Remove dead translation key (#15566) @oliviertassinari +- [code-infra] Auto-merge `@types/node` bumps (#15591) @LukasTy + ## v8.0.0-alpha.1 _Nov 22, 2024_ @@ -338,6 +567,100 @@ Same changes as in `@mui/x-charts@8.0.0-alpha.0`. - [release] v8 preparation (#15054) @michelengelen - [test] Fix advanced list view regression test snapshot (#15260) @KenanYusuf +## 7.23.0 + +_Nov 29, 2024_ + +We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨: + +- ✨ Support for a new display mode on the Data Grid with the [List View feature](https://mui.com/x/react-data-grid/list-view/), offering an extremely flexible way to render datasets and enabling developers to adapt how data is displayed across different screen sizes. + + https://github.com/user-attachments/assets/61286adc-03fc-4323-9739-8ca726fcc16c + +- ⚛️ React 19 support +- 📚 Documentation improvements +- 🌍 Improve Spanish, Portuguese, Chinese locales on the Data Grid component. +- 🌍 Improve Dutch locale on the Date and Time Picker components. +- 🐞 Bugfixes + +Special thanks go out to the community contributors who have helped make this release possible: +@dloeda, @headironc, @mathzdev, @nphmuller, @lhilgert9, @lauri865. +Following are all team members who have contributed to this release: +@oliviertassinari, @arminmeh, @KenanYusuf, @flaviendelangle, @MBilalShafi. + + + +### Data Grid + +#### `@mui/x-data-grid@v7.23.0` + +- [DataGrid] React 19 support (#15557) @arminmeh +- [DataGrid] Change test dom check from `/jsdom/` to `/jsdom|HappyDOM/`. (#15642) @jedesroches +- [DataGrid] Fix last separator not being hidden when grid is scrollable (#15551) @KenanYusuf +- [DataGrid] Fix order of spread props on toolbar items (#15556) @KenanYusuf +- [DataGrid] Fix row-spanning in combination with column-pinning (#15460) @lhilgert9 +- [DataGrid] Improve resize performance (#15592) @lauri865 +- [DataGrid] Support column virtualization with dynamic row height (#15567) @cherniavskii +- [DataGrid] Improve `GridCell` performance (#15621) @lauri865 +- [l10n] Improve Chinese (zh-CN) locale (#15570) @headironc +- [l10n] Improve Portuguese (pt-PT) locale (#15561) @mathzdev + +#### `@mui/x-data-grid-pro@v7.23.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@v7.23.0`, plus: + +- [DataGridPro] Fix header filtering with `boolean` column type (#15640) @k-rajat19 +- [DataGridPro] Fix pagination state not updating if the data source response has no rows (#15643) @zinoroman +- [DataGridPro] Fix selection propagation issue on initialization (#15593) @MBilalShafi + +#### `@mui/x-data-grid-premium@v7.23.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@v7.23.0`. + +### Date and Time Pickers + +#### `@mui/x-date-pickers@v7.23.0` + +- [pickers] React 19 support (#15557) @arminmeh +- [pickers] Fix DST issue with `America/Asuncion` timezone and `AdapterMoment` (#15653) @flaviendelangle +- [pickers] Use `props.referenceDate` timezone when `props.value` and `props.defaultValue` are not defined (#15544) @flaviendelangle +- [l10n] Improve Dutch (nl-NL) locale (#15564) @nphmuller + +#### `@mui/x-date-pickers-pro@v7.23.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@v7.23.0`. + +### Charts + +#### `@mui/x-charts@v7.23.0` + +- [charts] React 19 support (#15557) @arminmeh +- [charts] Prevent invalid `releasePointerCapture` (#15609) @alexfauquette + +#### `@mui/x-charts-pro@v7.23.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-charts@v7.23.0`. + +### Tree View + +#### `@mui/x-tree-view@v7.23.0` + +- [TreeView] React 19 support (#15557) @arminmeh + +#### `@mui/x-tree-view-pro@7.23.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-tree-view@7.23.0`. + +### Docs + +- [docs] Add data caching to lazy loaded detail panel demo (#15555) @cherniavskii +- [docs] Remove selectors section from list view docs (#15639) @KenanYusuf +- [docs] Add documentation for the list view feature (#15344) @KenanYusuf + +### Core + +- [core] Update @mui/monorepo (#15574) @oliviertassinari + ## v7.22.3 _Nov 21, 2024_ @@ -4803,7 +5126,7 @@ Same changes as in `@mui/x-data-grid-pro@7.0.0-alpha.5`. The `useClearableField` hook API has been simplified to now take a `props` parameter instead of a `fieldProps`, `InputProps`, `clearable`, `onClear`, `slots` and `slotProps` parameters. - You should now be able to directly pass the returned value from your field hook (e.g: `useDateField`) to `useClearableField` + You should now be able to directly pass the returned value from your field hook (for example `useDateField`) to `useClearableField` ```diff const fieldResponse = useDateField(props); diff --git a/docs/data/charts/axis/AxisWithComposition.js b/docs/data/charts/axis/AxisWithComposition.js index 725eb3d112a0c..339d380b08ea8 100644 --- a/docs/data/charts/axis/AxisWithComposition.js +++ b/docs/data/charts/axis/AxisWithComposition.js @@ -53,7 +53,11 @@ export default function AxisWithComposition() { > - + diff --git a/docs/data/charts/axis/AxisWithComposition.tsx b/docs/data/charts/axis/AxisWithComposition.tsx index 725eb3d112a0c..339d380b08ea8 100644 --- a/docs/data/charts/axis/AxisWithComposition.tsx +++ b/docs/data/charts/axis/AxisWithComposition.tsx @@ -53,7 +53,11 @@ export default function AxisWithComposition() { > - + diff --git a/docs/data/charts/axis/axis.md b/docs/data/charts/axis/axis.md index 7f8098d27120c..d213ff6b3bd32 100644 --- a/docs/data/charts/axis/axis.md +++ b/docs/data/charts/axis/axis.md @@ -206,7 +206,7 @@ The x-axis label placement is based on the axis configuration, and the y-axis is ### Position Charts components provide 4 props: `topAxis`, `rightAxis`, `bottomAxis`, and `leftAxis` allowing to define the 4 axes of the chart. -Those pros can accept three type of value: +Those props can accept three type of value: - `null` to not display the axis - `string` which should correspond to the id of a `xAxis` for top and bottom. Or to the id of a `yAxis` for left and right. diff --git a/docs/data/charts/styling/GradientTooltip.js b/docs/data/charts/styling/GradientTooltip.js new file mode 100644 index 0000000000000..91d3f04fdbacd --- /dev/null +++ b/docs/data/charts/styling/GradientTooltip.js @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { BarChart } from '@mui/x-charts/BarChart'; + +export default function GradientTooltip() { + return ( + + + + + + + ); +} diff --git a/docs/data/charts/styling/GradientTooltip.tsx b/docs/data/charts/styling/GradientTooltip.tsx new file mode 100644 index 0000000000000..91d3f04fdbacd --- /dev/null +++ b/docs/data/charts/styling/GradientTooltip.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { BarChart } from '@mui/x-charts/BarChart'; + +export default function GradientTooltip() { + return ( + + + + + + + ); +} diff --git a/docs/data/charts/styling/PatternPie.js b/docs/data/charts/styling/PatternPie.js new file mode 100644 index 0000000000000..02f53eebf0161 --- /dev/null +++ b/docs/data/charts/styling/PatternPie.js @@ -0,0 +1,44 @@ +import * as React from 'react'; +import { PieChart } from '@mui/x-charts/PieChart'; + +export default function PatternPie() { + return ( + + + + + + + ); +} diff --git a/docs/data/charts/styling/PatternPie.tsx b/docs/data/charts/styling/PatternPie.tsx new file mode 100644 index 0000000000000..02f53eebf0161 --- /dev/null +++ b/docs/data/charts/styling/PatternPie.tsx @@ -0,0 +1,44 @@ +import * as React from 'react'; +import { PieChart } from '@mui/x-charts/PieChart'; + +export default function PatternPie() { + return ( + + + + + + + ); +} diff --git a/docs/data/charts/styling/styling.md b/docs/data/charts/styling/styling.md index 9f795806ee5d0..fc64c9cb923d9 100644 --- a/docs/data/charts/styling/styling.md +++ b/docs/data/charts/styling/styling.md @@ -164,3 +164,22 @@ Chart components accept the `sx` props. From here, you can target any subcomponents with its class name. {{"demo": "SxStyling.js"}} + +### Gradients and patterns + +It is possible to use gradients and patterns to fill the charts. +This can be done by passing your gradient or pattern definition as children of the chart component. + +Note that the gradient or pattern defined that way is only usable for SVG. +So a direct definition like `color: "url(#Pattern)'` would cause undefined colors in HTML elements such as the tooltip. +The demo solves this issue by using a CSS variable `'--my-custom-pattern': 'url(#Pattern)'` to specify fallback color with `color: 'var(--my-custom-pattern, #123456)'`. + +{{"demo": "PatternPie.js"}} + +#### Using gradients on tooltips + +Gradients defined as SVG elements are not directly supported in HTML. +However you can use the [gradient functions](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Functions#gradient_functions) to define a gradient in CSS. +This gradient can be used in the tooltip by setting the `sx` prop on the tooltip component, instead of the fallback color used in the previous examples. + +{{"demo": "GradientTooltip.js"}} diff --git a/docs/data/charts/tooltip/CustomAxisTooltip.js b/docs/data/charts/tooltip/CustomAxisTooltip.js index 0d0693111c49c..9689757aa66a9 100644 --- a/docs/data/charts/tooltip/CustomAxisTooltip.js +++ b/docs/data/charts/tooltip/CustomAxisTooltip.js @@ -1,82 +1,79 @@ import * as React from 'react'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; -import { ChartsTooltipContainer, useAxisTooltip } from '@mui/x-charts/ChartsTooltip'; +import { useAxisTooltip } from '@mui/x-charts/ChartsTooltip'; export function CustomAxisTooltip() { const tooltipData = useAxisTooltip(); - if (!tooltipData) { - // No data to display + if (tooltipData === null) { return null; } return ( - - - - - -
- {tooltipData.axisFormattedValue} + }, + }} + > + + + + + + + + {tooltipData.seriesItems.map((seriesItem) => ( + + + + - - - {tooltipData.seriesItems.map((seriesItem) => ( - - - - - - ))} - -
+ {tooltipData.axisFormattedValue} +
+
+
+ + {seriesItem.formattedLabel} + + + {seriesItem.formattedValue}
-
-
- - {seriesItem.formattedLabel} - - - {seriesItem.formattedValue} -
- - + ))} + +
+
); } diff --git a/docs/data/charts/tooltip/CustomAxisTooltip.tsx b/docs/data/charts/tooltip/CustomAxisTooltip.tsx index 0d0693111c49c..9689757aa66a9 100644 --- a/docs/data/charts/tooltip/CustomAxisTooltip.tsx +++ b/docs/data/charts/tooltip/CustomAxisTooltip.tsx @@ -1,82 +1,79 @@ import * as React from 'react'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; -import { ChartsTooltipContainer, useAxisTooltip } from '@mui/x-charts/ChartsTooltip'; +import { useAxisTooltip } from '@mui/x-charts/ChartsTooltip'; export function CustomAxisTooltip() { const tooltipData = useAxisTooltip(); - if (!tooltipData) { - // No data to display + if (tooltipData === null) { return null; } return ( - - - - - -
- {tooltipData.axisFormattedValue} + }, + }} + > + + + + + + + + {tooltipData.seriesItems.map((seriesItem) => ( + + + + - - - {tooltipData.seriesItems.map((seriesItem) => ( - - - - - - ))} - -
+ {tooltipData.axisFormattedValue} +
+
+
+ + {seriesItem.formattedLabel} + + + {seriesItem.formattedValue}
-
-
- - {seriesItem.formattedLabel} - - - {seriesItem.formattedValue} -
- - + ))} + +
+
); } diff --git a/docs/data/charts/tooltip/CustomAxisTooltipContent.js b/docs/data/charts/tooltip/CustomAxisTooltipContent.js index db5e269c6bd9e..f2b5f5c4d649d 100644 --- a/docs/data/charts/tooltip/CustomAxisTooltipContent.js +++ b/docs/data/charts/tooltip/CustomAxisTooltipContent.js @@ -4,6 +4,7 @@ import { BarPlot } from '@mui/x-charts/BarChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; +import { ChartsTooltipContainer } from '@mui/x-charts/ChartsTooltip'; import { CustomAxisTooltip } from './CustomAxisTooltip'; import { dataset, valueFormatter } from '../dataset/weather'; @@ -27,7 +28,9 @@ export default function CustomAxisTooltipContent() { - + + +
); diff --git a/docs/data/charts/tooltip/CustomAxisTooltipContent.tsx b/docs/data/charts/tooltip/CustomAxisTooltipContent.tsx index 9a791ace90ea9..34e94004d86c5 100644 --- a/docs/data/charts/tooltip/CustomAxisTooltipContent.tsx +++ b/docs/data/charts/tooltip/CustomAxisTooltipContent.tsx @@ -4,6 +4,7 @@ import { BarPlot } from '@mui/x-charts/BarChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; +import { ChartsTooltipContainer } from '@mui/x-charts/ChartsTooltip'; import { CustomAxisTooltip } from './CustomAxisTooltip'; import { dataset, valueFormatter } from '../dataset/weather'; @@ -28,7 +29,9 @@ export default function CustomAxisTooltipContent() { - + + +
); diff --git a/docs/data/charts/tooltip/CustomItemTooltip.js b/docs/data/charts/tooltip/CustomItemTooltip.js index 99ceb0dca0ffa..88833ca76d354 100644 --- a/docs/data/charts/tooltip/CustomItemTooltip.js +++ b/docs/data/charts/tooltip/CustomItemTooltip.js @@ -2,43 +2,38 @@ import * as React from 'react'; import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; -import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; +import { useItemTooltip } from '@mui/x-charts/ChartsTooltip'; export function CustomItemTooltip() { const tooltipData = useItemTooltip(); - if (!tooltipData) { - // No data to display return null; } - return ( - - - -
- - {tooltipData.label} - - {tooltipData.formattedValue} - - - + + +
+ + {tooltipData.label} + + {tooltipData.formattedValue} + + ); } diff --git a/docs/data/charts/tooltip/CustomItemTooltip.tsx b/docs/data/charts/tooltip/CustomItemTooltip.tsx index 99ceb0dca0ffa..88833ca76d354 100644 --- a/docs/data/charts/tooltip/CustomItemTooltip.tsx +++ b/docs/data/charts/tooltip/CustomItemTooltip.tsx @@ -2,43 +2,38 @@ import * as React from 'react'; import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; -import { ChartsTooltipContainer, useItemTooltip } from '@mui/x-charts/ChartsTooltip'; +import { useItemTooltip } from '@mui/x-charts/ChartsTooltip'; export function CustomItemTooltip() { const tooltipData = useItemTooltip(); - if (!tooltipData) { - // No data to display return null; } - return ( - - - -
- - {tooltipData.label} - - {tooltipData.formattedValue} - - - + + +
+ + {tooltipData.label} + + {tooltipData.formattedValue} + + ); } diff --git a/docs/data/charts/tooltip/CustomTooltipContent.js b/docs/data/charts/tooltip/CustomTooltipContent.js index 72d4b2d839d2d..70661ea5c4362 100644 --- a/docs/data/charts/tooltip/CustomTooltipContent.js +++ b/docs/data/charts/tooltip/CustomTooltipContent.js @@ -4,6 +4,7 @@ import { BarPlot } from '@mui/x-charts/BarChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; +import { ChartsTooltipContainer } from '@mui/x-charts/ChartsTooltip'; import { CustomItemTooltip } from './CustomItemTooltip'; import { dataset, valueFormatter } from '../dataset/weather'; @@ -27,7 +28,9 @@ export default function CustomTooltipContent() { - + + +
); diff --git a/docs/data/charts/tooltip/CustomTooltipContent.tsx b/docs/data/charts/tooltip/CustomTooltipContent.tsx index a40570a7d032e..70661ea5c4362 100644 --- a/docs/data/charts/tooltip/CustomTooltipContent.tsx +++ b/docs/data/charts/tooltip/CustomTooltipContent.tsx @@ -4,6 +4,7 @@ import { BarPlot } from '@mui/x-charts/BarChart'; import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; import { ChartsClipPath } from '@mui/x-charts/ChartsClipPath'; import { ChartsYAxis } from '@mui/x-charts/ChartsYAxis'; +import { ChartsTooltipContainer } from '@mui/x-charts/ChartsTooltip'; import { CustomItemTooltip } from './CustomItemTooltip'; import { dataset, valueFormatter } from '../dataset/weather'; @@ -27,8 +28,9 @@ export default function CustomTooltipContent() { - - + + +
); diff --git a/docs/data/charts/tooltip/tooltip.md b/docs/data/charts/tooltip/tooltip.md index d13b996cca3fd..9433e90b68f69 100644 --- a/docs/data/charts/tooltip/tooltip.md +++ b/docs/data/charts/tooltip/tooltip.md @@ -105,18 +105,14 @@ Examples about helpers are provided in the composition section. ```jsx import { ChartsTooltipContainer } from '@mui/x-charts/ChartsTooltip'; -function CustomItemTooltip() { +function CustomItemTooltipContent() { const tooltipData = useItemTooltip(); if (!tooltipData) { // No data to display return null; } - return ( - - {/** Your custom content **/} - - ) + return
{/** Your custom content **/}
; } // ... - + + + ``` +:::warning +Do not skip ChartsTooltipContainer rendering if the tooltip has no data to display. +For example the following code does not work. + +```jsx +if (tooltipData === null) { + return null; +} + +return ( + + {/** My content **/} + +); +``` + +The ChartsTooltipContainer must render before the pointer enters the SVG because it uses this event to get the pointer type. +::: + ### Overriding placement To override tooltip placement, override to the tooltip with `slots.tooltip`. diff --git a/docs/data/data-grid/events/events.json b/docs/data/data-grid/events/events.json index a2831d2974c28..fedd745dd5c45 100644 --- a/docs/data/data-grid/events/events.json +++ b/docs/data/data-grid/events/events.json @@ -227,7 +227,7 @@ { "projects": ["x-data-grid-pro", "x-data-grid-premium"], "name": "fetchRows", - "description": "Fired when a new batch of rows is requested to be loaded. Called with a GridFetchRowsParams object.", + "description": "Fired when a new batch of rows is requested to be loaded. Called with a GridFetchRowsParams object. Used to trigger onFetchRows.", "params": "GridFetchRowsParams", "event": "MuiEvent<{}>", "componentProp": "onFetchRows" diff --git a/docs/data/data-grid/list-view/ListView.js b/docs/data/data-grid/list-view/ListView.js index a7ab930852afe..38405104013ac 100644 --- a/docs/data/data-grid/list-view/ListView.js +++ b/docs/data/data-grid/list-view/ListView.js @@ -1,17 +1,19 @@ import * as React from 'react'; -import { DataGridPro } from '@mui/x-data-grid-pro'; -import Box from '@mui/material/Box'; +import { DataGridPro, GridToolbarContainer } from '@mui/x-data-grid-pro'; import { useDemoData } from '@mui/x-data-grid-generator'; import Stack from '@mui/material/Stack'; import Avatar from '@mui/material/Avatar'; import Typography from '@mui/material/Typography'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; import IconButton from '@mui/material/IconButton'; import MessageIcon from '@mui/icons-material/Message'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import ToggleButton from '@mui/material/ToggleButton'; +import GridIcon from '@mui/icons-material/GridOn'; +import ListIcon from '@mui/icons-material/TableRowsOutlined'; function MessageAction(params) { - const handleMessage = () => { + const handleMessage = (event) => { + event.stopPropagation(); console.log(`send message to ${params.row.phone}`); }; return ( @@ -52,10 +54,50 @@ const listColDef = { const VISIBLE_FIELDS = ['avatar', 'name', 'position']; +function Toolbar({ view, onChangeView }) { + return ( + + { + if (newView) { + onChangeView(newView); + } + }} + > + + Grid + + + List + + + + ); +} + export default function ListView() { - const [isListView, setIsListView] = React.useState(true); + const [view, setView] = React.useState('list'); + const isListView = view === 'list'; - const { data } = useDemoData({ + const { data, loading } = useDemoData({ dataSet: 'Employee', rowLength: 20, visibleFields: VISIBLE_FIELDS, @@ -76,32 +118,25 @@ export default function ListView() { const rowHeight = isListView ? 64 : 52; return ( - - setIsListView(event.target.checked)} - /> - } - label="Enable list view" - /> - + - - - + slotProps={{ + toolbar: { + view, + onChangeView: setView, + }, + }} + sx={{ backgroundColor: 'background.paper' }} + /> +
); } diff --git a/docs/data/data-grid/list-view/ListView.tsx b/docs/data/data-grid/list-view/ListView.tsx index 40239d5a8e41a..def8aa893f4ea 100644 --- a/docs/data/data-grid/list-view/ListView.tsx +++ b/docs/data/data-grid/list-view/ListView.tsx @@ -5,19 +5,29 @@ import { GridListColDef, GridColDef, GridRowParams, + GridToolbarContainer, } from '@mui/x-data-grid-pro'; -import Box from '@mui/material/Box'; import { useDemoData } from '@mui/x-data-grid-generator'; import Stack from '@mui/material/Stack'; import Avatar from '@mui/material/Avatar'; import Typography from '@mui/material/Typography'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; import IconButton from '@mui/material/IconButton'; import MessageIcon from '@mui/icons-material/Message'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import ToggleButton from '@mui/material/ToggleButton'; +import GridIcon from '@mui/icons-material/GridOn'; +import ListIcon from '@mui/icons-material/TableRowsOutlined'; + +declare module '@mui/x-data-grid' { + interface ToolbarPropsOverrides { + view: 'grid' | 'list'; + onChangeView: (view: 'grid' | 'list') => void; + } +} function MessageAction(params: Pick) { - const handleMessage = () => { + const handleMessage = (event: React.MouseEvent) => { + event.stopPropagation(); console.log(`send message to ${params.row.phone}`); }; return ( @@ -58,10 +68,55 @@ const listColDef: GridListColDef = { const VISIBLE_FIELDS = ['avatar', 'name', 'position']; +type ToolbarProps = { + view: 'grid' | 'list'; + onChangeView: (view: 'grid' | 'list') => void; +}; + +function Toolbar({ view, onChangeView }: ToolbarProps) { + return ( + + { + if (newView) { + onChangeView(newView); + } + }} + > + + Grid + + + List + + + + ); +} + export default function ListView() { - const [isListView, setIsListView] = React.useState(true); + const [view, setView] = React.useState<'grid' | 'list'>('list'); + const isListView = view === 'list'; - const { data } = useDemoData({ + const { data, loading } = useDemoData({ dataSet: 'Employee', rowLength: 20, visibleFields: VISIBLE_FIELDS, @@ -82,32 +137,25 @@ export default function ListView() { const rowHeight = isListView ? 64 : 52; return ( - - setIsListView(event.target.checked)} - /> - } - label="Enable list view" - /> - + - - - + slotProps={{ + toolbar: { + view, + onChangeView: setView, + }, + }} + sx={{ backgroundColor: 'background.paper' }} + /> +
); } diff --git a/docs/data/data-grid/list-view/ListViewAdvanced.js b/docs/data/data-grid/list-view/ListViewAdvanced.js index 2185d42a142d7..8b5d6cd874591 100644 --- a/docs/data/data-grid/list-view/ListViewAdvanced.js +++ b/docs/data/data-grid/list-view/ListViewAdvanced.js @@ -13,6 +13,7 @@ import OpenIcon from '@mui/icons-material/Visibility'; import useMediaQuery from '@mui/material/useMediaQuery'; import CSSBaseline from '@mui/material/CssBaseline'; import { randomId } from '@mui/x-data-grid-generator'; +import { useTheme } from '@mui/material/styles'; import { FileIcon } from './components/FileIcon'; import { DetailsDrawer } from './components/DetailsDrawer'; import { ListCell } from './components/ListCell'; @@ -24,12 +25,16 @@ import { formatDate, formatSize, stringAvatar } from './utils'; import { ActionDrawer } from './components/ActionDrawer'; import { RenameDialog } from './components/RenameDialog'; -export default function ListViewAdvanced() { +export default function ListViewAdvanced(props) { // This is used only for the example - renders the drawer inside the container const containerRef = React.useRef(null); const container = () => containerRef.current; - const isListView = useMediaQuery('(min-width: 700px)'); + const theme = useTheme(); + const isBelowMd = useMediaQuery(theme.breakpoints.down('md')); + + const isDocsDemo = props.window !== undefined; + const isListView = isDocsDemo ? true : isBelowMd; const apiRef = useGridApiRef(); diff --git a/docs/data/data-grid/list-view/ListViewAdvanced.tsx b/docs/data/data-grid/list-view/ListViewAdvanced.tsx index eca7495c05632..86cd8b08fd8e3 100644 --- a/docs/data/data-grid/list-view/ListViewAdvanced.tsx +++ b/docs/data/data-grid/list-view/ListViewAdvanced.tsx @@ -17,6 +17,7 @@ import OpenIcon from '@mui/icons-material/Visibility'; import useMediaQuery from '@mui/material/useMediaQuery'; import CSSBaseline from '@mui/material/CssBaseline'; import { randomId } from '@mui/x-data-grid-generator'; +import { useTheme } from '@mui/material/styles'; import { FileIcon } from './components/FileIcon'; import { DetailsDrawer } from './components/DetailsDrawer'; import { ListCell } from './components/ListCell'; @@ -37,12 +38,21 @@ declare module '@mui/x-data-grid' { } } -export default function ListViewAdvanced() { +interface Props { + // Injected by the documentation to work in an iframe. + window?: () => Window; +} + +export default function ListViewAdvanced(props: Props) { // This is used only for the example - renders the drawer inside the container const containerRef = React.useRef(null); const container = () => containerRef.current as HTMLElement; - const isListView = useMediaQuery('(min-width: 700px)'); + const theme = useTheme(); + const isBelowMd = useMediaQuery(theme.breakpoints.down('md')); + + const isDocsDemo = props.window !== undefined; + const isListView = isDocsDemo ? true : isBelowMd; const apiRef = useGridApiRef(); diff --git a/docs/data/data-grid/list-view/ListViewEdit.js b/docs/data/data-grid/list-view/ListViewEdit.js new file mode 100644 index 0000000000000..45284c99831c7 --- /dev/null +++ b/docs/data/data-grid/list-view/ListViewEdit.js @@ -0,0 +1,220 @@ +import * as React from 'react'; +import { DataGridPro } from '@mui/x-data-grid-pro'; +import Stack from '@mui/material/Stack'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import EditIcon from '@mui/icons-material/Edit'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import TextField from '@mui/material/TextField'; +import Button from '@mui/material/Button'; +import DialogActions from '@mui/material/DialogActions'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import { + randomId, + randomTraderName, + randomArrayItem, +} from '@mui/x-data-grid-generator'; + +const roles = ['Marketing', 'Finance', 'Development']; + +const randomRole = () => { + return randomArrayItem(roles); +}; + +const initialRows = [ + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#4caf50', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#2196f3', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#ff9800', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#9c27b0', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#f44336', + }, +]; + +const columns = [ + { field: 'name', headerName: 'Name', width: 180 }, + { + field: 'position', + headerName: 'Department', + width: 220, + type: 'singleSelect', + valueOptions: roles, + }, +]; + +function EditAction(props) { + const { row, onSave } = props; + const [editing, setEditing] = React.useState(false); + const [name, setName] = React.useState(row.name); + const [position, setPosition] = React.useState(row.position); + + const handleEdit = (event) => { + event.stopPropagation(); + setEditing(true); + }; + + const handleClose = () => { + setEditing(false); + }; + + const handleSave = (event) => { + event.preventDefault(); + onSave(row.id, { name, position }); + handleClose(); + }; + + React.useEffect(() => { + setName(row.name); + setPosition(row.position); + }, [row]); + + return ( + + + + + + + Edit Employee + + + Make changes to the employee's information. + + setName(event.target.value)} + /> + + Position + + + + + + + + + + ); +} + +function ListViewCell(props) { + const { row } = props; + + return ( + + + + + {row.name} + + + {row.position} + + + + + ); +} + +export default function ListViewEdit() { + const [rows, setRows] = React.useState(initialRows); + + const updateRow = React.useCallback((id, rowUpdates) => { + setRows((prevRows) => + prevRows.map((row) => (row.id === id ? { ...row, ...rowUpdates } : row)), + ); + }, []); + + const listColDef = React.useMemo( + () => ({ + field: 'listColumn', + renderCell: (params) => , + }), + [updateRow], + ); + + return ( +
+ +
+ ); +} diff --git a/docs/data/data-grid/list-view/ListViewEdit.tsx b/docs/data/data-grid/list-view/ListViewEdit.tsx new file mode 100644 index 0000000000000..4299bee39d1dd --- /dev/null +++ b/docs/data/data-grid/list-view/ListViewEdit.tsx @@ -0,0 +1,236 @@ +import * as React from 'react'; +import { + DataGridPro, + GridRenderCellParams, + GridListColDef, + GridColDef, + GridRowParams, + GridRowModel, + GridRowsProp, +} from '@mui/x-data-grid-pro'; +import Stack from '@mui/material/Stack'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import EditIcon from '@mui/icons-material/Edit'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import TextField from '@mui/material/TextField'; +import Button from '@mui/material/Button'; +import DialogActions from '@mui/material/DialogActions'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import { + randomId, + randomTraderName, + randomArrayItem, +} from '@mui/x-data-grid-generator'; + +const roles = ['Marketing', 'Finance', 'Development']; + +const randomRole = () => { + return randomArrayItem(roles); +}; + +const initialRows: GridRowsProp = [ + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#4caf50', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#2196f3', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#ff9800', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#9c27b0', + }, + { + id: randomId(), + name: randomTraderName(), + position: randomRole(), + avatar: '#f44336', + }, +]; + +const columns: GridColDef[] = [ + { field: 'name', headerName: 'Name', width: 180 }, + { + field: 'position', + headerName: 'Department', + width: 220, + type: 'singleSelect', + valueOptions: roles, + }, +]; + +interface EditActionProps extends Pick { + onSave: (id: string, rowUpdates: GridRowModel) => void; +} + +function EditAction(props: EditActionProps) { + const { row, onSave } = props; + const [editing, setEditing] = React.useState(false); + const [name, setName] = React.useState(row.name); + const [position, setPosition] = React.useState(row.position); + + const handleEdit = (event: React.MouseEvent) => { + event.stopPropagation(); + setEditing(true); + }; + + const handleClose = () => { + setEditing(false); + }; + + const handleSave = (event: React.FormEvent) => { + event.preventDefault(); + onSave(row.id, { name, position }); + handleClose(); + }; + + React.useEffect(() => { + setName(row.name); + setPosition(row.position); + }, [row]); + + return ( + + + + + + + Edit Employee + + + Make changes to the employee's information. + + setName(event.target.value)} + /> + + Position + + + + + + + + + + ); +} + +interface ListViewCellProps extends GridRenderCellParams { + onSave: (id: string, rowUpdates: GridRowModel) => void; +} + +function ListViewCell(props: ListViewCellProps) { + const { row } = props; + + return ( + + + + + {row.name} + + + {row.position} + + + + + ); +} + +export default function ListViewEdit() { + const [rows, setRows] = React.useState(initialRows); + + const updateRow = React.useCallback((id: string, rowUpdates: GridRowModel) => { + setRows((prevRows) => + prevRows.map((row) => (row.id === id ? { ...row, ...rowUpdates } : row)), + ); + }, []); + + const listColDef: GridListColDef = React.useMemo( + () => ({ + field: 'listColumn', + renderCell: (params) => , + }), + [updateRow], + ); + + return ( +
+ +
+ ); +} diff --git a/docs/data/data-grid/list-view/ListViewEdit.tsx.preview b/docs/data/data-grid/list-view/ListViewEdit.tsx.preview new file mode 100644 index 0000000000000..09b26a2a275bb --- /dev/null +++ b/docs/data/data-grid/list-view/ListViewEdit.tsx.preview @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/docs/data/data-grid/list-view/ListViewMediaQuery.js b/docs/data/data-grid/list-view/ListViewMediaQuery.js new file mode 100644 index 0000000000000..44eae0ccd9cef --- /dev/null +++ b/docs/data/data-grid/list-view/ListViewMediaQuery.js @@ -0,0 +1,70 @@ +import * as React from 'react'; +import { DataGridPro } from '@mui/x-data-grid-pro'; +import { useDemoData } from '@mui/x-data-grid-generator'; +import Stack from '@mui/material/Stack'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; +import useMediaQuery from '@mui/material/useMediaQuery'; +import { useTheme } from '@mui/material/styles'; + +function ListViewCell(params) { + return ( + + + + + {params.row.name} + + + {params.row.position} + + + + ); +} + +const listColDef = { + field: 'listColumn', + renderCell: ListViewCell, +}; + +const VISIBLE_FIELDS = ['avatar', 'name', 'position']; + +export default function ListViewMediaQuery() { + const theme = useTheme(); + const isListView = useMediaQuery(theme.breakpoints.down('md')); + + const { data, loading } = useDemoData({ + dataSet: 'Employee', + rowLength: 5, + visibleFields: VISIBLE_FIELDS, + }); + + const rowHeight = isListView ? 64 : 52; + + return ( +
+ +
+ ); +} diff --git a/docs/data/data-grid/list-view/ListViewMediaQuery.tsx b/docs/data/data-grid/list-view/ListViewMediaQuery.tsx new file mode 100644 index 0000000000000..21605af8d10c1 --- /dev/null +++ b/docs/data/data-grid/list-view/ListViewMediaQuery.tsx @@ -0,0 +1,74 @@ +import * as React from 'react'; +import { + DataGridPro, + GridRenderCellParams, + GridListColDef, +} from '@mui/x-data-grid-pro'; +import { useDemoData } from '@mui/x-data-grid-generator'; +import Stack from '@mui/material/Stack'; +import Avatar from '@mui/material/Avatar'; +import Typography from '@mui/material/Typography'; +import useMediaQuery from '@mui/material/useMediaQuery'; +import { useTheme } from '@mui/material/styles'; + +function ListViewCell(params: GridRenderCellParams) { + return ( + + + + + {params.row.name} + + + {params.row.position} + + + + ); +} + +const listColDef: GridListColDef = { + field: 'listColumn', + renderCell: ListViewCell, +}; + +const VISIBLE_FIELDS = ['avatar', 'name', 'position']; + +export default function ListViewMediaQuery() { + const theme = useTheme(); + const isListView = useMediaQuery(theme.breakpoints.down('md')); + + const { data, loading } = useDemoData({ + dataSet: 'Employee', + rowLength: 5, + visibleFields: VISIBLE_FIELDS, + }); + + const rowHeight = isListView ? 64 : 52; + + return ( +
+ +
+ ); +} diff --git a/docs/data/data-grid/list-view/ListViewMediaQuery.tsx.preview b/docs/data/data-grid/list-view/ListViewMediaQuery.tsx.preview new file mode 100644 index 0000000000000..7481bb780c233 --- /dev/null +++ b/docs/data/data-grid/list-view/ListViewMediaQuery.tsx.preview @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/docs/data/data-grid/list-view/list-view.md b/docs/data/data-grid/list-view/list-view.md index 362b056fa0593..ed100bb168cab 100644 --- a/docs/data/data-grid/list-view/list-view.md +++ b/docs/data/data-grid/list-view/list-view.md @@ -16,14 +16,64 @@ Unlike the default grid view, the list view makes no assumptions on how data is In order to display data in a list view, a `unstable_listColumn` prop must be provided with a `renderCell` function. -{{"demo": "ListView.js", "bg": "inline"}} +```tsx +function ListViewCell(params: GridRenderCellParams) { + return <>{params.row.id}; +} + +const listColDef: GridListColDef = { + field: 'listColumn', + renderCell: ListViewCell, +}; + +; +``` + +{{"demo": "ListView.js", "bg": true}} + +## Enable with a media query + +Use the `useMediaQuery` hook from `@mui/material` to enable the list view feature at a specified breakpoint. + +The demo below automatically switches to a list layout when the viewport width is below the `md` breakpoint. + +{{"demo": "ListViewMediaQuery.js", "bg": "inline"}} + +## Editable rows + +The [editing feature](/x/react-data-grid/editing/) is not supported in list view, but it is possible to build an editing experience from within your custom cell renderer, as shown below. + +{{"demo": "ListViewEdit.js", "bg": true}} ## Advanced usage -The list view feature can be combined with [custom subcomponents](/x/react-data-grid/components/) to provide an improved user experience on small screens. +The list view feature can be combined with [custom subcomponents](/x/react-data-grid/components/) to provide an improved user experience on small screens, as shown below. + +{{"demo": "ListViewAdvanced.js", "iframe": true, "maxWidth": 360, "height": 600}} + +## Feature compatibility -{{"demo": "ListViewAdvanced.js", "bg": "inline", "iframe": true, "maxWidth": 360, "height": 600, "hideToolbar": true}} +The list view feature can be used in combination with the following features: -:::info -See the code for this demo in [CodeSandbox](https://codesandbox.io/p/sandbox/x-react-data-grid-list-view-zmkzhz). +- ✅ [Sorting](/x/react-data-grid/sorting/) +- ✅ [Filtering](/x/react-data-grid/filtering/) +- ✅ [Pagination](/x/react-data-grid/pagination/) +- ✅ [Row selection](/x/react-data-grid/row-selection/) +- ✅ [Multi filters](/x/react-data-grid/filtering/multi-filters/) [](/x/introduction/licensing/#pro-plan 'Pro plan') +- ✅ [Row pinning](/x/react-data-grid/row-pinning/) [](/x/introduction/licensing/#pro-plan 'Pro plan') +- ✅ [Cell selection](/x/react-data-grid/cell-selection/) [](/x/introduction/licensing/#premium-plan 'Premium plan') + +:::warning +Features not listed may not work as expected, or may not work at all. + +If you're using a feature that's listed above and it's not working as expected, please [open a bug report](https://github.com/mui/mui-x/issues/new?assignees=&labels=status%3A+waiting+for+maintainer%2Cbug+%F0%9F%90%9B&projects=&template=1.bug.yml). + +If you need to use list view with any other features, please [open a feature request](https://github.com/mui/mui-x/issues/new?assignees=&labels=status%3A+waiting+for+maintainer%2Cnew+feature&projects=&template=2.feature.yml). ::: + +## API + +- [DataGrid](/x/api/data-grid/data-grid/) +- [DataGridPro](/x/api/data-grid/data-grid-pro/) +- [DataGridPremium](/x/api/data-grid/data-grid-premium/) +- [GridListColDef](/x/api/data-grid/grid-list-col-def/) diff --git a/docs/data/data-grid/localization/data.json b/docs/data/data-grid/localization/data.json index f36d84f29e31a..cc0c430a6377e 100644 --- a/docs/data/data-grid/localization/data.json +++ b/docs/data/data-grid/localization/data.json @@ -99,7 +99,7 @@ "languageTag": "de-DE", "importName": "deDE", "localeName": "German", - "missingKeysCount": 10, + "missingKeysCount": 0, "totalKeysCount": 132, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/x-data-grid/src/locales/deDE.ts" }, @@ -115,7 +115,7 @@ "languageTag": "he-IL", "importName": "heIL", "localeName": "Hebrew", - "missingKeysCount": 14, + "missingKeysCount": 0, "totalKeysCount": 132, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/x-data-grid/src/locales/heIL.ts" }, @@ -211,7 +211,7 @@ "languageTag": "ro-RO", "importName": "roRO", "localeName": "Romanian", - "missingKeysCount": 18, + "missingKeysCount": 0, "totalKeysCount": 132, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/x-data-grid/src/locales/roRO.ts" }, @@ -251,7 +251,7 @@ "languageTag": "tr-TR", "importName": "trTR", "localeName": "Turkish", - "missingKeysCount": 12, + "missingKeysCount": 0, "totalKeysCount": 132, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/x-data-grid/src/locales/trTR.ts" }, diff --git a/docs/data/data-grid/pagination/pagination.md b/docs/data/data-grid/pagination/pagination.md index 7259d7fca5b02..4e3dbaba85050 100644 --- a/docs/data/data-grid/pagination/pagination.md +++ b/docs/data/data-grid/pagination/pagination.md @@ -235,10 +235,12 @@ The following example demonstrates how to show the estimated row count in the pa ```jsx const labelDisplayedRows = ({ from, to, count, estimated }) => { if (!estimated) { - return `${from}–${to} od ${count !== -1 ? count : `više nego ${to}`}`, + return `${from}–${to} od ${count !== -1 ? count : `više nego ${to}`}`; } - return `${from}–${to} od ${count !== -1 ? count : `više nego ${estimated > to ? estimated : to}`}`; -} + const estimateLabel = + estimated && estimated > to ? `oko ${estimated}` : `više nego ${to}`; + return `${from}–${to} od ${count !== -1 ? count : estimateLabel}`; +}; { labelDisplayedRows, }, }} -/> +/>; ``` For more information, see the [Translation keys](/x/react-data-grid/localization/#translation-keys) section of the localization documentation. diff --git a/docs/data/data-grid/row-grouping/RowGroupingAriaV8.js b/docs/data/data-grid/row-grouping/RowGroupingAriaV8.js deleted file mode 100644 index 6689443db0822..0000000000000 --- a/docs/data/data-grid/row-grouping/RowGroupingAriaV8.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as React from 'react'; -import { - DataGridPremium, - useGridApiRef, - useKeepGroupedColumnsHidden, -} from '@mui/x-data-grid-premium'; -import { useMovieData } from '@mui/x-data-grid-generator'; - -export default function RowGroupingAriaV8() { - const data = useMovieData(); - const apiRef = useGridApiRef(); - - const initialState = useKeepGroupedColumnsHidden({ - apiRef, - initialState: { - rowGrouping: { - model: ['company'], - }, - }, - }); - - return ( -
- -
- ); -} diff --git a/docs/data/data-grid/row-grouping/RowGroupingAriaV8.tsx b/docs/data/data-grid/row-grouping/RowGroupingAriaV8.tsx deleted file mode 100644 index 6689443db0822..0000000000000 --- a/docs/data/data-grid/row-grouping/RowGroupingAriaV8.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import * as React from 'react'; -import { - DataGridPremium, - useGridApiRef, - useKeepGroupedColumnsHidden, -} from '@mui/x-data-grid-premium'; -import { useMovieData } from '@mui/x-data-grid-generator'; - -export default function RowGroupingAriaV8() { - const data = useMovieData(); - const apiRef = useGridApiRef(); - - const initialState = useKeepGroupedColumnsHidden({ - apiRef, - initialState: { - rowGrouping: { - model: ['company'], - }, - }, - }); - - return ( -
- -
- ); -} diff --git a/docs/data/data-grid/row-grouping/RowGroupingAriaV8.tsx.preview b/docs/data/data-grid/row-grouping/RowGroupingAriaV8.tsx.preview deleted file mode 100644 index 303e3b3ef2367..0000000000000 --- a/docs/data/data-grid/row-grouping/RowGroupingAriaV8.tsx.preview +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/docs/data/data-grid/row-grouping/RowGroupingFullExample.js b/docs/data/data-grid/row-grouping/RowGroupingFullExample.js index 52040b1639af1..4deda985cbd8b 100644 --- a/docs/data/data-grid/row-grouping/RowGroupingFullExample.js +++ b/docs/data/data-grid/row-grouping/RowGroupingFullExample.js @@ -40,7 +40,6 @@ export default function RowGroupingFullExample() { groupingColDef={{ leafField: 'traderEmail', }} - experimentalFeatures={{ ariaV8: true }} /> ); diff --git a/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx b/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx index 52040b1639af1..4deda985cbd8b 100644 --- a/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx +++ b/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx @@ -40,7 +40,6 @@ export default function RowGroupingFullExample() { groupingColDef={{ leafField: 'traderEmail', }} - experimentalFeatures={{ ariaV8: true }} /> ); diff --git a/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx.preview b/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx.preview index 35a7dd3ccbcd0..b20dbc70dc3ad 100644 --- a/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx.preview +++ b/docs/data/data-grid/row-grouping/RowGroupingFullExample.tsx.preview @@ -7,5 +7,4 @@ groupingColDef={{ leafField: 'traderEmail', }} - experimentalFeatures={{ ariaV8: true }} /> \ No newline at end of file diff --git a/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.js b/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.js index 5baa5839b6f86..89ab855dc45b6 100644 --- a/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.js +++ b/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.js @@ -13,8 +13,8 @@ export default function RowGroupingPropagateSelection() { const data = useMovieData(); const apiRef = useGridApiRef(); const [rowSelectionPropagation, setRowSelectionPropagation] = React.useState({ - parents: true, - descendants: true, + parents: false, + descendants: false, }); const initialState = useKeepGroupedColumnsHidden({ diff --git a/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.tsx b/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.tsx index 9229e086666ac..03570d1b5a7fe 100644 --- a/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.tsx +++ b/docs/data/data-grid/row-grouping/RowGroupingPropagateSelection.tsx @@ -15,8 +15,8 @@ export default function RowGroupingPropagateSelection() { const apiRef = useGridApiRef(); const [rowSelectionPropagation, setRowSelectionPropagation] = React.useState({ - parents: true, - descendants: true, + parents: false, + descendants: false, }); const initialState = useKeepGroupedColumnsHidden({ diff --git a/docs/data/data-grid/row-grouping/row-grouping.md b/docs/data/data-grid/row-grouping/row-grouping.md index 13f56a2ebac88..846c08b234395 100644 --- a/docs/data/data-grid/row-grouping/row-grouping.md +++ b/docs/data/data-grid/row-grouping/row-grouping.md @@ -311,15 +311,15 @@ If you are dynamically switching the `leafField` or `mainGroupingCriteria`, the ## Automatic parents and children selection -By default, selecting a parent row does not select its children. -You can override this behavior by using the `rowSelectionPropagation` prop. +By default, selecting a parent row selects all its descendants automatically. +You can customize this behavior by using the `rowSelectionPropagation` prop. Here's how it's structured: ```ts type GridRowSelectionPropagation = { - descendants?: boolean; // default: false - parents?: boolean; // default: false + descendants?: boolean; // default: true + parents?: boolean; // default: true }; ``` @@ -396,22 +396,6 @@ Don't hesitate to leave a comment on the same issue to influence what gets built With this panel, your users will be able to control which columns are used for grouping just by dragging them inside the panel. -## Accessibility changes in v8 - -The Data Grid v8 with row grouping feature will improve the accessibility and will be more aligned with the WAI-ARIA authoring practices. - -You can start using the new accessibility features by enabling `ariaV8` experimental feature flag: - -```tsx - -``` - -:::warning -The value of `ariaV8` should be constant and not change during the lifetime of the Data Grid. -::: - -{{"demo": "RowGroupingAriaV8.js", "bg": "inline", "defaultCodeOpen": false}} - ## Full example {{"demo": "RowGroupingFullExample.js", "bg": "inline", "defaultCodeOpen": false}} diff --git a/docs/data/data-grid/row-spanning/RowSpanning.js b/docs/data/data-grid/row-spanning/RowSpanning.js index 109566ed72271..58cd4d1223b05 100644 --- a/docs/data/data-grid/row-spanning/RowSpanning.js +++ b/docs/data/data-grid/row-spanning/RowSpanning.js @@ -23,7 +23,7 @@ export default function RowSpanning() { showCellVerticalBorder showColumnVerticalBorder disableRowSelectionOnClick - unstable_rowSpanning={enabled} + rowSpanning={enabled} hideFooter sx={{ '& .MuiDataGrid-row:hover': { diff --git a/docs/data/data-grid/row-spanning/RowSpanning.tsx b/docs/data/data-grid/row-spanning/RowSpanning.tsx index f9ac1d6204460..d871d83e21226 100644 --- a/docs/data/data-grid/row-spanning/RowSpanning.tsx +++ b/docs/data/data-grid/row-spanning/RowSpanning.tsx @@ -23,7 +23,7 @@ export default function RowSpanning() { showCellVerticalBorder showColumnVerticalBorder disableRowSelectionOnClick - unstable_rowSpanning={enabled} + rowSpanning={enabled} hideFooter sx={{ '& .MuiDataGrid-row:hover': { diff --git a/docs/data/data-grid/row-spanning/RowSpanningCalendar.js b/docs/data/data-grid/row-spanning/RowSpanningCalendar.js index fa234baca5fe5..dc7bd1b0a3abf 100644 --- a/docs/data/data-grid/row-spanning/RowSpanningCalendar.js +++ b/docs/data/data-grid/row-spanning/RowSpanningCalendar.js @@ -137,7 +137,7 @@ export default function RowSpanningCalendar() { Span cells across several rows.

-:::warning -This feature is marked as **unstable**. While you can use this feature in production, the API could change in the future. -::: - By default, each cell in a Data Grid takes up the height of one row. The row spanning feature makes it possible for a cell to fill multiple rows in a single column. -To enable, pass the `unstable_rowSpanning` prop to the Data Grid. +To enable, pass the `rowSpanning` prop to the Data Grid. The Data Grid will automatically merge consecutive cells with repeating values in the same column, as shown in the demo below—switch off the toggle button to see the actual rows: {{"demo": "RowSpanning.js", "bg": "inline", "defaultCodeOpen": false}} diff --git a/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.js b/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.js index 43c742a5b90a1..e598eb38982ed 100644 --- a/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.js +++ b/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.js @@ -38,6 +38,7 @@ export default function ServerSideDataGridNoCache() { ...initialState, pagination: { paginationModel: { pageSize: 10, page: 0 }, + rowCount: 0, }, }), [initialState], diff --git a/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.tsx b/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.tsx index b62606d8985f0..19a578b73a8c1 100644 --- a/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.tsx +++ b/docs/data/data-grid/server-side-data/ServerSideDataGridNoCache.tsx @@ -38,6 +38,7 @@ export default function ServerSideDataGridNoCache() { ...initialState, pagination: { paginationModel: { pageSize: 10, page: 0 }, + rowCount: 0, }, }), [initialState], diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingErrorHandling.js b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingErrorHandling.js new file mode 100644 index 0000000000000..4f890e86fe5ee --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingErrorHandling.js @@ -0,0 +1,109 @@ +import * as React from 'react'; +import { + DataGridPro, + useGridApiRef, + GridToolbar, + GRID_ROOT_GROUP_ID, +} from '@mui/x-data-grid-pro'; +import Checkbox from '@mui/material/Checkbox'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import { useMockServer } from '@mui/x-data-grid-generator'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Snackbar from '@mui/material/Snackbar'; + +function ErrorSnackbar(props) { + const { onRetry, ...rest } = props; + return ( + + + Retry + + } + > + Failed to fetch row data + + + ); +} + +function ServerSideLazyLoadingErrorHandling() { + const apiRef = useGridApiRef(); + const [retryParams, setRetryParams] = React.useState(null); + const [shouldRequestsFail, setShouldRequestsFail] = React.useState(false); + + const { fetchRows, ...props } = useMockServer( + { rowLength: 100 }, + { useCursorPagination: false, minDelay: 300, maxDelay: 800 }, + shouldRequestsFail, + ); + + const dataSource = React.useMemo( + () => ({ + getRows: async (params) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + // Reset the retryParams when new rows are fetched + setRetryParams(null); + return { + rows: getRowsResponse.rows, + rowCount: getRowsResponse.rowCount, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ setShouldRequestsFail(event.target.checked)} + /> + } + label="Make the requests fail" + /> +
+ {retryParams && ( + { + apiRef.current.unstable_dataSource.fetchRows( + GRID_ROOT_GROUP_ID, + retryParams, + ); + setRetryParams(null); + }} + /> + )} + setRetryParams(params)} + unstable_dataSourceCache={null} + unstable_lazyLoading + paginationModel={{ page: 0, pageSize: 10 }} + slots={{ toolbar: GridToolbar }} + /> +
+
+ ); +} + +export default ServerSideLazyLoadingErrorHandling; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingErrorHandling.tsx b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingErrorHandling.tsx new file mode 100644 index 0000000000000..53d4519d1fa2b --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingErrorHandling.tsx @@ -0,0 +1,113 @@ +import * as React from 'react'; +import { + DataGridPro, + useGridApiRef, + GridToolbar, + GridDataSource, + GridGetRowsParams, + GRID_ROOT_GROUP_ID, +} from '@mui/x-data-grid-pro'; +import Checkbox from '@mui/material/Checkbox'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import { useMockServer } from '@mui/x-data-grid-generator'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Snackbar, { SnackbarProps } from '@mui/material/Snackbar'; + +function ErrorSnackbar(props: SnackbarProps & { onRetry: () => void }) { + const { onRetry, ...rest } = props; + return ( + + + Retry + + } + > + Failed to fetch row data + + + ); +} + +function ServerSideLazyLoadingErrorHandling() { + const apiRef = useGridApiRef(); + const [retryParams, setRetryParams] = React.useState( + null, + ); + const [shouldRequestsFail, setShouldRequestsFail] = React.useState(false); + + const { fetchRows, ...props } = useMockServer( + { rowLength: 100 }, + { useCursorPagination: false, minDelay: 300, maxDelay: 800 }, + shouldRequestsFail, + ); + + const dataSource: GridDataSource = React.useMemo( + () => ({ + getRows: async (params) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + // Reset the retryParams when new rows are fetched + setRetryParams(null); + return { + rows: getRowsResponse.rows, + rowCount: getRowsResponse.rowCount, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ setShouldRequestsFail(event.target.checked)} + /> + } + label="Make the requests fail" + /> +
+ {retryParams && ( + { + apiRef.current.unstable_dataSource.fetchRows( + GRID_ROOT_GROUP_ID, + retryParams, + ); + setRetryParams(null); + }} + /> + )} + setRetryParams(params)} + unstable_dataSourceCache={null} + unstable_lazyLoading + paginationModel={{ page: 0, pageSize: 10 }} + slots={{ toolbar: GridToolbar }} + /> +
+
+ ); +} + +export default ServerSideLazyLoadingErrorHandling; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingInfinite.js b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingInfinite.js new file mode 100644 index 0000000000000..59ff744f4e438 --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingInfinite.js @@ -0,0 +1,44 @@ +import * as React from 'react'; +import { DataGridPro } from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; + +function ServerSideLazyLoadingInfinite() { + const { fetchRows, ...props } = useMockServer( + { rowLength: 100 }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const dataSource = React.useMemo( + () => ({ + getRows: async (params) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + return { + rows: getRowsResponse.rows, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingInfinite; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingInfinite.tsx b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingInfinite.tsx new file mode 100644 index 0000000000000..b842453551b76 --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingInfinite.tsx @@ -0,0 +1,48 @@ +import * as React from 'react'; +import { + DataGridPro, + GridDataSource, + GridGetRowsParams, +} from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; + +function ServerSideLazyLoadingInfinite() { + const { fetchRows, ...props } = useMockServer( + { rowLength: 100 }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const dataSource: GridDataSource = React.useMemo( + () => ({ + getRows: async (params: GridGetRowsParams) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + return { + rows: getRowsResponse.rows, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingInfinite; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingModeUpdate.js b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingModeUpdate.js new file mode 100644 index 0000000000000..ca6447d8e7e08 --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingModeUpdate.js @@ -0,0 +1,82 @@ +import * as React from 'react'; +import { DataGridPro } from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; +import FormControl from '@mui/material/FormControl'; +import FormLabel from '@mui/material/FormLabel'; +import RadioGroup from '@mui/material/RadioGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Radio from '@mui/material/Radio'; + +function GridCustomToolbar({ count, setCount }) { + return ( + + Row count + setCount(Number(event.target.value))} + > + } label="Unknown" /> + } label="40" /> + } label="100" /> + + + ); +} + +function ServerSideLazyLoadingModeUpdate() { + const { fetchRows, ...props } = useMockServer( + { rowLength: 100 }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const [rowCount, setRowCount] = React.useState(-1); + + const dataSource = React.useMemo( + () => ({ + getRows: async (params) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + return { + rows: getRowsResponse.rows, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingModeUpdate; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingModeUpdate.tsx b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingModeUpdate.tsx new file mode 100644 index 0000000000000..13ec706795e00 --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingModeUpdate.tsx @@ -0,0 +1,94 @@ +import * as React from 'react'; +import { + DataGridPro, + GridDataSource, + GridGetRowsParams, + GridSlotProps, +} from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; +import FormControl from '@mui/material/FormControl'; +import FormLabel from '@mui/material/FormLabel'; +import RadioGroup from '@mui/material/RadioGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Radio from '@mui/material/Radio'; + +declare module '@mui/x-data-grid' { + interface ToolbarPropsOverrides { + count: number; + setCount: React.Dispatch>; + } +} + +function GridCustomToolbar({ count, setCount }: GridSlotProps['toolbar']) { + return ( + + Row count + setCount(Number(event.target.value))} + > + } label="Unknown" /> + } label="40" /> + } label="100" /> + + + ); +} + +function ServerSideLazyLoadingModeUpdate() { + const { fetchRows, ...props } = useMockServer( + { rowLength: 100 }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const [rowCount, setRowCount] = React.useState(-1); + + const dataSource: GridDataSource = React.useMemo( + () => ({ + getRows: async (params: GridGetRowsParams) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + return { + rows: getRowsResponse.rows, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingModeUpdate; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingRequestThrottle.js b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingRequestThrottle.js new file mode 100644 index 0000000000000..2a826d5dc52ab --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingRequestThrottle.js @@ -0,0 +1,114 @@ +import * as React from 'react'; +import { DataGridPro, GridRowCount } from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; +import Box from '@mui/material/Box'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormLabel from '@mui/material/FormLabel'; +import RadioGroup from '@mui/material/RadioGroup'; +import Radio from '@mui/material/Radio'; + +function GridCustomFooterRowCount({ requestCount, ...props }) { + return ( + + Request count: {requestCount} + + + ); +} + +function GridCustomToolbar({ throttleMs, setThrottleMs }) { + return ( + + + + Throttle + + setThrottleMs(Number(event.target.value))} + > + } label="0 ms" /> + } + label="500 ms (default)" + /> + } label="1500 ms" /> + + + + ); +} + +function ServerSideLazyLoadingRequestThrottle() { + const rowCount = 1000; + const { fetchRows, ...props } = useMockServer( + { rowLength: rowCount }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const [requestCount, setRequestCount] = React.useState(0); + const [throttleMs, setThrottleMs] = React.useState(500); + + const dataSource = React.useMemo( + () => ({ + getRows: async (params) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + setRequestCount((prev) => prev + 1); + return { + rows: getRowsResponse.rows, + }; + }, + }), + [fetchRows], + ); + + React.useEffect(() => { + setRequestCount(0); + }, [dataSource]); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingRequestThrottle; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingRequestThrottle.tsx b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingRequestThrottle.tsx new file mode 100644 index 0000000000000..75056075affc9 --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingRequestThrottle.tsx @@ -0,0 +1,133 @@ +import * as React from 'react'; +import { + DataGridPro, + GridDataSource, + GridGetRowsParams, + GridRowCount, + GridSlotProps, +} from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; +import Box from '@mui/material/Box'; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormLabel from '@mui/material/FormLabel'; +import RadioGroup from '@mui/material/RadioGroup'; +import Radio from '@mui/material/Radio'; + +declare module '@mui/x-data-grid' { + interface ToolbarPropsOverrides { + throttleMs: number; + setThrottleMs: React.Dispatch>; + } + interface FooterRowCountOverrides { + requestCount?: number; + } +} + +function GridCustomFooterRowCount({ + requestCount, + ...props +}: GridSlotProps['footerRowCount']) { + return ( + + Request count: {requestCount} + + + ); +} + +function GridCustomToolbar({ throttleMs, setThrottleMs }: GridSlotProps['toolbar']) { + return ( + + + + Throttle + + setThrottleMs(Number(event.target.value))} + > + } label="0 ms" /> + } + label="500 ms (default)" + /> + } label="1500 ms" /> + + + + ); +} + +function ServerSideLazyLoadingRequestThrottle() { + const rowCount = 1000; + const { fetchRows, ...props } = useMockServer( + { rowLength: rowCount }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const [requestCount, setRequestCount] = React.useState(0); + const [throttleMs, setThrottleMs] = React.useState(500); + + const dataSource: GridDataSource = React.useMemo( + () => ({ + getRows: async (params: GridGetRowsParams) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + setRequestCount((prev) => prev + 1); + return { + rows: getRowsResponse.rows, + }; + }, + }), + [fetchRows], + ); + + React.useEffect(() => { + setRequestCount(0); + }, [dataSource]); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingRequestThrottle; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingViewport.js b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingViewport.js new file mode 100644 index 0000000000000..d6de6e60ca0d2 --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingViewport.js @@ -0,0 +1,45 @@ +import * as React from 'react'; +import { DataGridPro } from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; + +function ServerSideLazyLoadingViewport() { + const { fetchRows, ...props } = useMockServer( + { rowLength: 100000 }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const dataSource = React.useMemo( + () => ({ + getRows: async (params) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + return { + rows: getRowsResponse.rows, + rowCount: getRowsResponse.rowCount, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingViewport; diff --git a/docs/data/data-grid/server-side-data/ServerSideLazyLoadingViewport.tsx b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingViewport.tsx new file mode 100644 index 0000000000000..df60d3b0e3dc1 --- /dev/null +++ b/docs/data/data-grid/server-side-data/ServerSideLazyLoadingViewport.tsx @@ -0,0 +1,49 @@ +import * as React from 'react'; +import { + DataGridPro, + GridDataSource, + GridGetRowsParams, +} from '@mui/x-data-grid-pro'; +import { useMockServer } from '@mui/x-data-grid-generator'; + +function ServerSideLazyLoadingViewport() { + const { fetchRows, ...props } = useMockServer( + { rowLength: 100000 }, + { useCursorPagination: false, minDelay: 200, maxDelay: 500 }, + ); + + const dataSource: GridDataSource = React.useMemo( + () => ({ + getRows: async (params: GridGetRowsParams) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + return { + rows: getRowsResponse.rows, + rowCount: getRowsResponse.rowCount, + }; + }, + }), + [fetchRows], + ); + + return ( +
+ +
+ ); +} + +export default ServerSideLazyLoadingViewport; diff --git a/docs/data/data-grid/server-side-data/aggregation.md b/docs/data/data-grid/server-side-data/aggregation.md index 99b226b777709..e11485b7d80ce 100644 --- a/docs/data/data-grid/server-side-data/aggregation.md +++ b/docs/data/data-grid/server-side-data/aggregation.md @@ -1,5 +1,5 @@ --- -title: React Server-side row grouping +title: React Data Grid - Server-side aggregation --- # Data Grid - Server-side aggregation [](/x/introduction/licensing/#premium-plan 'Premium plan')🚧 diff --git a/docs/data/data-grid/server-side-data/index.md b/docs/data/data-grid/server-side-data/index.md index 035be2e8fdf6f..02906265e955a 100644 --- a/docs/data/data-grid/server-side-data/index.md +++ b/docs/data/data-grid/server-side-data/index.md @@ -176,10 +176,10 @@ The following demo showcases this behavior. {{"demo": "ServerSideDataGrid.js", "bg": "inline"}} :::info -The data source demos use a utility function `useMockServer` to simulate the server-side data fetching. -In a real-world scenario, you should replace this with your own server-side data-fetching logic. +The data source demos use a `useMockServer` utility function to simulate server-side data fetching. +In a real-world scenario you would replace this with your own server-side data-fetching logic. -Open info section of the browser console to see the requests being made and the data being fetched in response. +Open the Info section of your browser console to see the requests being made and the data being fetched in response. ::: ## Data caching @@ -189,6 +189,43 @@ This means that if the user navigates to a page or expands a node that has alrea The `GridDataSourceCacheDefault` is used by default which is a simple in-memory cache that stores the data in a plain object. It can be seen in action in the [demo above](#with-data-source). +### Improving the cache hit rate + +To increase the cache hit rate, Data Grid splits `getRows()` results into chunks before storing them in cache. +For the requests that follow, chunks are combined as needed to recreate the response. +This means that a single request can make multiple calls to the `get()` or `set()` method of `GridDataSourceCache`. + +Chunk size is the lowest expected amount of records per request based on the `pageSize` value from the `paginationModel` and `pageSizeOptions` props. + +Because of this, values in the `pageSizeOptions` prop play a big role in the cache hit rate. +We recommend using values that are multiples of the lowest value; even better if each subsequent value is a multiple of the previous value. + +Here are some examples: + +1. Best scenario - `pageSizeOptions={[5, 10, 50, 100]}` + + In this case the chunk size is 5, which means that with `pageSize={100}` there are 20 cache records stored. + + Retrieving data for any other `pageSize` up to the first 100 records results in a cache hit, since the whole dataset can be made of the existing chunks. + +2. Parts of the data missing - `pageSizeOptions={[10, 20, 50]}` + + Loading the first page with `pageSize={50}` results in 5 cache records. + This works well with `pageSize={10}`, but not as well with `pageSize={20}`. + Loading the third page with `pageSize={20}` results in a new request being made, even though half of the data is already in the cache. + +3. Incompatible page sizes - `pageSizeOptions={[7, 15, 40]}` + + In this situation, the chunk size is 7. + Retrieving the first page with `pageSize={15}` creates chunks split into `[7, 7, 1]` records. + Loading the second page creates 3 new chunks (again `[7, 7, 1]`), but now the third chunk from the first request has an overlap of 1 record with the first chunk of the second request. + These chunks with 1 record can only be used as the last piece of a request for `pageSize={15}` and are useless in all other cases. + +:::info +In the examples above, `sortModel` and `filterModel` remained unchanged. +Changing those would require a new response to be retrieved and stored in the chunks. +::: + ### Customize the cache lifetime The `GridDataSourceCacheDefault` has a default Time To Live (`ttl`) of 5 minutes. To customize it, pass the `ttl` option in milliseconds to the `GridDataSourceCacheDefault` constructor, and then pass it as the `unstable_dataSourceCache` prop. diff --git a/docs/data/data-grid/server-side-data/infinite-loading.md b/docs/data/data-grid/server-side-data/infinite-loading.md deleted file mode 100644 index d2bcc0e58d038..0000000000000 --- a/docs/data/data-grid/server-side-data/infinite-loading.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: React Server-side infinite loading ---- - -# Data Grid - Server-side infinite loading [](/x/introduction/licensing/#pro-plan 'Pro plan')🚧 - -

Row infinite loading with server-side data source.

- -:::warning -This feature isn't implemented yet. It's coming. - -👍 Upvote [issue #10858](https://github.com/mui/mui-x/issues/10858) 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 the [current solution](https://mui.com/x/react-data-grid/row-updates/#infinite-loading). -::: diff --git a/docs/data/data-grid/server-side-data/lazy-loading.md b/docs/data/data-grid/server-side-data/lazy-loading.md index 6c66183ab0e65..176ddeff29133 100644 --- a/docs/data/data-grid/server-side-data/lazy-loading.md +++ b/docs/data/data-grid/server-side-data/lazy-loading.md @@ -1,15 +1,121 @@ --- -title: React Server-side lazy loading +title: React Data Grid - Server-side lazy loading --- -# Data Grid - Server-side lazy loading [](/x/introduction/licensing/#pro-plan 'Pro plan')🚧 +# Data Grid - Server-side lazy loading [](/x/introduction/licensing/#pro-plan 'Pro plan')🧪 -

Row lazy-loading with server-side data source.

+

Learn how to implement lazy-loading rows with a server-side data source.

+ +Lazy loading changes the way pagination works by removing page controls and loading data dynamically (in a single list) as the user scrolls through the grid. + +You can enable it with the `unstable_lazyLoading` prop paired with the `unstable_dataSource` prop. + +Initially, data for the first page is fetched and displayed in the grid. +The value of the total row count determines when the next page's data is loaded: + +- If the total row count is known, the Data Grid is filled with skeleton rows and fetches more data if one of the skeleton rows falls into the rendering context. + This loading strategy is often referred to as [**viewport loading**](#viewport-loading). + +- If the total row count is unknown, the Data Grid fetches more data when the user scrolls to the bottom. + This loading strategy is often referred to as [**infinite loading**](#infinite-loading). + +:::info +You can provide the row count through one of the following ways: + +- Pass it as the [`rowCount`](/x/api/data-grid/data-grid/#data-grid-prop-rowCount) prop +- Return `rowCount` in the `getRows()` method of the [data source](/x/react-data-grid/server-side-data/#data-source) +- Set the `rowCount` using the [`setRowCount()`](/x/api/data-grid/grid-api/#grid-api-prop-setRowCount) API method + +These options are presented in order of precedence, which means if the row count is set using the API, that value is overridden once a new value is returned by the `getRows()` method unless it's `undefined`. +::: + +## Viewport loading + +Viewport loading mode is enabled when the row count is known (and is greater than or equal to zero). +The Grid fetches the first page immediately and adds skeleton rows to match the total row count. +Other pages are fetched once the user starts scrolling and moves a skeleton row inside the rendering context (with the index range defined by [virtualization](/x/react-data-grid/virtualization/)). + +If the user scrolls too fast, the Grid loads multiple pages with one request (by adjusting `start` and `end` parameters) to reduce the server load. + +The demo below shows how viewport loading mode works: + +{{"demo": "ServerSideLazyLoadingViewport.js", "bg": "inline"}} + +:::info +The data source demos use a `useMockServer` utility function to simulate server-side data fetching. +In a real-world scenario you would replace this with your own server-side data-fetching logic. + +Open the Info section of your browser console to see the requests being made and the data being fetched in response. +::: + +### Request throttling + +As a user scrolls through the Grid, the rendering context changes and the Grid tries to fill in any missing rows by making a new server request. +It also throttles new data fetches to avoid making unnecessary requests. +The default throttle time is 500 milliseconds. +Use the `unstable_lazyLoadingRequestThrottleMs` prop to set a custom time, as shown below: + +{{"demo": "ServerSideLazyLoadingRequestThrottle.js", "bg": "inline"}} + +## Infinite loading + +Infinite loading mode is enabled when the row count is unknown (either `-1` or `undefined`). +A new page is loaded when the scroll reaches the bottom of the viewport area. + +You can use the `scrollEndThreshold` prop to change the area that triggers new requests. + +The demo below shows how infinite loading mode works. +Page size is set to `15` and the mock server is configured to return a total of 100 rows. +When the response contains no new rows, the Grid stops requesting new data. + +{{"demo": "ServerSideLazyLoadingInfinite.js", "bg": "inline"}} + +## Updating the loading mode + +The Grid changes the loading mode dynamically if the total row count gets updated by changing the `rowCount` prop, returning different `rowCount` in `GridGetRowsResponse` or via `setRowCount()` API. + +Based on the previous and the new value for the total row count, the following scenarios are possible: + +- **Unknown `rowCount` to known `rowCount`**: When the row count is set to a valid value from an unknown value, the Data Grid switches to viewport loading mode. It checks the number of already fetched rows and adds skeleton rows to match the provided row count. + +- **Known `rowCount` to unknown `rowCount`**: If the row count is updated and set to `-1`, the Data Grid resets, fetches the first page, then sets itself to infinite loading mode. + +- **Known `rowCount` greater than the actual row count**: This can happen either by reducing the value of the row count after more rows were already fetched, or if the row count was unknown and the Grid (while in the infinite loading mode) already fetched more rows. In this case, the Grid resets, fetches the first page, and then continues in one mode or the other depending on the new value of the `rowCount`. + +:::warning +`rowCount` is expected to be static. +Changing its value can cause the Grid to reset and the cache to be cleared which may lead to performance and UX degradation. +::: + +The demo below serves as a showcase of the behavior described above, and is not representative of something you would implement in a real-world scenario. + +{{"demo": "ServerSideLazyLoadingModeUpdate.js", "bg": "inline"}} + +## Nested lazy loading 🚧 :::warning This feature isn't implemented yet. It's coming. -👍 Upvote [issue #10857](https://github.com/mui/mui-x/issues/10857) if you want to see it land faster. +👍 Upvote [issue #14527](https://github.com/mui/mui-x/issues/14527) 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 the [current solution](https://mui.com/x/react-data-grid/row-updates/#lazy-loading). +Don't hesitate to leave a comment on the issue to help influence what gets built—especially if you already have a use case for this feature, or if you're facing a specific pain point with your current solution. ::: + +When completed, it will be possible to use the `unstable_lazyLoading` flag in combination with [tree data](/x/react-data-grid/server-side-data/tree-data/) and [row grouping](/x/react-data-grid/server-side-data/row-grouping/). + +## Error handling + +To handle errors, use the `unstable_onDataSourceError()` prop as described in [Server-side data—Error handling](/x/react-data-grid/server-side-data/#error-handling). + +You can pass the second parameter of type `GridGetRowsParams` to the `getRows()` method of the [`unstable_dataSource`](/x/api/data-grid/grid-api/#grid-api-prop-unstable_dataSource) to retry the request. +If successful, the Data Grid uses `rows` and `rowCount` data to determine if the rows should be appended at the end of the grid or if the skeleton rows should be replaced. + +The following demo gives an example how to use `GridGetRowsParams` to retry a failed request. + +{{"demo": "ServerSideLazyLoadingErrorHandling.js", "bg": "inline"}} + +## API + +- [DataGrid](/x/api/data-grid/data-grid/) +- [DataGridPro](/x/api/data-grid/data-grid-pro/) +- [DataGridPremium](/x/api/data-grid/data-grid-premium/) diff --git a/docs/data/data-grid/server-side-data/row-grouping.md b/docs/data/data-grid/server-side-data/row-grouping.md index f7fd48290f8de..8ab13eb7e5c38 100644 --- a/docs/data/data-grid/server-side-data/row-grouping.md +++ b/docs/data/data-grid/server-side-data/row-grouping.md @@ -1,5 +1,5 @@ --- -title: React Server-side row grouping +title: React Data Grid - Server-side row grouping --- # Data Grid - Server-side row grouping [](/x/introduction/licensing/#premium-plan 'Premium plan')🧪 diff --git a/docs/data/data-grid/server-side-data/tree-data.md b/docs/data/data-grid/server-side-data/tree-data.md index b93f559d5b07b..b4af9c3548391 100644 --- a/docs/data/data-grid/server-side-data/tree-data.md +++ b/docs/data/data-grid/server-side-data/tree-data.md @@ -1,5 +1,5 @@ --- -title: React Server-side tree data +title: React Data Grid - Server-side tree data --- # Data Grid - Server-side tree data [](/x/introduction/licensing/#pro-plan 'Pro plan')🧪 @@ -59,10 +59,10 @@ It also caches the data by default. {{"demo": "ServerSideTreeData.js", "bg": "inline"}} :::info -The data source demos use a utility function `useMockServer` to simulate the server-side data fetching. -In a real-world scenario, you would replace this with your own server-side data fetching logic. +The data source demos use a `useMockServer` utility function to simulate server-side data fetching. +In a real-world scenario you would replace this with your own server-side data-fetching logic. -Open the info section of the browser console to see the requests being made and the data being fetched in response. +Open the Info section of your browser console to see the requests being made and the data being fetched in response. ::: ## Error handling diff --git a/docs/data/date-pickers/adapters-locale/adapters-locale.md b/docs/data/date-pickers/adapters-locale/adapters-locale.md index 0168a00d75476..524ffb3df60c5 100644 --- a/docs/data/date-pickers/adapters-locale/adapters-locale.md +++ b/docs/data/date-pickers/adapters-locale/adapters-locale.md @@ -143,32 +143,32 @@ For example, they don't support day of the year or quarter. Here is the list of the currently supported formats: - The year - - ✅ 2-digits values (e.g: `23`) - - ✅ 4-digits values (e.g: `2023`) - - ❌ Values with ordinal (e.g: `2023th`) + - ✅ 2-digits values (for example, `23`) + - ✅ 4-digits values (for example, `2023`) + - ❌ Values with ordinal (for example, `2023th`) - The month - - ✅ 1-based digit (e.g: `08`) - - ✅ Multi-letter values (for example `Aug`, `August`) - - ❌ 1-letter values (e.g: `A`) because several months are represented with the same letter + - ✅ 1-based digit (for example, `08`) + - ✅ Multi-letter values (for example, `Aug`, `August`) + - ❌ 1-letter values (for example, `A`) because several months are represented with the same letter - The day of the month - - ✅ 1-based digit values (e.g: `24`) - - ✅ 1-based digit values with ordinal (e.g: `24th`) + - ✅ 1-based digit values (for example, `24`) + - ✅ 1-based digit values with ordinal (for example, `24th`) - The day of the week - - ✅ 0-based digit values (e.g: `03`) - - ✅ 1-based digit values (e.g: `04`) - - ✅ Multi-letter values (e.g: `Tue`, `Tuesday`) - - ❌ 1-letter values (e.g: `T`) because several days of the week are represented with the same letter + - ✅ 0-based digit values (for example, `03`) + - ✅ 1-based digit values (for example, `04`) + - ✅ Multi-letter values (for example, `Tue`, `Tuesday`) + - ❌ 1-letter values (for example, `T`) because several days of the week are represented with the same letter - The hours - - ✅ 0-based 12-hours values (e.g: `03`) - - ✅ 0-based 24-hours values (e.g: `15`) - - ❌ 1-based values (e.g: `24` instead of `00`) + - ✅ 0-based 12-hours values (for example, `03`) + - ✅ 0-based 24-hours values (for example, `15`) + - ❌ 1-based values (for example, `24` instead of `00`) - The minutes @@ -190,7 +190,7 @@ If you need to get the clean value from the input, you can remove this character ::: :::warning -Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. +Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. ::: {{"demo": "RespectLeadingZerosFieldFormat.js"}} diff --git a/docs/data/date-pickers/base-concepts/base-concepts.md b/docs/data/date-pickers/base-concepts/base-concepts.md index bdae427685bc9..ca61ae0cbe0f0 100644 --- a/docs/data/date-pickers/base-concepts/base-concepts.md +++ b/docs/data/date-pickers/base-concepts/base-concepts.md @@ -161,9 +161,14 @@ import type {} from '@mui/x-date-pickers-pro/themeAugmentation'; const theme = createTheme({ components: { MuiDatePicker: { + defaultProps: { + displayWeekNumber: true, + }, + }, + MuiDateRangeCalendar: { styleOverrides: { root: { - backgroundColor: 'red', + backgroundColor: '#f0f0f0', }, }, }, diff --git a/docs/data/date-pickers/calendar-systems/AdapterHijri.js b/docs/data/date-pickers/calendar-systems/AdapterHijri.js index fa738ee1e6e3e..377759e113758 100644 --- a/docs/data/date-pickers/calendar-systems/AdapterHijri.js +++ b/docs/data/date-pickers/calendar-systems/AdapterHijri.js @@ -46,14 +46,6 @@ function ButtonDateTimeField(props) { props: internalProps, }); - const handleTogglePicker = (event) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - const valueStr = value == null ? parsedFormat : value.format(format); return ( @@ -62,7 +54,7 @@ function ButtonDateTimeField(props) { variant="outlined" color={hasValidationError ? 'error' : 'primary'} ref={InputProps?.ref} - onClick={handleTogglePicker} + onClick={() => pickerContext.setOpen((prev) => !prev)} > {label ? `${label}: ${valueStr}` : valueStr} diff --git a/docs/data/date-pickers/calendar-systems/AdapterHijri.tsx b/docs/data/date-pickers/calendar-systems/AdapterHijri.tsx index aa9b24d67f795..704dbee32ae79 100644 --- a/docs/data/date-pickers/calendar-systems/AdapterHijri.tsx +++ b/docs/data/date-pickers/calendar-systems/AdapterHijri.tsx @@ -50,14 +50,6 @@ function ButtonDateTimeField(props: DateTimePickerFieldProps) { props: internalProps, }); - const handleTogglePicker = (event: React.UIEvent) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - const valueStr = value == null ? parsedFormat : value.format(format); return ( @@ -66,7 +58,7 @@ function ButtonDateTimeField(props: DateTimePickerFieldProps) { variant="outlined" color={hasValidationError ? 'error' : 'primary'} ref={InputProps?.ref} - onClick={handleTogglePicker} + onClick={() => pickerContext.setOpen((prev) => !prev)} > {label ? `${label}: ${valueStr}` : valueStr} diff --git a/docs/data/date-pickers/custom-field/BrowserV7Field.js b/docs/data/date-pickers/custom-field/BrowserV7Field.js index 3e6be2ea7b364..11f5b168ae3fc 100644 --- a/docs/data/date-pickers/custom-field/BrowserV7Field.js +++ b/docs/data/date-pickers/custom-field/BrowserV7Field.js @@ -5,8 +5,6 @@ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { DatePicker } from '@mui/x-date-pickers/DatePicker'; import { unstable_useDateField as useDateField } from '@mui/x-date-pickers/DateField'; -import { useClearableField } from '@mui/x-date-pickers/hooks'; - import { Unstable_PickersSectionList as PickersSectionList } from '@mui/x-date-pickers/PickersSectionList'; const BrowserFieldRoot = styled('div', { name: 'BrowserField', slot: 'Root' })({ @@ -27,7 +25,9 @@ const BrowserFieldContent = styled('div', { name: 'BrowserField', slot: 'Content }, ); -const BrowserTextField = React.forwardRef((props, ref) => { +const BrowserDateField = React.forwardRef((props, ref) => { + const fieldResponse = useDateField(props); + const { // Should be ignored enableAccessibleFieldDOMStructure, @@ -44,6 +44,9 @@ const BrowserTextField = React.forwardRef((props, ref) => { // Can be passed to a hidden element onChange, value, + // Can be passed to the button that clears the value + onClear, + clearable, // Can be used to render a custom label label, // Can be used to style the component @@ -55,7 +58,7 @@ const BrowserTextField = React.forwardRef((props, ref) => { InputProps: { ref: InputPropsRef, startAdornment, endAdornment } = {}, // The rest can be passed to the root element ...other - } = props; + } = fieldResponse; const handleRef = useForkRef(InputPropsRef, ref); @@ -80,21 +83,6 @@ const BrowserTextField = React.forwardRef((props, ref) => { ); }); -const BrowserDateField = React.forwardRef((props, ref) => { - const { slots, slotProps, ...textFieldProps } = props; - - const fieldResponse = useDateField(textFieldProps); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ; -}); - const BrowserDatePicker = React.forwardRef((props, ref) => { return ( , - Omit< - React.HTMLAttributes, - keyof BaseSingleInputPickersTextFieldProps - > {} +const BrowserDateField = React.forwardRef( + (props: DatePickerFieldProps, ref: React.Ref) => { + const fieldResponse = useDateField(props); -const BrowserTextField = React.forwardRef( - (props: BrowserTextFieldProps, ref: React.Ref) => { const { // Should be ignored enableAccessibleFieldDOMStructure, @@ -59,6 +52,10 @@ const BrowserTextField = React.forwardRef( onChange, value, + // Can be passed to the button that clears the value + onClear, + clearable, + // Can be used to render a custom label label, @@ -73,7 +70,7 @@ const BrowserTextField = React.forwardRef( // The rest can be passed to the root element ...other - } = props; + } = fieldResponse; const handleRef = useForkRef(InputPropsRef, ref); @@ -99,23 +96,6 @@ const BrowserTextField = React.forwardRef( }, ); -const BrowserDateField = React.forwardRef( - (props: DatePickerFieldProps, ref: React.Ref) => { - const { slots, slotProps, ...textFieldProps } = props; - - const fieldResponse = useDateField(textFieldProps); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ; - }, -); - const BrowserDatePicker = React.forwardRef( (props: DatePickerProps, ref: React.Ref) => { return ( diff --git a/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.js b/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.js index a86335cd7dd75..ae55770f60785 100644 --- a/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.js +++ b/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.js @@ -1,6 +1,5 @@ import * as React from 'react'; import useForkRef from '@mui/utils/useForkRef'; -import useSlotProps from '@mui/utils/useSlotProps'; import { styled } from '@mui/material/styles'; import IconButton from '@mui/material/IconButton'; import InputAdornment from '@mui/material/InputAdornment'; @@ -9,7 +8,7 @@ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { DateRangePicker } from '@mui/x-date-pickers-pro/DateRangePicker'; import { unstable_useSingleInputDateRangeField as useSingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; -import { useClearableField, usePickerContext } from '@mui/x-date-pickers/hooks'; +import { usePickerContext } from '@mui/x-date-pickers/hooks'; import { Unstable_PickersSectionList as PickersSectionList } from '@mui/x-date-pickers/PickersSectionList'; const BrowserFieldRoot = styled('div', { name: 'BrowserField', slot: 'Root' })({ @@ -30,7 +29,9 @@ const BrowserFieldContent = styled('div', { name: 'BrowserField', slot: 'Content }, ); -const BrowserTextField = React.forwardRef((props, ref) => { +const BrowserSingleInputDateRangeField = React.forwardRef((props, ref) => { + const fieldResponse = useSingleInputDateRangeField(props); + const { // Should be ignored enableAccessibleFieldDOMStructure, @@ -47,6 +48,9 @@ const BrowserTextField = React.forwardRef((props, ref) => { // Can be passed to a hidden element onChange, value, + // Can be passed to the button that clears the value + onClear, + clearable, // Can be used to render a custom label label, // Can be used to style the component @@ -58,12 +62,19 @@ const BrowserTextField = React.forwardRef((props, ref) => { InputProps: { ref: InputPropsRef, startAdornment, endAdornment } = {}, // The rest can be passed to the root element ...other - } = props; + } = fieldResponse; + const pickerContext = usePickerContext(); const handleRef = useForkRef(InputPropsRef, ref); return ( - + {startAdornment} { /> {endAdornment} - - ); -}); - -const BrowserSingleInputDateRangeField = React.forwardRef((props, ref) => { - const { slots, slotProps, ...other } = props; - - const pickerContext = usePickerContext(); - const handleTogglePicker = (event) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - - const textFieldProps = useSlotProps({ - elementType: 'input', - externalSlotProps: slotProps?.textField, - externalForwardedProps: other, - ownerState: props, - }); - - textFieldProps.InputProps = { - ...textFieldProps.InputProps, - endAdornment: ( - + pickerContext.setOpen((prev) => !prev)}> - ), - }; - - const fieldResponse = useSingleInputDateRangeField(textFieldProps); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ( - + ); }); diff --git a/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.tsx b/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.tsx index 2c1c935104e7d..68f5f4c21737b 100644 --- a/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.tsx +++ b/docs/data/date-pickers/custom-field/BrowserV7SingleInputRangeField.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; import useForkRef from '@mui/utils/useForkRef'; -import useSlotProps from '@mui/utils/useSlotProps'; import { styled } from '@mui/material/styles'; import IconButton from '@mui/material/IconButton'; import InputAdornment from '@mui/material/InputAdornment'; @@ -13,10 +12,9 @@ import { DateRangePickerProps, } from '@mui/x-date-pickers-pro/DateRangePicker'; import { unstable_useSingleInputDateRangeField as useSingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; -import { useClearableField, usePickerContext } from '@mui/x-date-pickers/hooks'; +import { usePickerContext } from '@mui/x-date-pickers/hooks'; import { Unstable_PickersSectionList as PickersSectionList } from '@mui/x-date-pickers/PickersSectionList'; import { FieldType } from '@mui/x-date-pickers-pro/models'; -import { BaseSingleInputPickersTextFieldProps } from '@mui/x-date-pickers/models'; const BrowserFieldRoot = styled('div', { name: 'BrowserField', slot: 'Root' })({ display: 'flex', @@ -36,15 +34,16 @@ const BrowserFieldContent = styled('div', { name: 'BrowserField', slot: 'Content }, ); -interface BrowserTextFieldProps - extends BaseSingleInputPickersTextFieldProps, - Omit< - React.HTMLAttributes, - keyof BaseSingleInputPickersTextFieldProps - > {} +interface BrowserSingleInputDateRangeFieldProps extends DateRangePickerFieldProps {} + +type BrowserSingleInputDateRangeFieldComponent = (( + props: BrowserSingleInputDateRangeFieldProps & React.RefAttributes, +) => React.JSX.Element) & { fieldType?: FieldType }; + +const BrowserSingleInputDateRangeField = React.forwardRef( + (props: BrowserSingleInputDateRangeFieldProps, ref: React.Ref) => { + const fieldResponse = useSingleInputDateRangeField(props); -const BrowserTextField = React.forwardRef( - (props: BrowserTextFieldProps, ref: React.Ref) => { const { // Should be ignored enableAccessibleFieldDOMStructure, @@ -64,6 +63,10 @@ const BrowserTextField = React.forwardRef( onChange, value, + // Can be passed to the button that clears the value + onClear, + clearable, + // Can be used to render a custom label label, @@ -78,12 +81,19 @@ const BrowserTextField = React.forwardRef( // The rest can be passed to the root element ...other - } = props; + } = fieldResponse; + const pickerContext = usePickerContext(); const handleRef = useForkRef(InputPropsRef, ref); return ( - + {startAdornment} {endAdornment} - - ); - }, -); - -interface BrowserSingleInputDateRangeFieldProps extends DateRangePickerFieldProps {} - -type BrowserSingleInputDateRangeFieldComponent = (( - props: BrowserSingleInputDateRangeFieldProps & React.RefAttributes, -) => React.JSX.Element) & { fieldType?: FieldType }; - -const BrowserSingleInputDateRangeField = React.forwardRef( - (props: BrowserSingleInputDateRangeFieldProps, ref: React.Ref) => { - const { slots, slotProps, ...other } = props; - - const pickerContext = usePickerContext(); - const handleTogglePicker = (event: React.UIEvent) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - - const textFieldProps: typeof props = useSlotProps({ - elementType: 'input', - externalSlotProps: slotProps?.textField, - externalForwardedProps: other, - ownerState: props as any, - }); - - textFieldProps.InputProps = { - ...textFieldProps.InputProps, - endAdornment: ( - + pickerContext.setOpen((prev) => !prev)}> - ), - }; - - const fieldResponse = useSingleInputDateRangeField( - textFieldProps, - ); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ( - + ); }, ) as BrowserSingleInputDateRangeFieldComponent; diff --git a/docs/data/date-pickers/custom-field/JoyV6Field.js b/docs/data/date-pickers/custom-field/JoyV6Field.js index 9d6802c1ecef0..156d8200c2f5f 100644 --- a/docs/data/date-pickers/custom-field/JoyV6Field.js +++ b/docs/data/date-pickers/custom-field/JoyV6Field.js @@ -17,53 +17,41 @@ import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { DatePicker } from '@mui/x-date-pickers/DatePicker'; import { unstable_useDateField as useDateField } from '@mui/x-date-pickers/DateField'; -import { useClearableField } from '@mui/x-date-pickers/hooks'; const joyTheme = extendJoyTheme(); -const JoyField = React.forwardRef((props, ref) => { +const JoyDateField = React.forwardRef((props, ref) => { + const fieldResponse = useDateField({ + ...props, + enableAccessibleFieldDOMStructure: false, + }); + const { // Should be ignored enableAccessibleFieldDOMStructure, + // Can be passed to the button that clears the value + onClear, + clearable, disabled, id, label, InputProps: { ref: containerRef, startAdornment, endAdornment } = {}, - formControlSx, - endDecorator, - startDecorator, - slotProps, inputRef, + slots, + slotProps, ...other - } = props; + } = fieldResponse; return ( - + {label} - {startAdornment} - {startDecorator} - - } - endDecorator={ - - {endAdornment} - {endDecorator} - - } + startDecorator={startAdornment} + endDecorator={endAdornment} slotProps={{ - ...slotProps, - root: { ...slotProps?.root, ref: containerRef }, - input: { ...slotProps?.input, ref: inputRef }, + input: { ref: inputRef }, }} {...other} /> @@ -71,39 +59,12 @@ const JoyField = React.forwardRef((props, ref) => { ); }); -const JoyDateField = React.forwardRef((props, ref) => { - const { slots, slotProps, ...textFieldProps } = props; - - const fieldResponse = useDateField({ - ...textFieldProps, - enableAccessibleFieldDOMStructure: false, - }); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ; -}); - const JoyDatePicker = React.forwardRef((props, ref) => { return ( ); }); @@ -129,11 +90,7 @@ export default function JoyV6Field() { - + diff --git a/docs/data/date-pickers/custom-field/JoyV6Field.tsx b/docs/data/date-pickers/custom-field/JoyV6Field.tsx index 50b0fabe3c093..9e30ca9e0b717 100644 --- a/docs/data/date-pickers/custom-field/JoyV6Field.tsx +++ b/docs/data/date-pickers/custom-field/JoyV6Field.tsx @@ -10,7 +10,7 @@ import { CssVarsProvider, THEME_ID, } from '@mui/joy/styles'; -import Input, { InputProps } from '@mui/joy/Input'; +import Input from '@mui/joy/Input'; import FormControl from '@mui/joy/FormControl'; import FormLabel from '@mui/joy/FormLabel'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; @@ -21,97 +21,50 @@ import { DatePickerProps, } from '@mui/x-date-pickers/DatePicker'; import { unstable_useDateField as useDateField } from '@mui/x-date-pickers/DateField'; -import { useClearableField } from '@mui/x-date-pickers/hooks'; const joyTheme = extendJoyTheme(); -interface JoyFieldProps extends InputProps { - label?: React.ReactNode; - inputRef?: React.Ref; - enableAccessibleFieldDOMStructure?: boolean; - InputProps?: { - ref?: React.Ref; - endAdornment?: React.ReactNode; - startAdornment?: React.ReactNode; - }; - formControlSx?: InputProps['sx']; -} - -type JoyFieldComponent = (( - props: JoyFieldProps & React.RefAttributes, -) => React.JSX.Element) & { propTypes?: any }; +const JoyDateField = React.forwardRef( + (props: DatePickerFieldProps, ref: React.Ref) => { + const fieldResponse = useDateField({ + ...props, + enableAccessibleFieldDOMStructure: false, + }); -const JoyField = React.forwardRef( - (props: JoyFieldProps, ref: React.Ref) => { const { // Should be ignored enableAccessibleFieldDOMStructure, + // Can be passed to the button that clears the value + onClear, + clearable, + disabled, id, label, InputProps: { ref: containerRef, startAdornment, endAdornment } = {}, - formControlSx, - endDecorator, - startDecorator, - slotProps, inputRef, + slots, + slotProps, ...other - } = props; + } = fieldResponse; return ( - + {label} - {startAdornment} - {startDecorator} - - } - endDecorator={ - - {endAdornment} - {endDecorator} - - } + startDecorator={startAdornment} + endDecorator={endAdornment} slotProps={{ - ...slotProps, - root: { ...slotProps?.root, ref: containerRef }, - input: { ...slotProps?.input, ref: inputRef }, + input: { ref: inputRef }, }} {...other} /> ); }, -) as JoyFieldComponent; - -const JoyDateField = React.forwardRef( - (props: DatePickerFieldProps, ref: React.Ref) => { - const { slots, slotProps, ...textFieldProps } = props; - - const fieldResponse = useDateField({ - ...textFieldProps, - enableAccessibleFieldDOMStructure: false, - }); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ; - }, ); const JoyDatePicker = React.forwardRef( @@ -121,15 +74,6 @@ const JoyDatePicker = React.forwardRef( ref={ref} {...props} slots={{ ...props.slots, field: JoyDateField }} - slotProps={{ - ...props.slotProps, - field: { - ...props.slotProps?.field, - formControlSx: { - flexDirection: 'row', - }, - } as any, - }} /> ); }, @@ -156,11 +100,7 @@ export default function JoyV6Field() { - + diff --git a/docs/data/date-pickers/custom-field/JoyV6Field.tsx.preview b/docs/data/date-pickers/custom-field/JoyV6Field.tsx.preview index cff735f8a7af0..d1fc44acb736c 100644 --- a/docs/data/date-pickers/custom-field/JoyV6Field.tsx.preview +++ b/docs/data/date-pickers/custom-field/JoyV6Field.tsx.preview @@ -2,11 +2,7 @@ - + \ No newline at end of file diff --git a/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.js b/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.js index dd5ee96d6f52a..69123038f8508 100644 --- a/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.js +++ b/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.js @@ -4,63 +4,66 @@ import { useColorScheme as useMaterialColorScheme, Experimental_CssVarsProvider as MaterialCssVarsProvider, } from '@mui/material/styles'; -import useSlotProps from '@mui/utils/useSlotProps'; import { extendTheme as extendJoyTheme, useColorScheme, CssVarsProvider, THEME_ID, } from '@mui/joy/styles'; +import { createSvgIcon } from '@mui/joy/utils'; import Input from '@mui/joy/Input'; import FormControl from '@mui/joy/FormControl'; import FormLabel from '@mui/joy/FormLabel'; -import IconButton from '@mui/joy/IconButton'; -import { DateRangeIcon } from '@mui/x-date-pickers/icons'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { DateRangePicker } from '@mui/x-date-pickers-pro/DateRangePicker'; import { unstable_useSingleInputDateRangeField as useSingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; -import { useClearableField, usePickerContext } from '@mui/x-date-pickers/hooks'; + +export const DateRangeIcon = createSvgIcon( + , + 'DateRange', +); const joyTheme = extendJoyTheme(); -const JoyField = React.forwardRef((props, ref) => { +const JoySingleInputDateRangeField = React.forwardRef((props, ref) => { + const fieldResponse = useSingleInputDateRangeField({ + ...props, + enableAccessibleFieldDOMStructure: false, + }); + const { // Should be ignored enableAccessibleFieldDOMStructure, + // Can be passed to the button that clears the value + onClear, + clearable, disabled, id, label, - InputProps: { ref: containerRef, startAdornment, endAdornment } = {}, - endDecorator, - startDecorator, - slotProps, + InputProps: { ref: containerRef } = {}, inputRef, + slots, + slotProps, ...other - } = props; + } = fieldResponse; return ( - + {label} - {startAdornment} - {startDecorator} - - } - endDecorator={ - - {endAdornment} - {endDecorator} - - } + endDecorator={} slotProps={{ - ...slotProps, - root: { ...slotProps?.root, ref: containerRef }, - input: { ...slotProps?.input, ref: inputRef }, + input: { ref: inputRef }, }} {...other} /> @@ -68,55 +71,6 @@ const JoyField = React.forwardRef((props, ref) => { ); }); -const JoySingleInputDateRangeField = React.forwardRef((props, ref) => { - const { slots, slotProps, ...other } = props; - - const pickerContext = usePickerContext(); - const handleTogglePicker = (event) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - - const textFieldProps = useSlotProps({ - elementType: FormControl, - externalSlotProps: slotProps?.textField, - externalForwardedProps: other, - ownerState: props, - }); - - const fieldResponse = useSingleInputDateRangeField({ - ...textFieldProps, - enableAccessibleFieldDOMStructure: false, - }); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ( - - - - } - /> - ); -}); - JoySingleInputDateRangeField.fieldType = 'single-input'; const JoySingleInputDateRangePicker = React.forwardRef((props, ref) => { @@ -150,11 +104,7 @@ export default function JoyV6SingleInputRangeField() { - + diff --git a/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx b/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx index 36d33af92f980..822610feac08b 100644 --- a/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx +++ b/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx @@ -4,18 +4,16 @@ import { useColorScheme as useMaterialColorScheme, Experimental_CssVarsProvider as MaterialCssVarsProvider, } from '@mui/material/styles'; -import useSlotProps from '@mui/utils/useSlotProps'; import { extendTheme as extendJoyTheme, useColorScheme, CssVarsProvider, THEME_ID, } from '@mui/joy/styles'; -import Input, { InputProps } from '@mui/joy/Input'; +import { createSvgIcon } from '@mui/joy/utils'; +import Input from '@mui/joy/Input'; import FormControl from '@mui/joy/FormControl'; import FormLabel from '@mui/joy/FormLabel'; -import IconButton from '@mui/joy/IconButton'; -import { DateRangeIcon } from '@mui/x-date-pickers/icons'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { @@ -24,129 +22,66 @@ import { DateRangePickerProps, } from '@mui/x-date-pickers-pro/DateRangePicker'; import { unstable_useSingleInputDateRangeField as useSingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; -import { useClearableField, usePickerContext } from '@mui/x-date-pickers/hooks'; import { FieldType } from '@mui/x-date-pickers-pro/models'; +export const DateRangeIcon = createSvgIcon( + , + 'DateRange', +); + const joyTheme = extendJoyTheme(); -interface JoyFieldProps extends InputProps { - label?: React.ReactNode; - inputRef?: React.Ref; - enableAccessibleFieldDOMStructure?: boolean; - InputProps?: { - ref?: React.Ref; - endAdornment?: React.ReactNode; - startAdornment?: React.ReactNode; - }; -} +type JoySingleInputDateRangeFieldComponent = (( + props: DateRangePickerFieldProps & React.RefAttributes, +) => React.JSX.Element) & { fieldType?: FieldType }; -type JoyFieldComponent = (( - props: JoyFieldProps & React.RefAttributes, -) => React.JSX.Element) & { propTypes?: any }; +const JoySingleInputDateRangeField = React.forwardRef( + (props: DateRangePickerFieldProps, ref: React.Ref) => { + const fieldResponse = useSingleInputDateRangeField({ + ...props, + enableAccessibleFieldDOMStructure: false, + }); -const JoyField = React.forwardRef( - (props: JoyFieldProps, ref: React.Ref) => { const { // Should be ignored enableAccessibleFieldDOMStructure, + // Can be passed to the button that clears the value + onClear, + clearable, + disabled, id, label, - InputProps: { ref: containerRef, startAdornment, endAdornment } = {}, - endDecorator, - startDecorator, - slotProps, + InputProps: { ref: containerRef } = {}, inputRef, + slots, + slotProps, ...other - } = props; + } = fieldResponse; return ( - + {label} - {startAdornment} - {startDecorator} - - } - endDecorator={ - - {endAdornment} - {endDecorator} - - } + endDecorator={} slotProps={{ - ...slotProps, - root: { ...slotProps?.root, ref: containerRef }, - input: { ...slotProps?.input, ref: inputRef }, + input: { ref: inputRef }, }} {...other} /> ); }, -) as JoyFieldComponent; - -interface JoySingleInputDateRangeFieldProps - extends DateRangePickerFieldProps {} - -type JoySingleInputDateRangeFieldComponent = (( - props: JoySingleInputDateRangeFieldProps & React.RefAttributes, -) => React.JSX.Element) & { fieldType?: FieldType }; - -const JoySingleInputDateRangeField = React.forwardRef( - (props: JoySingleInputDateRangeFieldProps, ref: React.Ref) => { - const { slots, slotProps, ...other } = props; - - const pickerContext = usePickerContext(); - const handleTogglePicker = (event: React.UIEvent) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - - const textFieldProps: JoySingleInputDateRangeFieldProps = useSlotProps({ - elementType: FormControl, - externalSlotProps: slotProps?.textField, - externalForwardedProps: other, - ownerState: props as any, - }); - - const fieldResponse = useSingleInputDateRangeField< - false, - JoySingleInputDateRangeFieldProps - >({ ...textFieldProps, enableAccessibleFieldDOMStructure: false }); - - /* If you don't need a clear button, you can skip the use of this hook */ - const processedFieldProps = useClearableField({ - ...fieldResponse, - slots, - slotProps, - }); - - return ( - - - - } - /> - ); - }, ) as JoySingleInputDateRangeFieldComponent; JoySingleInputDateRangeField.fieldType = 'single-input'; @@ -184,11 +119,7 @@ export default function JoyV6SingleInputRangeField() { - + diff --git a/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx.preview b/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx.preview index 90b0c5ff3c08f..b2b8613af3c6d 100644 --- a/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx.preview +++ b/docs/data/date-pickers/custom-field/JoyV6SingleInputRangeField.tsx.preview @@ -2,11 +2,7 @@ - + \ No newline at end of file diff --git a/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.js b/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.js index f9306981aac0c..0e30e8d2605aa 100644 --- a/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.js +++ b/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.js @@ -34,14 +34,6 @@ function ButtonDateField(props) { props: internalProps, }); - const handleTogglePicker = (event) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - const valueStr = value == null ? parsedFormat : value.format(format); return ( @@ -50,7 +42,7 @@ function ButtonDateField(props) { variant="outlined" color={hasValidationError ? 'error' : 'primary'} ref={InputProps?.ref} - onClick={handleTogglePicker} + onClick={() => pickerContext.setOpen((prev) => !prev)} > {label ? `${label}: ${valueStr}` : valueStr} diff --git a/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.tsx b/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.tsx index ac64ebd3a5f01..1da1b675decd7 100644 --- a/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.tsx +++ b/docs/data/date-pickers/custom-field/behavior-button/MaterialDatePicker.tsx @@ -38,14 +38,6 @@ function ButtonDateField(props: DatePickerFieldProps) { props: internalProps, }); - const handleTogglePicker = (event: React.UIEvent) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - const valueStr = value == null ? parsedFormat : value.format(format); return ( @@ -54,7 +46,7 @@ function ButtonDateField(props: DatePickerFieldProps) { variant="outlined" color={hasValidationError ? 'error' : 'primary'} ref={InputProps?.ref} - onClick={handleTogglePicker} + onClick={() => pickerContext.setOpen((prev) => !prev)} > {label ? `${label}: ${valueStr}` : valueStr} diff --git a/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.js b/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.js index 7c56f7a2693a0..0884deadb8b48 100644 --- a/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.js +++ b/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.js @@ -36,14 +36,6 @@ function ButtonDateRangeField(props) { props: internalProps, }); - const handleTogglePicker = (event) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - const formattedValue = (value ?? [null, null]) .map((date) => (date == null ? parsedFormat : date.format(format))) .join(' – '); @@ -54,7 +46,7 @@ function ButtonDateRangeField(props) { variant="outlined" color={hasValidationError ? 'error' : 'primary'} ref={InputProps?.ref} - onClick={handleTogglePicker} + onClick={() => pickerContext.setOpen((prev) => !prev)} > {label ? `${label}: ${formattedValue}` : formattedValue} diff --git a/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.tsx b/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.tsx index fbc0cd45c51ee..9361a51c256a1 100644 --- a/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.tsx +++ b/docs/data/date-pickers/custom-field/behavior-button/MaterialDateRangePicker.tsx @@ -40,14 +40,6 @@ function ButtonDateRangeField(props: DateRangePickerFieldProps) { props: internalProps, }); - const handleTogglePicker = (event: React.UIEvent) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - const formattedValue = (value ?? [null, null]) .map((date: Dayjs) => (date == null ? parsedFormat : date.format(format))) .join(' – '); @@ -58,7 +50,7 @@ function ButtonDateRangeField(props: DateRangePickerFieldProps) { variant="outlined" color={hasValidationError ? 'error' : 'primary'} ref={InputProps?.ref} - onClick={handleTogglePicker} + onClick={() => pickerContext.setOpen((prev) => !prev)} > {label ? `${label}: ${formattedValue}` : formattedValue} diff --git a/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.js b/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.js index 1e7d773f6fdf6..c5637b320e0ed 100644 --- a/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.js +++ b/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.js @@ -26,14 +26,6 @@ function ReadOnlyDateField(props) { props: internalProps, }); - const handleTogglePicker = (event) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - return ( pickerContext.setOpen((prev) => !prev)} /> ); } diff --git a/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.tsx b/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.tsx index 1fd235a778199..a42da5e10407c 100644 --- a/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.tsx +++ b/docs/data/date-pickers/custom-field/behavior-read-only-text-field/MaterialDatePicker.tsx @@ -30,14 +30,6 @@ function ReadOnlyDateField(props: DatePickerFieldProps) { props: internalProps, }); - const handleTogglePicker = (event: React.UIEvent) => { - if (pickerContext.open) { - pickerContext.onClose(event); - } else { - pickerContext.onOpen(event); - } - }; - return ( pickerContext.setOpen((prev) => !prev)} /> ); } diff --git a/docs/data/date-pickers/custom-opening-button/custom-opening-button.md b/docs/data/date-pickers/custom-opening-button/custom-opening-button.md index 21f4b44eeda54..c0ef70d69eb9f 100644 --- a/docs/data/date-pickers/custom-opening-button/custom-opening-button.md +++ b/docs/data/date-pickers/custom-opening-button/custom-opening-button.md @@ -46,7 +46,7 @@ In the example below, the warning icon will be visible anytime the current value {{"demo": "AddWarningIconWhenInvalid.js"}} -To add the same behavior to a picker that do not have an input adornment (e.g: Date Range Picker), +To add the same behavior to a picker that do not have an input adornment (for example Date Range Picker), you need to use the `textField` slot to add one: {{"demo": "AddWarningIconWhenInvalidRange.js"}} diff --git a/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.js b/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.js index ab660eb554b93..e102430740bdc 100644 --- a/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.js +++ b/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.js @@ -1,4 +1,5 @@ import * as React from 'react'; + import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; diff --git a/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.tsx b/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.tsx index 68995de41ed1d..6465a9a84a039 100644 --- a/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.tsx +++ b/docs/data/date-pickers/fields/ControlledSelectedSectionsSingleInputRangeField.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { Dayjs } from 'dayjs'; import Typography from '@mui/material/Typography'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; @@ -9,14 +10,14 @@ import { FieldSelectedSections, FieldRef, } from '@mui/x-date-pickers/models'; -import { RangeFieldSection, RangePosition } from '@mui/x-date-pickers-pro/models'; +import { DateRange, RangePosition } from '@mui/x-date-pickers-pro/models'; import { SingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; export default function ControlledSelectedSectionsSingleInputRangeField() { const [selectedSections, setSelectedSections] = React.useState(null); const inputRef = React.useRef(null); - const fieldRef = React.useRef>(null); + const fieldRef = React.useRef>>(null); const setSelectedSectionType = ( selectedSectionType: FieldSectionType, diff --git a/docs/data/date-pickers/lifecycle/lifecycle.md b/docs/data/date-pickers/lifecycle/lifecycle.md index b5ee50f1d8281..4d4bf1bc62ecf 100644 --- a/docs/data/date-pickers/lifecycle/lifecycle.md +++ b/docs/data/date-pickers/lifecycle/lifecycle.md @@ -174,10 +174,10 @@ Take a look at the [dedicated section](/x/react-date-pickers/lifecycle/#lifecycl If the component is controlled (i.e: if it has a `value` prop), clicking on a value will call `onChange` if the value to publish is different from the current value -(e.g: clicking on the already selected day in the `day` view will not call `onChange`). +(for example clicking on the already selected day in the `day` view will not call `onChange`). If the component is not controlled, the behavior is the same, except if no value has ever been published, in which case clicking on the current value will fire `onChange` -(e.g: clicking on the already selected day in the `day` view will call `onChange` if `onChange` has never been called before). +(for example clicking on the already selected day in the `day` view will call `onChange` if `onChange` has never been called before). Some views can decide not to call `onChange` for some value modifications. The most common example is the mobile time views (using the [`TimeClock`](/x/react-date-pickers/time-clock/) component). diff --git a/docs/data/date-pickers/localization/data.json b/docs/data/date-pickers/localization/data.json index 14a69bf378d62..6874c9a28d40a 100644 --- a/docs/data/date-pickers/localization/data.json +++ b/docs/data/date-pickers/localization/data.json @@ -227,7 +227,7 @@ "languageTag": "ro-RO", "importName": "roRO", "localeName": "Romanian", - "missingKeysCount": 14, + "missingKeysCount": 0, "totalKeysCount": 50, "githubLink": "https://github.com/mui/mui-x/blob/master/packages/x-date-pickers/src/locales/roRO.ts" }, diff --git a/docs/data/date-pickers/overview/overview.md b/docs/data/date-pickers/overview/overview.md index f3cd40be4bc75..97a9cd80382b2 100644 --- a/docs/data/date-pickers/overview/overview.md +++ b/docs/data/date-pickers/overview/overview.md @@ -17,6 +17,7 @@ waiAria: https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/examples/datepick {{"component": "modules/components/overview/FeatureHighlight.tsx"}} {{"component": "modules/components/overview/CommunityOrPro.tsx"}} +{{"component": "modules/components/overview/Customization.tsx"}} {{"component": "modules/components/overview/Keyboard.tsx"}} {{"component": "modules/components/overview/Internationalization.tsx"}} {{"component": "modules/components/overview/DateLibraries.tsx"}} diff --git a/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.js b/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.js index 31c77d7d74203..478f2dcb54553 100644 --- a/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.js +++ b/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.js @@ -1,10 +1,10 @@ import * as React from 'react'; +import dayjs from 'dayjs'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import Chip from '@mui/material/Chip'; import Divider from '@mui/material/Divider'; import Box from '@mui/material/Box'; -import dayjs from 'dayjs'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { StaticDateRangePicker } from '@mui/x-date-pickers-pro/StaticDateRangePicker'; diff --git a/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.tsx b/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.tsx index 3e3d6fda53c99..87530990c3a87 100644 --- a/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.tsx +++ b/docs/data/date-pickers/shortcuts/CustomizedRangeShortcuts.tsx @@ -1,10 +1,10 @@ import * as React from 'react'; +import dayjs, { Dayjs } from 'dayjs'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import Chip from '@mui/material/Chip'; import Divider from '@mui/material/Divider'; import Box from '@mui/material/Box'; -import dayjs, { Dayjs } from 'dayjs'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { StaticDateRangePicker } from '@mui/x-date-pickers-pro/StaticDateRangePicker'; diff --git a/docs/data/migration/migration-charts-v7/migration-charts-v7.md b/docs/data/migration/migration-charts-v7/migration-charts-v7.md index edf12e491db7e..72a8ce9490119 100644 --- a/docs/data/migration/migration-charts-v7/migration-charts-v7.md +++ b/docs/data/migration/migration-charts-v7/migration-charts-v7.md @@ -128,3 +128,20 @@ If you used axes in a pie chart please open an issue, we would be curious to get The `resolveSizeBeforeRender` prop has been removed from all components. If you were using this prop, you can safely remove it. + +## Rename `labelFontSize` and `tickFontSize` props ✅ + +The `labelFontSize` and `tickFontSize` props have been removed in favor of the style objects `labelStyle` and `tickStyle` respectively. + +```diff + +``` diff --git a/docs/data/migration/migration-data-grid-v7/migration-data-grid-v7.md b/docs/data/migration/migration-data-grid-v7/migration-data-grid-v7.md index db1f4b384786d..55cf6c15cc357 100644 --- a/docs/data/migration/migration-data-grid-v7/migration-data-grid-v7.md +++ b/docs/data/migration/migration-data-grid-v7/migration-data-grid-v7.md @@ -1,4 +1,5 @@ --- +title: React Data Grid - Migration from v7 to v8 productId: x-data-grid --- @@ -35,25 +36,51 @@ Below are described the steps you need to make to migrate from v7 to v8. ### Selection +- The default value of the `rowSelectionPropagation` prop has been changed to `{ parents: true, descendants: true }` which means that the selection will be propagated to the parents and descendants by default. + To revert to the previous behavior, pass `rowSelectionPropagation={{ parents: false, descendants: false }}`. - The prop `indeterminateCheckboxAction` has been removed. Clicking on an indeterminate checkbox "selects" the unselected descendants. +- The "Select all" checkbox would now be checked when all the selectable rows are selected, ignoring rows that are not selectable because of the `isRowSelectable` prop. - + ```bash -npx @mui/x-codemod@latest v8.0.0/preset-safe +npx @mui/x-codemod@next v8.0.0/preset-safe ``` The corresponding sub-sections are listed below - [`preset-safe-for-tree-view`](#preset-safe-for-tree-view-v800) - [`preset-safe-for-charts`](#preset-safe-for-charts-v800) +- [`preset-safe-for-data-grid`](#preset-safe-for-data-grid-v800) +- [`preset-safe-for-pickers`](#preset-safe-for-pickers-v800) ### Tree View codemods -#### `preset-safe` for tree view v8.0.0 +#### `preset-safe` for Tree View v8.0.0 -The `preset-safe` codemods for tree view. +The `preset-safe` codemods for Tree View. + + ```bash -npx @mui/x-codemod@latest v8.0.0/tree-view/preset-safe +npx @mui/x-codemod@next v8.0.0/tree-view/preset-safe ``` The list includes these transformers @@ -101,13 +107,13 @@ Renames the Tree View component to Simple Tree View -import { TreeView } from '@mui/x-tree-view/TreeView'; +import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; - return ( -- -+ - -- -+ - ); + return ( +- ++ + +- ++ + ); ``` #### `rename-tree-item-2` @@ -124,28 +130,31 @@ Renames the `TreeItem2` component to `TreeItem` (same for any subcomponents or u ### Charts codemods -#### `preset-safe` for charts v8.0.0 +#### `preset-safe` for Charts v8.0.0 + +The `preset-safe` codemods for Charts. -The `preset-safe` codemods for charts. + ```bash -npx @mui/x-codemod@latest v8.0.0/charts/preset-safe +npx @mui/x-codemod@next v8.0.0/charts/preset-safe ``` The list includes these transformers - [`rename-legend-to-slots-legend`](#rename-legend-to-slots-legend) - [`rename-responsive-chart-container`](#rename-responsive-chart-container) +- [`rename-label-and-tick-font-size`](#rename-label-and-tick-font-size) #### `rename-legend-to-slots-legend` Renames legend props to the corresponding slotProps. ```diff - + ``` #### `rename-responsive-chart-container` @@ -153,14 +162,14 @@ Renames legend props to the corresponding slotProps. Renames `ResponsiveChartContainer` and `ResponsiveChartContainerPro` by `ChartContainer` and `ChartContainerPro` which have the same behavior in v8. ```diff -- import { ResponsiveChartContainer } from '@mui/x-charts/ResponsiveChartContainer'; -+ import { ChartContainer } from '@mui/x-charts/ChartContainer'; +-import { ResponsiveChartContainer } from '@mui/x-charts/ResponsiveChartContainer'; ++import { ChartContainer } from '@mui/x-charts/ChartContainer'; -- -+ +- ++ -- -+ +- ++ ``` :::warning @@ -169,12 +178,101 @@ Verify the git diff to remove the duplicate. ```diff import { ChartContainer } from '@mui/x-charts/ChartContainer'; -- import { ResponsiveChartContainer } from '@mui/x-charts/ResponsiveChartContainer'; -+ import { ChartContainer } from '@mui/x-charts/ChartContainer'; +-import { ResponsiveChartContainer } from '@mui/x-charts/ResponsiveChartContainer'; ++import { ChartContainer } from '@mui/x-charts/ChartContainer'; ``` ::: +#### `rename-label-and-tick-font-size` + +Renames `labelFontSize` and `tickFontSize` props to the corresponding `xxxStyle` prop. + +```diff + +``` + +### Data Grid codemods + +#### `preset-safe` for Data Grid v8.0.0 + +The `preset-safe` codemods for Data Grid. + + + +```bash +npx @mui/x-codemod@next v8.0.0/data-grid/preset-safe +``` + +The list includes these transformers + +- [`remove-stabilized-v8-experimentalFeatures`](#remove-stabilized-v8-experimentalFeatures) + +#### `remove-stabilized-v8-experimentalFeatures` + +Remove feature flags for stabilized `experimentalFeatures`. + +```diff + +``` + + + +```bash +npx @mui/x-codemod@next v8.0.0/data-grid/remove-stabilized-experimentalFeatures +``` + +### Pickers codemods + +#### `preset-safe` for Pickers v8.0.0 + +The `preset-safe` codemods for Pickers. + + + +```bash +npx @mui/x-codemod@next v8.0.0/pickers/preset-safe +``` + +The list includes these transformers + +- [`rename-and-move-field-value-type`](#rename-and-move-field-value-type) + +#### `rename-and-move-field-value-type` + +Renames `FieldValueType` to `PickerValueType`. + +```diff +-import { FieldValueType } from '@mui/x-date-pickers'; ++import { PickerValueType } from '@mui/x-date-pickers'; + + interface MyComponentProps { +- valueType: FieldValueType; ++ valueType: PickerValueType; + foo: string; + bar: number; + } +``` + + + +```bash +npx @mui/x-codemod@next v8.0.0/pickers/rename-and-move-field-value-type +``` + ## v7.0.0 ### 🚀 `preset-safe` for v7.0.0 @@ -196,9 +294,9 @@ The corresponding sub-sections are listed below ### Pickers codemods -#### `preset-safe` for pickers v7.0.0 +#### `preset-safe` for Pickers v7.0.0 -The `preset-safe` codemods for pickers. +The `preset-safe` codemods for Pickers. ```bash npx @mui/x-codemod@latest v7.0.0/pickers/preset-safe @@ -375,13 +473,13 @@ Renames the Tree View component to Simple Tree View -import { TreeView } from '@mui/x-tree-view/TreeView'; +import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; - return ( -- -+ - -- -+ - ); + return ( +- ++ + +- ++ + ); ``` #### `rename-use-tree-item` @@ -497,9 +595,9 @@ The corresponding sub-sections are listed below ### Pickers codemods -#### `preset-safe` for pickers v6.0.0 +#### `preset-safe` for Pickers v6.0.0 -The `preset-safe` codemods for pickers. +The `preset-safe` codemods for Pickers. ```bash npx @mui/x-codemod@latest v6.0.0/pickers/preset-safe diff --git a/packages/x-codemod/package.json b/packages/x-codemod/package.json index 76e4e92fa12d2..1f5bbd2668bd9 100644 --- a/packages/x-codemod/package.json +++ b/packages/x-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-codemod", - "version": "8.0.0-alpha.1", + "version": "8.0.0-alpha.3", "bin": "./codemod.js", "private": false, "author": "MUI Team", @@ -34,7 +34,7 @@ "dependencies": { "@babel/core": "^7.26.0", "@babel/runtime": "^7.26.0", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.4", "@mui/x-internals": "workspace:*", "jscodeshift": "17.1.1", "yargs": "^17.7.2" diff --git a/packages/x-codemod/src/v8.0.0/charts/preset-safe/actual.spec.tsx b/packages/x-codemod/src/v8.0.0/charts/preset-safe/actual.spec.tsx index 40aecf34651aa..849585a97e2fb 100644 --- a/packages/x-codemod/src/v8.0.0/charts/preset-safe/actual.spec.tsx +++ b/packages/x-codemod/src/v8.0.0/charts/preset-safe/actual.spec.tsx @@ -3,6 +3,7 @@ import * as React from 'react'; import { PieChart } from '@mui/x-charts/PieChart'; import { BarPlot } from '@mui/x-charts/BarChart'; import { ResponsiveChartContainer } from '@mui/x-charts/ResponsiveChartContainer'; +import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; // prettier-ignore
@@ -11,4 +12,17 @@ import { ResponsiveChartContainer } from '@mui/x-charts/ResponsiveChartContainer + + +
; diff --git a/packages/x-codemod/src/v8.0.0/charts/preset-safe/expected.spec.tsx b/packages/x-codemod/src/v8.0.0/charts/preset-safe/expected.spec.tsx index 6f80f49b4e3a2..139cad04ca12c 100644 --- a/packages/x-codemod/src/v8.0.0/charts/preset-safe/expected.spec.tsx +++ b/packages/x-codemod/src/v8.0.0/charts/preset-safe/expected.spec.tsx @@ -3,6 +3,7 @@ import * as React from 'react'; import { PieChart } from '@mui/x-charts/PieChart'; import { BarPlot } from '@mui/x-charts/BarChart'; import { ChartContainer } from '@mui/x-charts/ChartContainer'; +import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; // prettier-ignore
@@ -18,4 +19,29 @@ import { ChartContainer } from '@mui/x-charts/ChartContainer'; + + +
; diff --git a/packages/x-codemod/src/v8.0.0/charts/preset-safe/index.ts b/packages/x-codemod/src/v8.0.0/charts/preset-safe/index.ts index e862d1d084a2e..3fdc6150db550 100644 --- a/packages/x-codemod/src/v8.0.0/charts/preset-safe/index.ts +++ b/packages/x-codemod/src/v8.0.0/charts/preset-safe/index.ts @@ -1,11 +1,13 @@ import transformLegendToSlots from '../rename-legend-to-slots-legend'; import transformRemoveResponsiveContainer from '../rename-responsive-chart-container'; +import transformRenameLabelAndTickFontSize from '../rename-label-and-tick-font-size'; import { JsCodeShiftAPI, JsCodeShiftFileInfo } from '../../../types'; export default function transformer(file: JsCodeShiftFileInfo, api: JsCodeShiftAPI, options: any) { file.source = transformLegendToSlots(file, api, options); file.source = transformRemoveResponsiveContainer(file, api, options); + file.source = transformRenameLabelAndTickFontSize(file, api, options); return file.source; } diff --git a/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/actual.spec.tsx b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/actual.spec.tsx new file mode 100644 index 0000000000000..0bf12b0e855d8 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/actual.spec.tsx @@ -0,0 +1,20 @@ +// @ts-nocheck +import * as React from 'react'; +import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; + +// prettier-ignore +
+ + + +
; diff --git a/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/expected.spec.tsx b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/expected.spec.tsx new file mode 100644 index 0000000000000..6ff9ea963b5da --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/expected.spec.tsx @@ -0,0 +1,32 @@ +// @ts-nocheck +import * as React from 'react'; +import { ChartsXAxis } from '@mui/x-charts/ChartsXAxis'; + +// prettier-ignore +
+ + + +
; diff --git a/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/index.ts b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/index.ts new file mode 100644 index 0000000000000..cc8380692d079 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/index.ts @@ -0,0 +1,92 @@ +import { JsCodeShiftAPI, JsCodeShiftFileInfo } from '../../../types'; +import { transformNestedProp } from '../../../util/addComponentsSlots'; +/** + * @param {import('jscodeshift').FileInfo} file + * @param {import('jscodeshift').API} api + */ +export default function transformer(file: JsCodeShiftFileInfo, api: JsCodeShiftAPI, options: any) { + const j = api.jscodeshift; + + const printOptions = options.printOptions; + + const root = j(file.source); + + root + .find(j.ImportDeclaration) + .filter(({ node }) => { + return typeof node.source.value === 'string' && node.source.value.startsWith('@mui/x-charts'); + }) + .forEach((path) => { + path.node.specifiers?.forEach((node) => { + root.findJSXElements(node.local?.name).forEach((elementPath) => { + if (elementPath.node.type !== 'JSXElement') { + return; + } + + ['label', 'tick'].forEach((attributeName) => { + const attributeValue = elementPath.node.openingElement.attributes?.find( + (elementNode) => + elementNode.type === 'JSXAttribute' && + elementNode.name.name === `${attributeName}FontSize`, + ); + + if (!attributeValue) { + return; + } + + const attributeStyle = elementPath.node.openingElement.attributes?.find( + (elementNode) => + elementNode.type === 'JSXAttribute' && + elementNode.name.name === `${attributeName}Style`, + ); + + // @ts-ignore receives an object. + const styleValue = attributeStyle?.value.expression.properties.find( + (prop) => prop.key.name === 'fontSize', + ); + + if (attributeStyle === null) { + // We create a new "style" object + elementPath.node.openingElement.attributes?.push( + j.jsxAttribute( + j.jsxIdentifier(`${attributeName}Style`), + j.jsxExpressionContainer( + j.objectExpression([ + j.objectProperty( + j.identifier('fontSize'), + // @ts-ignore receives an object. + attributeValue.value.expression, + ), + ]), + ), + ), + ); + } else { + transformNestedProp( + elementPath, + `${attributeName}Style`, + 'fontSize', + // @ts-ignore receives an object. + styleValue?.value ?? attributeValue.value.expression, + j, + ); + } + }); + + // Remove the legend prop + j(elementPath) + .find(j.JSXAttribute) + .filter( + (a) => a.value.name.name === 'labelFontSize' || a.value.name.name === 'tickFontSize', + ) + .forEach((pathToRemove) => { + j(pathToRemove).remove(); + }); + }); + }); + }); + + const transformed = root.findJSXElements(); + + return transformed.toSource(printOptions); +} diff --git a/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/rename-label-and-tick-font-size.test.ts b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/rename-label-and-tick-font-size.test.ts new file mode 100644 index 0000000000000..0d3f4daddffaa --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/charts/rename-label-and-tick-font-size/rename-label-and-tick-font-size.test.ts @@ -0,0 +1,38 @@ +import path from 'path'; +import { expect } from 'chai'; +import jscodeshift from 'jscodeshift'; +import transform from '.'; +import readFile from '../../../util/readFile'; + +function read(fileName) { + return readFile(path.join(__dirname, fileName)); +} + +describe('v8.0.0/charts', () => { + describe('rename-label-and-tick-font-size.test', () => { + const actualPath = `./actual.spec.tsx`; + const expectedPath = `./expected.spec.tsx`; + + it('transforms imports as needed', () => { + const actual = transform( + { source: read(actualPath) }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + + const expected = read(expectedPath); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + + it('should be idempotent', () => { + const actual = transform( + { source: read(expectedPath) }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + + const expected = read(expectedPath); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + }); +}); diff --git a/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/actual.spec.tsx b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/actual.spec.tsx new file mode 100644 index 0000000000000..cf559442177ee --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/actual.spec.tsx @@ -0,0 +1,19 @@ +// @ts-nocheck +import * as React from 'react'; +import { DataGridPremium } from '@mui/x-data-grid-premium'; + +// prettier-ignore + + + + +; diff --git a/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/expected.spec.tsx b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/expected.spec.tsx new file mode 100644 index 0000000000000..2339318553f75 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/expected.spec.tsx @@ -0,0 +1,14 @@ +// @ts-nocheck +import * as React from 'react'; +import { DataGridPremium } from '@mui/x-data-grid-premium'; + +// prettier-ignore + + + + +; diff --git a/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/index.ts b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/index.ts new file mode 100644 index 0000000000000..0d1184947b414 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/index.ts @@ -0,0 +1,9 @@ +import removeExperimentalFeatures from '../remove-stabilized-experimentalFeatures'; + +import { JsCodeShiftAPI, JsCodeShiftFileInfo } from '../../../types'; + +export default function transformer(file: JsCodeShiftFileInfo, api: JsCodeShiftAPI, options: any) { + file.source = removeExperimentalFeatures(file, api, options); + + return file.source; +} diff --git a/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/preset-safe.test.ts b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/preset-safe.test.ts new file mode 100644 index 0000000000000..9af3bd0f15eb5 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/preset-safe/preset-safe.test.ts @@ -0,0 +1,41 @@ +import path from 'path'; +import { expect } from 'chai'; +import jscodeshift from 'jscodeshift'; +import transform from './index'; +import readFile from '../../../util/readFile'; + +function read(fileName) { + return readFile(path.join(__dirname, fileName)); +} + +describe('v8.0.0/data-grid', () => { + describe('preset-safe', () => { + it('transforms code as needed', () => { + const actual = transform( + { + source: read('./actual.spec.tsx'), + path: require.resolve('./actual.spec.tsx'), + }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + + const expected = read('./expected.spec.tsx'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + + it('should be idempotent for expression', () => { + const actual = transform( + { + source: read('./expected.spec.tsx'), + path: require.resolve('./expected.spec.tsx'), + }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + + const expected = read('./expected.spec.tsx'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + }); +}); diff --git a/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/actual.spec.js b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/actual.spec.js new file mode 100644 index 0000000000000..4949e5a16c073 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/actual.spec.js @@ -0,0 +1,23 @@ +import * as React from 'react'; +import { DataGridPremium } from '@mui/x-data-grid-premium'; + +function App() { + return ( + + + + + + ); +} + +export default App; diff --git a/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/expected.spec.js b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/expected.spec.js new file mode 100644 index 0000000000000..822a2937be81f --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/expected.spec.js @@ -0,0 +1,18 @@ +import * as React from 'react'; +import { DataGridPremium } from '@mui/x-data-grid-premium'; + +function App() { + return ( + ( + + + + ) + ); +} + +export default App; diff --git a/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/index.ts b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/index.ts new file mode 100644 index 0000000000000..06abd269a1ce6 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/index.ts @@ -0,0 +1,22 @@ +import removeObjectProperty from '../../../util/removeObjectProperty'; +import { JsCodeShiftAPI, JsCodeShiftFileInfo } from '../../../types'; + +const componentsNames = ['DataGridPremium']; +const propName = 'experimentalFeatures'; +const propKeys = ['ariaV8']; + +export default function transformer(file: JsCodeShiftFileInfo, api: JsCodeShiftAPI, options: any) { + const j = api.jscodeshift; + const root = j(file.source); + + const printOptions = options.printOptions || { + quote: 'single', + trailingComma: true, + }; + + propKeys.forEach((propKey) => { + removeObjectProperty({ root, j, propName, componentsNames, propKey }); + }); + + return root.toSource(printOptions); +} diff --git a/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/remove-stabilized-experimentalFeatures.test.ts b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/remove-stabilized-experimentalFeatures.test.ts new file mode 100644 index 0000000000000..b9caedfb5f684 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/remove-stabilized-experimentalFeatures.test.ts @@ -0,0 +1,48 @@ +import path from 'path'; +import { expect } from 'chai'; +import jscodeshift from 'jscodeshift'; +import transform from '.'; +import readFile from '../../../util/readFile'; + +function read(fileName) { + return readFile(path.join(__dirname, fileName)); +} + +describe('v8.0.0/data-grid', () => { + describe('remove-stabilized-experimentalFeatures', () => { + it('transforms props as needed - js', () => { + const actual = transform({ source: read('./actual.spec.js') }, { jscodeshift }, {}); + + const expected = read('./expected.spec.js'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + + it('should be idempotent - js', () => { + const actual = transform({ source: read('./expected.spec.js') }, { jscodeshift }, {}); + + const expected = read('./expected.spec.js'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + + it('transforms props as needed - ts', () => { + const actual = transform( + { source: read('./ts-actual.spec.tsx') }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + const expected = read('./ts-expected.spec.tsx'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + + it('should be idempotent - ts', () => { + const actual = transform( + { source: read('./ts-expected.spec.tsx') }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + + const expected = read('./ts-expected.spec.tsx'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + }); +}); diff --git a/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/ts-actual.spec.tsx b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/ts-actual.spec.tsx new file mode 100644 index 0000000000000..c91b3cfc067a3 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/ts-actual.spec.tsx @@ -0,0 +1,25 @@ +// @ts-nocheck +import * as React from 'react'; +import { DataGridPremium } from '@mui/x-data-grid-premium'; + +// prettier-ignore +function App() { + return ( + + + + + + ); +} + +export default App; diff --git a/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/ts-expected.spec.tsx b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/ts-expected.spec.tsx new file mode 100644 index 0000000000000..f30689f7397a2 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/data-grid/remove-stabilized-experimentalFeatures/ts-expected.spec.tsx @@ -0,0 +1,20 @@ +// @ts-nocheck +import * as React from 'react'; +import { DataGridPremium } from '@mui/x-data-grid-premium'; + +// prettier-ignore +function App() { + return ( + ( + + + + ) + ); +} + +export default App; diff --git a/packages/x-codemod/src/v8.0.0/pickers/preset-safe/actual.spec.tsx b/packages/x-codemod/src/v8.0.0/pickers/preset-safe/actual.spec.tsx new file mode 100644 index 0000000000000..fc0a0af5b8cd4 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/pickers/preset-safe/actual.spec.tsx @@ -0,0 +1,12 @@ +// @ts-nocheck +import { FieldValueType } from '@mui/x-date-pickers/models'; + +interface DumbComponentProps { + valueType: FieldValueType; + foo: string; + bar: number; +} + +const myFunction = (param: FieldValueType) => { + console.log('Hello World!'); +}; diff --git a/packages/x-codemod/src/v8.0.0/pickers/preset-safe/expected.spec.tsx b/packages/x-codemod/src/v8.0.0/pickers/preset-safe/expected.spec.tsx new file mode 100644 index 0000000000000..005a926c50563 --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/pickers/preset-safe/expected.spec.tsx @@ -0,0 +1,12 @@ +// @ts-nocheck +import { PickerValueType } from '@mui/x-date-pickers/models'; + +interface DumbComponentProps { + valueType: PickerValueType; + foo: string; + bar: number; +} + +const myFunction = (param: PickerValueType) => { + console.log('Hello World!'); +}; diff --git a/packages/x-codemod/src/v8.0.0/pickers/preset-safe/preset-safe.test.ts b/packages/x-codemod/src/v8.0.0/pickers/preset-safe/preset-safe.test.ts new file mode 100644 index 0000000000000..5129efe68f31b --- /dev/null +++ b/packages/x-codemod/src/v8.0.0/pickers/preset-safe/preset-safe.test.ts @@ -0,0 +1,41 @@ +import path from 'path'; +import { expect } from 'chai'; +import jscodeshift from 'jscodeshift'; +import transform from './index'; +import readFile from '../../../util/readFile'; + +function read(fileName) { + return readFile(path.join(__dirname, fileName)); +} + +describe('v8.0.0/pickers', () => { + describe('preset-safe', () => { + it('transforms code as needed', () => { + const actual = transform( + { + source: read('./actual.spec.tsx'), + path: require.resolve('./actual.spec.tsx'), + }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + + const expected = read('./expected.spec.tsx'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + + it('should be idempotent for expression', () => { + const actual = transform( + { + source: read('./expected.spec.tsx'), + path: require.resolve('./expected.spec.tsx'), + }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + + const expected = read('./expected.spec.tsx'); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + }); +}); diff --git a/packages/x-codemod/src/v8.0.0/preset-safe/actual.spec.js b/packages/x-codemod/src/v8.0.0/preset-safe/actual.spec.js deleted file mode 100644 index f8a5b4f02aa27..0000000000000 --- a/packages/x-codemod/src/v8.0.0/preset-safe/actual.spec.js +++ /dev/null @@ -1,15 +0,0 @@ -// @ts-nocheck -import * as React from 'react'; -import { TreeItem2 } from '@mui/x-tree-view/TreeItem2'; -import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; -import { PieChart } from '@mui/x-charts/PieChart'; - -const className = treeViewClasses.root; - -// prettier-ignore - - - - - - diff --git a/packages/x-codemod/src/v8.0.0/preset-safe/expected.spec.js b/packages/x-codemod/src/v8.0.0/preset-safe/expected.spec.js deleted file mode 100644 index b85fe4c34ed38..0000000000000 --- a/packages/x-codemod/src/v8.0.0/preset-safe/expected.spec.js +++ /dev/null @@ -1,18 +0,0 @@ -// @ts-nocheck -import * as React from 'react'; -import { TreeItem } from '@mui/x-tree-view/TreeItem'; -import { SimpleTreeView } from '@mui/x-tree-view/SimpleTreeView'; -import { PieChart } from '@mui/x-charts/PieChart'; - -const className = treeViewClasses.root; - -// prettier-ignore - - - - - - diff --git a/packages/x-codemod/src/v8.0.0/preset-safe/index.ts b/packages/x-codemod/src/v8.0.0/preset-safe/index.ts index 92c7cb70ec217..c68ec3e413159 100644 --- a/packages/x-codemod/src/v8.0.0/preset-safe/index.ts +++ b/packages/x-codemod/src/v8.0.0/preset-safe/index.ts @@ -1,10 +1,14 @@ import transformTreeView from '../tree-view/preset-safe'; +import transformPickers from '../pickers/preset-safe'; import transformCharts from '../charts/preset-safe'; +import transformDataGrid from '../data-grid/preset-safe'; import { JsCodeShiftAPI, JsCodeShiftFileInfo } from '../../types'; export default function transformer(file: JsCodeShiftFileInfo, api: JsCodeShiftAPI, options: any) { file.source = transformTreeView(file, api, options); + file.source = transformPickers(file, api, options); file.source = transformCharts(file, api, options); + file.source = transformDataGrid(file, api, options); return file.source; } diff --git a/packages/x-codemod/src/v8.0.0/preset-safe/preset-safe.test.ts b/packages/x-codemod/src/v8.0.0/preset-safe/preset-safe.test.ts index b0ea5e858c7a1..90a28d50b7c82 100644 --- a/packages/x-codemod/src/v8.0.0/preset-safe/preset-safe.test.ts +++ b/packages/x-codemod/src/v8.0.0/preset-safe/preset-safe.test.ts @@ -1,27 +1,60 @@ import path from 'path'; import { expect } from 'chai'; import jscodeshift from 'jscodeshift'; +import fs from 'fs'; import transform from '.'; import readFile from '../../util/readFile'; function read(fileName) { - return readFile(path.join(__dirname, fileName)); + return readFile(fileName); +} + +function getAllDirs() { + return fs + .readdirSync(path.resolve(__dirname, '..')) + .filter( + (file) => + fs.statSync(path.resolve(__dirname, '..', file)).isDirectory() && + file !== 'preset-safe' && + fs.existsSync(path.resolve(__dirname, '..', file, 'preset-safe')), + ); } describe('v8.0.0', () => { - describe('preset-safe', () => { - it('transforms code as needed', () => { - const actual = transform({ source: read('./actual.spec.js') }, { jscodeshift }, {}); + const MOD_DIRS = getAllDirs(); - const expected = read('./expected.spec.js'); - expect(actual).to.equal(expected, 'The transformed version should be correct'); - }); + describe('preset-safe', () => { + MOD_DIRS.forEach((testDir) => { + const actualPath = path.resolve(__dirname, '..', testDir, 'preset-safe', 'actual.spec.tsx'); + const expectedPath = path.resolve( + __dirname, + '..', + testDir, + 'preset-safe', + 'expected.spec.tsx', + ); - it('should be idempotent', () => { - const actual = transform({ source: read('./expected.spec.js') }, { jscodeshift }, {}); + describe(`${testDir.replace(/-/g, ' ')}`, () => { + it('transforms code as needed', () => { + const actual = transform( + { source: read(actualPath) }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + const expected = read(expectedPath); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); - const expected = read('./expected.spec.js'); - expect(actual).to.equal(expected, 'The transformed version should be correct'); + it('should be idempotent', () => { + const actual = transform( + { source: read(expectedPath) }, + { jscodeshift: jscodeshift.withParser('tsx') }, + {}, + ); + const expected = read(expectedPath); + expect(actual).to.equal(expected, 'The transformed version should be correct'); + }); + }); }); }); }); diff --git a/packages/x-data-grid-generator/package.json b/packages/x-data-grid-generator/package.json index f70df7751decc..fb84ce2dc4e27 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": "8.0.0-alpha.1", + "version": "8.0.0-alpha.3", "description": "Generate fake data for demo purposes only.", "author": "MUI Team", "main": "src/index.ts", @@ -40,8 +40,8 @@ "lru-cache": "^11.0.2" }, "devDependencies": { - "@mui/icons-material": "^5.16.7", - "@mui/material": "^5.16.7", + "@mui/icons-material": "^5.16.9", + "@mui/material": "^5.16.9", "@types/chance": "^1.1.6", "rimraf": "^6.0.1" }, diff --git a/packages/x-data-grid-generator/src/hooks/serverUtils.ts b/packages/x-data-grid-generator/src/hooks/serverUtils.ts index 80651b133af5e..c0643d608e923 100644 --- a/packages/x-data-grid-generator/src/hooks/serverUtils.ts +++ b/packages/x-data-grid-generator/src/hooks/serverUtils.ts @@ -40,8 +40,8 @@ export interface QueryOptions { pageSize?: number; filterModel?: GridFilterModel; sortModel?: GridSortModel; - firstRowToRender?: number; - lastRowToRender?: number; + start?: number; + end?: number; } export interface ServerSideQueryOptions { @@ -50,8 +50,8 @@ export interface ServerSideQueryOptions { groupKeys?: string[]; filterModel?: GridFilterModel; sortModel?: GridSortModel; - firstRowToRender?: number; - lastRowToRender?: number; + start?: number; + end?: number; groupFields?: string[]; } @@ -277,7 +277,7 @@ export const loadServerRows = ( } const delay = randomInt(minDelay, maxDelay); - const { cursor, page = 0, pageSize } = queryOptions; + const { cursor, page = 0, pageSize, start, end } = queryOptions; let nextCursor; let firstRowIndex; @@ -289,22 +289,25 @@ export const loadServerRows = ( filteredRows = [...filteredRows].sort(rowComparator); const totalRowCount = filteredRows.length; - if (!pageSize) { + if (start !== undefined && end !== undefined) { + firstRowIndex = start; + lastRowIndex = end; + } else if (!pageSize) { firstRowIndex = 0; - lastRowIndex = filteredRows.length; + lastRowIndex = filteredRows.length - 1; } else if (useCursorPagination) { firstRowIndex = cursor ? filteredRows.findIndex(({ id }) => id === cursor) : 0; firstRowIndex = Math.max(firstRowIndex, 0); // if cursor not found return 0 - lastRowIndex = firstRowIndex + pageSize; + lastRowIndex = firstRowIndex + pageSize - 1; - nextCursor = lastRowIndex >= filteredRows.length ? undefined : filteredRows[lastRowIndex].id; + nextCursor = filteredRows[lastRowIndex + 1]?.id; } else { firstRowIndex = page * pageSize; - lastRowIndex = (page + 1) * pageSize; + lastRowIndex = (page + 1) * pageSize - 1; } const hasNextPage = lastRowIndex < filteredRows.length - 1; const response: FakeServerResponse = { - returnedRows: filteredRows.slice(firstRowIndex, lastRowIndex), + returnedRows: filteredRows.slice(firstRowIndex, lastRowIndex + 1), hasNextPage, nextCursor, totalRowCount, diff --git a/packages/x-data-grid-generator/src/hooks/useMockServer.ts b/packages/x-data-grid-generator/src/hooks/useMockServer.ts index e9c168f0ca08a..9fb8aff79a8c2 100644 --- a/packages/x-data-grid-generator/src/hooks/useMockServer.ts +++ b/packages/x-data-grid-generator/src/hooks/useMockServer.ts @@ -3,7 +3,6 @@ import { LRUCache } from 'lru-cache'; import { getGridDefaultColumnTypes, GridRowModel, - GridGetRowsParams, GridGetRowsResponse, GridColDef, GridInitialState, @@ -104,7 +103,7 @@ const getColumnsFromOptions = (options: ColumnsOptions): GridColDefGenerator[] | return columns; }; -function decodeParams(url: string): GridGetRowsParams { +function decodeParams(url: string) { const params = new URL(url).searchParams; const decodedParams = {} as any; const array = Array.from(params.entries()); @@ -117,7 +116,7 @@ function decodeParams(url: string): GridGetRowsParams { } } - return decodedParams as GridGetRowsParams; + return decodedParams; } const getInitialState = (columns: GridColDefGenerator[], groupingField?: string) => { diff --git a/packages/x-data-grid-premium/package.json b/packages/x-data-grid-premium/package.json index a74e539629722..6bf146e7ce0e4 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": "8.0.0-alpha.1", + "version": "8.0.0-alpha.3", "description": "The Premium plan edition of the Data Grid Components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -72,10 +72,10 @@ } }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", - "@mui/material": "^5.16.7", - "@mui/system": "^5.16.7", - "@types/prop-types": "^15.7.13", + "@mui/internal-test-utils": "^1.0.22", + "@mui/material": "^5.16.9", + "@mui/system": "^5.16.8", + "@types/prop-types": "^15.7.14", "date-fns": "^2.30.0", "rimraf": "^6.0.1" }, diff --git a/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx b/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx index d6b2763a77e25..aa6044260b240 100644 --- a/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx +++ b/packages/x-data-grid-premium/src/DataGridPremium/DataGridPremium.tsx @@ -329,7 +329,6 @@ DataGridPremiumRaw.propTypes = { * For each feature, if the flag is not explicitly set to `true`, then the feature is fully disabled, and neither property nor method calls will have any effect. */ experimentalFeatures: PropTypes.shape({ - ariaV8: PropTypes.bool, warnIfFocusStateIsNotSynced: PropTypes.bool, }), /** @@ -954,14 +953,6 @@ DataGridPremiumRaw.propTypes = { * Controls the modes of the rows. */ rowModesModel: PropTypes.object, - /** - * The milliseconds delay to wait after measuring the row height before recalculating row positions. - * Setting it to a lower value could be useful when using dynamic row height, - * but might reduce performance when displaying a large number of rows. - * @default 166 - * @deprecated - */ - rowPositionsDebounceMs: PropTypes.number, /** * If `true`, the reordering of rows is enabled. * @default false @@ -995,7 +986,7 @@ DataGridPremiumRaw.propTypes = { * - Deselecting a descendant of a selected parent deselects the parent automatically. * * Works with tree data and row grouping on the client-side only. - * @default { parents: false, descendants: false } + * @default { parents: true, descendants: true } */ rowSelectionPropagation: PropTypes.shape({ descendants: PropTypes.bool, @@ -1005,7 +996,7 @@ DataGridPremiumRaw.propTypes = { * Loading rows can be processed on the server or client-side. * Set it to 'client' if you would like enable infnite loading. * Set it to 'server' if you would like to enable lazy loading. - * * @default "client" + * @default "client" */ rowsLoadingMode: PropTypes.oneOf(['client', 'server']), /** @@ -1013,12 +1004,18 @@ DataGridPremiumRaw.propTypes = { * @default "margin" */ rowSpacingType: PropTypes.oneOf(['border', 'margin']), + /** + * If `true`, the Data Grid will auto span the cells over the rows having the same value. + * @default false + */ + rowSpanning: PropTypes.bool, /** * Override the height/width of the Data Grid inner scrollbar. */ scrollbarSize: PropTypes.number, /** * Set the area in `px` at the bottom of the grid viewport where onRowsScrollEnd is called. + * If combined with `unstable_lazyLoading`, it defines the area where the next data request is triggered. * @default 80 */ scrollEndThreshold: PropTypes.number, @@ -1098,6 +1095,18 @@ DataGridPremiumRaw.propTypes = { get: PropTypes.func.isRequired, set: PropTypes.func.isRequired, }), + /** + * Used together with `unstable_dataSource` to enable lazy loading. + * If enabled, the grid stops adding `paginationModel` to the data requests (`getRows`) + * and starts sending `start` and `end` values depending on the loading mode and the scroll position. + * @default false + */ + unstable_lazyLoading: PropTypes.bool, + /** + * If positive, the Data Grid will throttle data source requests on rendered rows interval change. + * @default 500 + */ + unstable_lazyLoadingRequestThrottleMs: PropTypes.number, /** * Definition of the column rendered when the `unstable_listView` prop is enabled. */ @@ -1114,11 +1123,6 @@ DataGridPremiumRaw.propTypes = { */ unstable_listView: PropTypes.bool, unstable_onDataSourceError: PropTypes.func, - /** - * If `true`, the Data Grid will auto span the cells over the rows having the same value. - * @default false - */ - unstable_rowSpanning: PropTypes.bool, /** * If `true`, the Data Grid enables column virtualization when `getRowHeight` is set to `() => 'auto'`. * By default, column virtualization is disabled when dynamic row height is enabled to measure the row height correctly. diff --git a/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx b/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx index 46c76914dda78..5e3f20c6ea49d 100644 --- a/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx +++ b/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx @@ -61,6 +61,7 @@ import { columnGroupsStateInitializer, useGridLazyLoader, useGridLazyLoaderPreProcessors, + useGridDataSourceLazyLoader, headerFilteringStateInitializer, useGridHeaderFiltering, virtualizationStateInitializer, @@ -180,6 +181,7 @@ export const useDataGridPremiumComponent = ( useGridScroll(apiRef, props); useGridInfiniteLoader(apiRef, props); useGridLazyLoader(apiRef, props); + useGridDataSourceLazyLoader(apiRef, props); useGridColumnMenu(apiRef); useGridCsvExport(apiRef, props); useGridPrintExport(apiRef, props); 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 928b1cd11bfba..6796a0d77af96 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 @@ -20,7 +20,6 @@ import { GRID_CHECKBOX_SELECTION_COL_DEF, GRID_DETAIL_PANEL_TOGGLE_FIELD, GridCellCoordinates, - gridRowsDataRowIdToIdLookupSelector, GridRowId, gridClasses, gridFocusCellSelector, @@ -168,7 +167,6 @@ export const useGridCellSelection = ( GridCellSelectionApi['getSelectedCellsAsArray'] >(() => { const selectionModel = apiRef.current.getCellSelectionModel(); - const idToIdLookup = gridRowsDataRowIdToIdLookupSelector(apiRef); const currentVisibleRows = getVisibleRows(apiRef, props); const sortedEntries = currentVisibleRows.rows.reduce( (result, row) => { @@ -186,7 +184,7 @@ export const useGridCellSelection = ( ...Object.entries(fields).reduce<{ id: GridRowId; field: string }[]>( (selectedFields, [field, isSelected]) => { if (isSelected) { - selectedFields.push({ id: idToIdLookup[id], field }); + selectedFields.push({ id, field }); } return selectedFields; }, diff --git a/packages/x-data-grid-premium/src/hooks/features/rowGrouping/createGroupingColDef.tsx b/packages/x-data-grid-premium/src/hooks/features/rowGrouping/createGroupingColDef.tsx index 194c62efa5215..a56f6a8bbc02f 100644 --- a/packages/x-data-grid-premium/src/hooks/features/rowGrouping/createGroupingColDef.tsx +++ b/packages/x-data-grid-premium/src/hooks/features/rowGrouping/createGroupingColDef.tsx @@ -7,6 +7,7 @@ import { GridGroupingColDefOverride, GridGroupNode, GridTreeNodeWithRender, + GridValueFormatter, } from '@mui/x-data-grid-pro'; import { GridColumnRawLookup, isSingleSelectColDef } from '@mui/x-data-grid-pro/internals'; import { GridApiPremium } from '../../../models/gridApiPremium'; @@ -94,10 +95,19 @@ const getLeafProperties = (leafColDef: GridColDef): Partial => ({ }, }); +const groupedByColValueFormatter: ( + groupedByColDef: GridColDef, +) => GridValueFormatter = + (groupedByColDef: GridColDef) => (value, row, _, apiRef) => + groupedByColDef.valueFormatter!(value, row, groupedByColDef, apiRef); + const getGroupingCriteriaProperties = (groupedByColDef: GridColDef, applyHeaderName: boolean) => { const properties: Partial = { sortable: groupedByColDef.sortable, filterable: groupedByColDef.filterable, + valueFormatter: groupedByColDef.valueFormatter + ? groupedByColValueFormatter(groupedByColDef) + : undefined, valueOptions: isSingleSelectColDef(groupedByColDef) ? groupedByColDef.valueOptions : undefined, sortComparator: (v1, v2, cellParams1, cellParams2) => { // We only want to sort the groups of the current grouping criteria diff --git a/packages/x-data-grid-premium/src/hooks/features/rowGrouping/gridRowGroupingUtils.ts b/packages/x-data-grid-premium/src/hooks/features/rowGrouping/gridRowGroupingUtils.ts index 0310fb7b338d6..353b51936bd4a 100644 --- a/packages/x-data-grid-premium/src/hooks/features/rowGrouping/gridRowGroupingUtils.ts +++ b/packages/x-data-grid-premium/src/hooks/features/rowGrouping/gridRowGroupingUtils.ts @@ -19,6 +19,7 @@ import { GRID_ROW_GROUPING_SINGLE_GROUPING_FIELD, getRowGroupingCriteriaFromGroupingField, isGroupingColumn, + GridStrategyGroup, } from '@mui/x-data-grid-pro/internals'; import { DataGridPremiumProcessedProps } from '../../../models/dataGridPremiumProps'; import { @@ -211,7 +212,7 @@ export const setStrategyAvailability = ( const strategy = dataSource ? RowGroupingStrategy.DataSource : RowGroupingStrategy.Default; - privateApiRef.current.setStrategyAvailability('rowTree', strategy, isAvailable); + privateApiRef.current.setStrategyAvailability(GridStrategyGroup.RowTree, strategy, isAvailable); }; export const getCellGroupingCriteria = ({ diff --git a/packages/x-data-grid-premium/src/hooks/features/rowGrouping/useGridRowGrouping.tsx b/packages/x-data-grid-premium/src/hooks/features/rowGrouping/useGridRowGrouping.tsx index fe562ab900c3e..b8b6779f14016 100644 --- a/packages/x-data-grid-premium/src/hooks/features/rowGrouping/useGridRowGrouping.tsx +++ b/packages/x-data-grid-premium/src/hooks/features/rowGrouping/useGridRowGrouping.tsx @@ -10,6 +10,7 @@ import { GridPipeProcessor, GridRestoreStatePreProcessingContext, GridStateInitializer, + GridStrategyGroup, } from '@mui/x-data-grid-pro/internals'; import { GridPrivateApiPremium } from '../../../models/gridApiPremium'; import { @@ -275,7 +276,9 @@ export const useGridRowGrouping = ( // Refresh the row tree creation strategy processing // TODO: Add a clean way to re-run a strategy processing without publishing a private event - if (apiRef.current.getActiveStrategy('rowTree') === RowGroupingStrategy.Default) { + if ( + apiRef.current.getActiveStrategy(GridStrategyGroup.RowTree) === RowGroupingStrategy.Default + ) { apiRef.current.publishEvent('activeStrategyProcessorChange', 'rowTreeCreation'); } } diff --git a/packages/x-data-grid-premium/src/hooks/utils/useGridAriaAttributes.tsx b/packages/x-data-grid-premium/src/hooks/utils/useGridAriaAttributes.tsx index 8c5023f2af49a..74dba76508d69 100644 --- a/packages/x-data-grid-premium/src/hooks/utils/useGridAriaAttributes.tsx +++ b/packages/x-data-grid-premium/src/hooks/utils/useGridAriaAttributes.tsx @@ -5,18 +5,13 @@ import { } from '@mui/x-data-grid-pro/internals'; import { gridRowGroupingSanitizedModelSelector } from '../features/rowGrouping/gridRowGroupingSelector'; import { useGridPrivateApiContext } from './useGridPrivateApiContext'; -import { useGridRootProps } from './useGridRootProps'; export const useGridAriaAttributes = (): React.HTMLAttributes => { - const rootProps = useGridRootProps(); const ariaAttributesPro = useGridAriaAttributesPro(); const apiRef = useGridPrivateApiContext(); const gridRowGroupingModel = useGridSelector(apiRef, gridRowGroupingSanitizedModelSelector); - const ariaAttributesPremium = - rootProps.experimentalFeatures?.ariaV8 && gridRowGroupingModel.length > 0 - ? { role: 'treegrid' } - : {}; + const ariaAttributesPremium = gridRowGroupingModel.length > 0 ? { role: 'treegrid' } : {}; return { ...ariaAttributesPro, diff --git a/packages/x-data-grid-premium/src/models/dataGridPremiumProps.ts b/packages/x-data-grid-premium/src/models/dataGridPremiumProps.ts index ff1540e70ae43..8ed5498364dab 100644 --- a/packages/x-data-grid-premium/src/models/dataGridPremiumProps.ts +++ b/packages/x-data-grid-premium/src/models/dataGridPremiumProps.ts @@ -24,14 +24,7 @@ import { GridInitialStatePremium } from './gridStatePremium'; import { GridApiPremium } from './gridApiPremium'; import { GridCellSelectionModel } from '../hooks/features/cellSelection'; -export interface GridExperimentalPremiumFeatures extends GridExperimentalProFeatures { - /** - * Enables accessibility improvements that will be enabled by default in V8. - * If you rely on the v7 ARIA attributes (e.g. for CSS selectors), this might be a breaking change. - * @default false - */ - ariaV8: boolean; -} +export interface GridExperimentalPremiumFeatures extends GridExperimentalProFeatures {} export interface DataGridPremiumPropsWithComplexDefaultValueBeforeProcessing extends Pick { 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 f956007843f70..f30b9e4374c7a 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 @@ -169,6 +169,32 @@ describe(' - Row grouping', () => { expect(getColumnValues(0)).to.deep.equal(['Cat A (3)', '', '', '', 'Cat B (2)', '', '']); }); + it('should display the value from the `valueOptions` for `singleSelect` column type', () => { + render( + , + ); + expect(getColumnValues(0)).to.deep.equal(['categoryLabel1 (3)', 'categoryLabel2 (2)']); + }); + it('should display icon on auto-generated row', () => { render( - Row spanning', () => { const { render } = createRenderer(); const baselineProps: DataGridPremiumProps = { - unstable_rowSpanning: true, + rowSpanning: true, columns: [ { field: 'code', diff --git a/packages/x-data-grid-pro/package.json b/packages/x-data-grid-pro/package.json index 69c790264a4dd..afb5f31f1c65e 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": "8.0.0-alpha.1", + "version": "8.0.0-alpha.3", "description": "The Pro plan edition of the Data Grid components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -70,10 +70,10 @@ } }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", - "@mui/material": "^5.16.7", - "@mui/system": "^5.16.7", - "@types/prop-types": "^15.7.13", + "@mui/internal-test-utils": "^1.0.22", + "@mui/material": "^5.16.9", + "@mui/system": "^5.16.8", + "@types/prop-types": "^15.7.14", "rimraf": "^6.0.1" }, "engines": { diff --git a/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx b/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx index 7c8113a5e2262..e8d57f00d5c78 100644 --- a/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx +++ b/packages/x-data-grid-pro/src/DataGridPro/DataGridPro.tsx @@ -860,14 +860,6 @@ DataGridProRaw.propTypes = { * Controls the modes of the rows. */ rowModesModel: PropTypes.object, - /** - * The milliseconds delay to wait after measuring the row height before recalculating row positions. - * Setting it to a lower value could be useful when using dynamic row height, - * but might reduce performance when displaying a large number of rows. - * @default 166 - * @deprecated - */ - rowPositionsDebounceMs: PropTypes.number, /** * If `true`, the reordering of rows is enabled. * @default false @@ -901,7 +893,7 @@ DataGridProRaw.propTypes = { * - Deselecting a descendant of a selected parent deselects the parent automatically. * * Works with tree data and row grouping on the client-side only. - * @default { parents: false, descendants: false } + * @default { parents: true, descendants: true } */ rowSelectionPropagation: PropTypes.shape({ descendants: PropTypes.bool, @@ -911,7 +903,7 @@ DataGridProRaw.propTypes = { * Loading rows can be processed on the server or client-side. * Set it to 'client' if you would like enable infnite loading. * Set it to 'server' if you would like to enable lazy loading. - * * @default "client" + * @default "client" */ rowsLoadingMode: PropTypes.oneOf(['client', 'server']), /** @@ -919,12 +911,18 @@ DataGridProRaw.propTypes = { * @default "margin" */ rowSpacingType: PropTypes.oneOf(['border', 'margin']), + /** + * If `true`, the Data Grid will auto span the cells over the rows having the same value. + * @default false + */ + rowSpanning: PropTypes.bool, /** * Override the height/width of the Data Grid inner scrollbar. */ scrollbarSize: PropTypes.number, /** * Set the area in `px` at the bottom of the grid viewport where onRowsScrollEnd is called. + * If combined with `unstable_lazyLoading`, it defines the area where the next data request is triggered. * @default 80 */ scrollEndThreshold: PropTypes.number, @@ -997,6 +995,18 @@ DataGridProRaw.propTypes = { get: PropTypes.func.isRequired, set: PropTypes.func.isRequired, }), + /** + * Used together with `unstable_dataSource` to enable lazy loading. + * If enabled, the grid stops adding `paginationModel` to the data requests (`getRows`) + * and starts sending `start` and `end` values depending on the loading mode and the scroll position. + * @default false + */ + unstable_lazyLoading: PropTypes.bool, + /** + * If positive, the Data Grid will throttle data source requests on rendered rows interval change. + * @default 500 + */ + unstable_lazyLoadingRequestThrottleMs: PropTypes.number, /** * Definition of the column rendered when the `unstable_listView` prop is enabled. */ @@ -1013,11 +1023,6 @@ DataGridProRaw.propTypes = { */ unstable_listView: PropTypes.bool, unstable_onDataSourceError: PropTypes.func, - /** - * If `true`, the Data Grid will auto span the cells over the rows having the same value. - * @default false - */ - unstable_rowSpanning: PropTypes.bool, /** * If `true`, the Data Grid enables column virtualization when `getRowHeight` is set to `() => 'auto'`. * By default, column virtualization is disabled when dynamic row height is enabled to measure the row height correctly. diff --git a/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx b/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx index 0240d83802fcc..f997b0c8d7f33 100644 --- a/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx +++ b/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx @@ -86,6 +86,7 @@ import { useGridDataSource, dataSourceStateInitializer, } from '../hooks/features/dataSource/useGridDataSource'; +import { useGridDataSourceLazyLoader } from '../hooks/features/serverSideLazyLoader/useGridDataSourceLazyLoader'; export const useDataGridProComponent = ( inputApiRef: React.MutableRefObject | undefined, @@ -163,6 +164,7 @@ export const useDataGridProComponent = ( useGridScroll(apiRef, props); useGridInfiniteLoader(apiRef, props); useGridLazyLoader(apiRef, props); + useGridDataSourceLazyLoader(apiRef, props); useGridColumnMenu(apiRef); useGridCsvExport(apiRef, props); useGridPrintExport(apiRef, props); diff --git a/packages/x-data-grid-pro/src/DataGridPro/useDataGridProProps.ts b/packages/x-data-grid-pro/src/DataGridPro/useDataGridProProps.ts index 295702230804c..fffa481874e6e 100644 --- a/packages/x-data-grid-pro/src/DataGridPro/useDataGridProProps.ts +++ b/packages/x-data-grid-pro/src/DataGridPro/useDataGridProProps.ts @@ -56,6 +56,8 @@ export const DATA_GRID_PRO_PROPS_DEFAULT_VALUES: DataGridProPropsWithDefaultValu scrollEndThreshold: 80, treeData: false, unstable_listView: false, + unstable_lazyLoading: false, + unstable_lazyLoadingRequestThrottleMs: 500, }; const defaultSlots = DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS; 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 2c8c8cbce7a93..bd8aca4630ed1 100644 --- a/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterCell.tsx +++ b/packages/x-data-grid-pro/src/components/headerFiltering/GridHeaderFilterCell.tsx @@ -167,7 +167,7 @@ const GridHeaderFilterCell = React.forwardRef { - if (item.value && !updatedItem.value) { + if (item.value && updatedItem.value === undefined) { apiRef.current.deleteFilterItem(updatedItem); return; } @@ -314,7 +314,7 @@ const GridHeaderFilterCell = React.forwardRef entry.expiry) { delete this.cache[keyString]; return undefined; } + return entry.value; } diff --git a/packages/x-data-grid-pro/src/hooks/features/dataSource/interfaces.ts b/packages/x-data-grid-pro/src/hooks/features/dataSource/interfaces.ts index 90bfc4ed39de2..08eaf7c33f42d 100644 --- a/packages/x-data-grid-pro/src/hooks/features/dataSource/interfaces.ts +++ b/packages/x-data-grid-pro/src/hooks/features/dataSource/interfaces.ts @@ -1,5 +1,5 @@ import { GridRowId } from '@mui/x-data-grid'; -import { GridDataSourceCache } from '../../../models'; +import { GridDataSourceCache, GridGetRowsParams } from '../../../models'; export interface GridDataSourceState { loading: Record; @@ -23,11 +23,13 @@ export interface GridDataSourceApiBase { */ setChildrenFetchError: (parentId: GridRowId, error: Error | null) => void; /** - * Fetches the rows from the server for a given `parentId`. - * If no `parentId` is provided, it fetches the root rows. - * @param {string} parentId The id of the group to be fetched. + * Fetches the rows from the server. + * If no `parentId` option is provided, it fetches the root rows. + * Any missing parameter from `params` will be filled from the state (sorting, filtering, etc.). + * @param {GridRowId} parentId The id of the parent node. + * @param {Partial} params Request parameters override. */ - fetchRows: (parentId?: GridRowId) => void; + fetchRows: (parentId?: GridRowId, params?: Partial) => void; /** * The data source cache object. */ diff --git a/packages/x-data-grid-pro/src/hooks/features/dataSource/useGridDataSource.ts b/packages/x-data-grid-pro/src/hooks/features/dataSource/useGridDataSource.ts index 31f3d209a695b..243af1a9e34ce 100644 --- a/packages/x-data-grid-pro/src/hooks/features/dataSource/useGridDataSource.ts +++ b/packages/x-data-grid-pro/src/hooks/features/dataSource/useGridDataSource.ts @@ -2,20 +2,34 @@ import * as React from 'react'; import useLazyRef from '@mui/utils/useLazyRef'; import { useGridApiEventHandler, - gridRowsLoadingSelector, useGridApiMethod, GridDataSourceGroupNode, useGridSelector, - GridRowId, + gridPaginationModelSelector, + GRID_ROOT_GROUP_ID, + GridEventListener, } from '@mui/x-data-grid'; -import { gridRowGroupsToFetchSelector, GridStateInitializer } from '@mui/x-data-grid/internals'; +import { + GridGetRowsResponse, + gridRowGroupsToFetchSelector, + GridStateInitializer, + GridStrategyGroup, + GridStrategyProcessor, + useGridRegisterStrategyProcessor, +} from '@mui/x-data-grid/internals'; import { GridPrivateApiPro } from '../../../models/gridApiPro'; import { DataGridProProcessedProps } from '../../../models/dataGridProProps'; import { gridGetRowsParamsSelector, gridDataSourceErrorsSelector } from './gridDataSourceSelector'; import { GridDataSourceApi, GridDataSourceApiBase, GridDataSourcePrivateApi } from './interfaces'; -import { runIfServerMode, NestedDataManager, RequestStatus } from './utils'; +import { + CacheChunkManager, + DataSourceRowsUpdateStrategy, + NestedDataManager, + RequestStatus, + runIf, +} from './utils'; import { GridDataSourceCache } from '../../../models'; -import { GridDataSourceCacheDefault } from './cache'; +import { GridDataSourceCacheDefault, GridDataSourceCacheDefaultConfig } from './cache'; const INITIAL_STATE = { loading: {}, @@ -28,11 +42,14 @@ const noopCache: GridDataSourceCache = { set: () => {}, }; -function getCache(cacheProp?: GridDataSourceCache | null) { +function getCache( + cacheProp?: GridDataSourceCache | null, + options: GridDataSourceCacheDefaultConfig = {}, +) { if (cacheProp === null) { return noopCache; } - return cacheProp ?? new GridDataSourceCacheDefault({}); + return cacheProp ?? new GridDataSourceCacheDefault(options); } export const dataSourceStateInitializer: GridStateInitializer = (state) => { @@ -52,28 +69,51 @@ export const useGridDataSource = ( | 'sortingMode' | 'filterMode' | 'paginationMode' + | 'pageSizeOptions' | 'treeData' + | 'unstable_lazyLoading' >, ) => { + const setStrategyAvailability = React.useCallback(() => { + apiRef.current.setStrategyAvailability( + GridStrategyGroup.DataSource, + DataSourceRowsUpdateStrategy.Default, + props.unstable_dataSource && !props.unstable_lazyLoading ? () => true : () => false, + ); + }, [apiRef, props.unstable_lazyLoading, props.unstable_dataSource]); + + const [defaultRowsUpdateStrategyActive, setDefaultRowsUpdateStrategyActive] = + React.useState(false); const nestedDataManager = useLazyRef( () => new NestedDataManager(apiRef), ).current; + const paginationModel = useGridSelector(apiRef, gridPaginationModelSelector); const groupsToAutoFetch = useGridSelector(apiRef, gridRowGroupsToFetchSelector); const scheduledGroups = React.useRef(0); + const lastRequestId = React.useRef(0); + const onError = props.unstable_onDataSourceError; + const cacheChunkManager = useLazyRef(() => { + const sortedPageSizeOptions = props.pageSizeOptions + .map((option) => (typeof option === 'number' ? option : option.value)) + .sort((a, b) => a - b); + const cacheChunkSize = Math.min(paginationModel.pageSize, sortedPageSizeOptions[0]); + + return new CacheChunkManager(cacheChunkSize); + }).current; const [cache, setCache] = React.useState(() => getCache(props.unstable_dataSourceCache), ); - const fetchRows = React.useCallback( - async (parentId?: GridRowId) => { + const fetchRows = React.useCallback( + async (parentId, params) => { const getRows = props.unstable_dataSource?.getRows; if (!getRows) { return; } - if (parentId) { + if (parentId && parentId !== GRID_ROOT_GROUP_ID) { nestedDataManager.queue([parentId]); return; } @@ -88,39 +128,65 @@ export const useGridDataSource = ( const fetchParams = { ...gridGetRowsParamsSelector(apiRef), ...apiRef.current.unstable_applyPipeProcessors('getRowsParams', {}), + ...params, }; - const cachedData = apiRef.current.unstable_dataSource.cache.get(fetchParams); + const cacheKeys = cacheChunkManager.getCacheKeys(fetchParams); + const responses = cacheKeys.map((cacheKey) => cache.get(cacheKey)); - if (cachedData !== undefined) { - const rows = cachedData.rows; - apiRef.current.setRows(rows); - if (cachedData.rowCount) { - apiRef.current.setRowCount(cachedData.rowCount); - } + if (responses.every((response) => response !== undefined)) { + apiRef.current.applyStrategyProcessor('dataSourceRowsUpdate', { + response: CacheChunkManager.mergeResponses(responses as GridGetRowsResponse[]), + fetchParams, + }); return; } - const isLoading = gridRowsLoadingSelector(apiRef); - if (!isLoading) { + // Manage loading state only for the default strategy + if (defaultRowsUpdateStrategyActive || apiRef.current.getRowsCount() === 0) { apiRef.current.setLoading(true); } + const requestId = lastRequestId.current + 1; + lastRequestId.current = requestId; + try { const getRowsResponse = await getRows(fetchParams); - apiRef.current.unstable_dataSource.cache.set(fetchParams, getRowsResponse); - if (getRowsResponse.rowCount) { - apiRef.current.setRowCount(getRowsResponse.rowCount); + + const cacheResponses = cacheChunkManager.splitResponse(fetchParams, getRowsResponse); + cacheResponses.forEach((response, key) => { + cache.set(key, response); + }); + + if (lastRequestId.current === requestId) { + apiRef.current.applyStrategyProcessor('dataSourceRowsUpdate', { + response: getRowsResponse, + fetchParams, + }); } - apiRef.current.setRows(getRowsResponse.rows); - apiRef.current.setLoading(false); } catch (error) { - apiRef.current.setRows([]); - apiRef.current.setLoading(false); - onError?.(error as Error, fetchParams); + if (lastRequestId.current === requestId) { + apiRef.current.applyStrategyProcessor('dataSourceRowsUpdate', { + error: error as Error, + fetchParams, + }); + onError?.(error as Error, fetchParams); + } + } finally { + if (defaultRowsUpdateStrategyActive && lastRequestId.current === requestId) { + apiRef.current.setLoading(false); + } } }, - [nestedDataManager, apiRef, props.unstable_dataSource?.getRows, onError], + [ + nestedDataManager, + cacheChunkManager, + cache, + apiRef, + defaultRowsUpdateStrategyActive, + props.unstable_dataSource?.getRows, + onError, + ], ); const fetchRowChildren = React.useCallback( @@ -148,15 +214,17 @@ export const useGridDataSource = ( groupKeys: rowNode.path, }; - const cachedData = apiRef.current.unstable_dataSource.cache.get(fetchParams); + const cacheKeys = cacheChunkManager.getCacheKeys(fetchParams); + const responses = cacheKeys.map((cacheKey) => cache.get(cacheKey)); + const cachedData = responses.some((response) => response === undefined) + ? undefined + : CacheChunkManager.mergeResponses(responses as GridGetRowsResponse[]); if (cachedData !== undefined) { const rows = cachedData.rows; nestedDataManager.setRequestSettled(id); apiRef.current.updateServerRows(rows, rowNode.path); - if (cachedData.rowCount) { - apiRef.current.setRowCount(cachedData.rowCount); - } + apiRef.current.setRowCount(cachedData.rowCount === undefined ? -1 : cachedData.rowCount); apiRef.current.setRowChildrenExpansion(id, true); apiRef.current.unstable_dataSource.setChildrenLoading(id, false); return; @@ -179,10 +247,15 @@ export const useGridDataSource = ( return; } nestedDataManager.setRequestSettled(id); - apiRef.current.unstable_dataSource.cache.set(fetchParams, getRowsResponse); - if (getRowsResponse.rowCount) { - apiRef.current.setRowCount(getRowsResponse.rowCount); - } + + const cacheResponses = cacheChunkManager.splitResponse(fetchParams, getRowsResponse); + cacheResponses.forEach((response, key) => { + cache.set(key, response); + }); + + apiRef.current.setRowCount( + getRowsResponse.rowCount === undefined ? -1 : getRowsResponse.rowCount, + ); apiRef.current.updateServerRows(getRowsResponse.rows, rowNode.path); apiRef.current.setRowChildrenExpansion(id, true); } catch (error) { @@ -194,7 +267,15 @@ export const useGridDataSource = ( nestedDataManager.setRequestSettled(id); } }, - [nestedDataManager, onError, apiRef, props.treeData, props.unstable_dataSource?.getRows], + [ + nestedDataManager, + cacheChunkManager, + cache, + onError, + apiRef, + props.treeData, + props.unstable_dataSource?.getRows, + ], ); const setChildrenLoading = React.useCallback( @@ -242,6 +323,31 @@ export const useGridDataSource = ( [apiRef], ); + const handleStrategyActivityChange = React.useCallback< + GridEventListener<'strategyAvailabilityChange'> + >(() => { + setDefaultRowsUpdateStrategyActive( + apiRef.current.getActiveStrategy(GridStrategyGroup.DataSource) === + DataSourceRowsUpdateStrategy.Default, + ); + }, [apiRef]); + + const handleDataUpdate = React.useCallback>( + (params) => { + if ('error' in params) { + apiRef.current.setRows([]); + return; + } + + const { response } = params; + if (response.rowCount !== undefined) { + apiRef.current.setRowCount(response.rowCount); + } + apiRef.current.setRows(response.rows); + }, + [apiRef], + ); + const resetDataSourceState = React.useCallback(() => { apiRef.current.setState((state) => { return { @@ -268,12 +374,28 @@ export const useGridDataSource = ( useGridApiMethod(apiRef, dataSourceApi, 'public'); useGridApiMethod(apiRef, dataSourcePrivateApi, 'private'); - useGridApiEventHandler(apiRef, 'sortModelChange', runIfServerMode(props.sortingMode, fetchRows)); - useGridApiEventHandler(apiRef, 'filterModelChange', runIfServerMode(props.filterMode, fetchRows)); + useGridRegisterStrategyProcessor( + apiRef, + DataSourceRowsUpdateStrategy.Default, + 'dataSourceRowsUpdate', + handleDataUpdate, + ); + + useGridApiEventHandler(apiRef, 'strategyAvailabilityChange', handleStrategyActivityChange); + useGridApiEventHandler( + apiRef, + 'sortModelChange', + runIf(defaultRowsUpdateStrategyActive, () => fetchRows()), + ); + useGridApiEventHandler( + apiRef, + 'filterModelChange', + runIf(defaultRowsUpdateStrategyActive, () => fetchRows()), + ); useGridApiEventHandler( apiRef, 'paginationModelChange', - runIfServerMode(props.paginationMode, fetchRows), + runIf(defaultRowsUpdateStrategyActive, () => fetchRows()), ); const isFirstRender = React.useRef(true); @@ -286,6 +408,10 @@ export const useGridDataSource = ( setCache((prevCache) => (prevCache !== newCache ? newCache : prevCache)); }, [props.unstable_dataSourceCache]); + React.useEffect(() => { + setStrategyAvailability(); + }, [setStrategyAvailability]); + React.useEffect(() => { if (props.unstable_dataSource) { apiRef.current.unstable_dataSource.cache.clear(); diff --git a/packages/x-data-grid-pro/src/hooks/features/dataSource/utils.ts b/packages/x-data-grid-pro/src/hooks/features/dataSource/utils.ts index dafc6d9783f21..ce2d8de133391 100644 --- a/packages/x-data-grid-pro/src/hooks/features/dataSource/utils.ts +++ b/packages/x-data-grid-pro/src/hooks/features/dataSource/utils.ts @@ -1,11 +1,11 @@ import { GridRowId } from '@mui/x-data-grid'; -import { GridPrivateApiPro } from '../../../models/gridApiPro'; +import { GridPrivateApiPro, GridGetRowsParams, GridGetRowsResponse } from '../../../models'; const MAX_CONCURRENT_REQUESTS = Infinity; -export const runIfServerMode = (modeProp: 'server' | 'client', fn: Function) => () => { - if (modeProp === 'server') { - fn(); +export const runIf = (condition: boolean, fn: Function) => (params: unknown) => { + if (condition) { + fn(params); } }; @@ -16,6 +16,11 @@ export enum RequestStatus { UNKNOWN, } +export enum DataSourceRowsUpdateStrategy { + Default = 'set-new-rows', + LazyLoading = 'replace-row-range', +} + /** * Fetches row children from the server with option to limit the number of concurrent requests * Determines the status of a request based on the enum `RequestStatus` @@ -112,3 +117,83 @@ export class NestedDataManager { public getActiveRequestsCount = () => this.pendingRequests.size + this.queuedRequests.size; } + +/** + * Provides better cache hit rate by: + * 1. Splitting the data into smaller chunks to be stored in the cache (cache `set`) + * 2. Merging multiple cache entries into a single response to get the required chunk (cache `get`) + */ +export class CacheChunkManager { + private chunkSize: number; + + /** + * @param chunkSize The number of rows to store in each cache entry. + * If not set, the whole array will be stored in a single cache entry. + * Setting this value to smallest page size will result in better cache hit rate. + * Has no effect if cursor pagination is used. + */ + constructor(chunkSize: number) { + this.chunkSize = chunkSize; + } + + public getCacheKeys = (key: GridGetRowsParams) => { + if (this.chunkSize < 1 || typeof key.start !== 'number') { + return [key]; + } + + // split the range into chunks + const chunkedKeys: GridGetRowsParams[] = []; + for (let i = key.start; i < key.end; i += this.chunkSize) { + const end = Math.min(i + this.chunkSize - 1, key.end); + chunkedKeys.push({ ...key, start: i, end }); + } + + return chunkedKeys; + }; + + public splitResponse = (key: GridGetRowsParams, response: GridGetRowsResponse) => { + const cacheKeys = this.getCacheKeys(key); + const responses = new Map(); + cacheKeys.forEach((chunkKey) => { + const isLastChunk = chunkKey.end === key.end; + const responseSlice: GridGetRowsResponse = { + ...response, + pageInfo: { + ...response.pageInfo, + // If the original response had page info, update that information for all but last chunk and keep the original value for the last chunk + hasNextPage: + response.pageInfo?.hasNextPage !== undefined && !isLastChunk + ? true + : response.pageInfo?.hasNextPage, + nextCursor: + response.pageInfo?.nextCursor !== undefined && !isLastChunk + ? response.rows[chunkKey.end + 1].id + : response.pageInfo?.nextCursor, + }, + rows: + typeof chunkKey.start !== 'number' || typeof key.start !== 'number' + ? response.rows + : response.rows.slice(chunkKey.start - key.start, chunkKey.end - key.start + 1), + }; + + responses.set(chunkKey, responseSlice); + }); + + return responses; + }; + + static mergeResponses = (responses: GridGetRowsResponse[]): GridGetRowsResponse => { + if (responses.length === 1) { + return responses[0]; + } + + return responses.reduce( + (acc, response) => ({ + rows: [...acc.rows, ...response.rows], + rowCount: response.rowCount, + pageInfo: response.pageInfo, + }), + { rows: [], rowCount: 0, pageInfo: {} }, + ); + }; +} diff --git a/packages/x-data-grid-pro/src/hooks/features/index.ts b/packages/x-data-grid-pro/src/hooks/features/index.ts index dd9209be6a533..456da75b157c1 100644 --- a/packages/x-data-grid-pro/src/hooks/features/index.ts +++ b/packages/x-data-grid-pro/src/hooks/features/index.ts @@ -6,4 +6,4 @@ export * from './treeData'; export * from './detailPanel'; export * from './rowPinning'; export * from './dataSource/interfaces'; -export * from './dataSource/cache'; +export { GridDataSourceCacheDefault } from './dataSource/cache'; diff --git a/packages/x-data-grid-pro/src/hooks/features/lazyLoader/useGridLazyLoader.ts b/packages/x-data-grid-pro/src/hooks/features/lazyLoader/useGridLazyLoader.ts index 0ced8d346ae75..2041a6f6b4854 100644 --- a/packages/x-data-grid-pro/src/hooks/features/lazyLoader/useGridLazyLoader.ts +++ b/packages/x-data-grid-pro/src/hooks/features/lazyLoader/useGridLazyLoader.ts @@ -7,56 +7,12 @@ import { gridRenderContextSelector, useGridApiOptionHandler, GridEventListener, - GridRowEntry, } from '@mui/x-data-grid'; import { getVisibleRows } from '@mui/x-data-grid/internals'; import { GridPrivateApiPro } from '../../../models/gridApiPro'; import { DataGridProProcessedProps } from '../../../models/dataGridProProps'; import { GridFetchRowsParams } from '../../../models/gridFetchRowsParams'; - -function findSkeletonRowsSection({ - apiRef, - visibleRows, - range, -}: { - apiRef: React.MutableRefObject; - visibleRows: GridRowEntry[]; - range: { firstRowIndex: number; lastRowIndex: number }; -}) { - let { firstRowIndex, lastRowIndex } = range; - const visibleRowsSection = visibleRows.slice(range.firstRowIndex, range.lastRowIndex); - let startIndex = 0; - let endIndex = visibleRowsSection.length - 1; - let isSkeletonSectionFound = false; - - while (!isSkeletonSectionFound && firstRowIndex < lastRowIndex) { - const isStartingWithASkeletonRow = - apiRef.current.getRowNode(visibleRowsSection[startIndex].id)?.type === 'skeletonRow'; - const isEndingWithASkeletonRow = - apiRef.current.getRowNode(visibleRowsSection[endIndex].id)?.type === 'skeletonRow'; - - if (isStartingWithASkeletonRow && isEndingWithASkeletonRow) { - isSkeletonSectionFound = true; - } - - if (!isStartingWithASkeletonRow) { - startIndex += 1; - firstRowIndex += 1; - } - - if (!isEndingWithASkeletonRow) { - endIndex -= 1; - lastRowIndex -= 1; - } - } - - return isSkeletonSectionFound - ? { - firstRowIndex, - lastRowIndex, - } - : undefined; -} +import { findSkeletonRowsSection } from './utils'; /** * @requires useGridRows (state) diff --git a/packages/x-data-grid-pro/src/hooks/features/lazyLoader/utils.ts b/packages/x-data-grid-pro/src/hooks/features/lazyLoader/utils.ts new file mode 100644 index 0000000000000..584d3696d17ae --- /dev/null +++ b/packages/x-data-grid-pro/src/hooks/features/lazyLoader/utils.ts @@ -0,0 +1,46 @@ +import { GridRowEntry } from '@mui/x-data-grid'; +import { GridPrivateApiPro } from '../../../models/gridApiPro'; + +export const findSkeletonRowsSection = ({ + apiRef, + visibleRows, + range, +}: { + apiRef: React.MutableRefObject; + visibleRows: GridRowEntry[]; + range: { firstRowIndex: number; lastRowIndex: number }; +}) => { + let { firstRowIndex, lastRowIndex } = range; + const visibleRowsSection = visibleRows.slice(range.firstRowIndex, range.lastRowIndex); + let startIndex = 0; + let endIndex = visibleRowsSection.length - 1; + let isSkeletonSectionFound = false; + + while (!isSkeletonSectionFound && firstRowIndex < lastRowIndex) { + const isStartingWithASkeletonRow = + apiRef.current.getRowNode(visibleRowsSection[startIndex].id)?.type === 'skeletonRow'; + const isEndingWithASkeletonRow = + apiRef.current.getRowNode(visibleRowsSection[endIndex].id)?.type === 'skeletonRow'; + + if (isStartingWithASkeletonRow && isEndingWithASkeletonRow) { + isSkeletonSectionFound = true; + } + + if (!isStartingWithASkeletonRow) { + startIndex += 1; + firstRowIndex += 1; + } + + if (!isEndingWithASkeletonRow) { + endIndex -= 1; + lastRowIndex -= 1; + } + } + + return isSkeletonSectionFound + ? { + firstRowIndex, + lastRowIndex, + } + : undefined; +}; diff --git a/packages/x-data-grid-pro/src/hooks/features/rowPinning/useGridRowPinningPreProcessors.ts b/packages/x-data-grid-pro/src/hooks/features/rowPinning/useGridRowPinningPreProcessors.ts index 95ee0924838b4..3025976bf538a 100644 --- a/packages/x-data-grid-pro/src/hooks/features/rowPinning/useGridRowPinningPreProcessors.ts +++ b/packages/x-data-grid-pro/src/hooks/features/rowPinning/useGridRowPinningPreProcessors.ts @@ -13,7 +13,7 @@ import { GridRowModel, } from '@mui/x-data-grid'; import { GridPrivateApiPro } from '../../../models/gridApiPro'; -import { GridPinnedRowsProp } from './gridRowPinningInterface'; +import type { GridPinnedRowsProp, GridRowPinningInternalCache } from './gridRowPinningInterface'; import { insertNodeInTree } from '../../../utils/tree/utils'; type GridPinnedRowPosition = keyof GridPinnedRowsProp; @@ -34,7 +34,6 @@ export function addPinnedRow({ isAutoGenerated: boolean; }) { const dataRowIdToModelLookup = { ...groupingParams.dataRowIdToModelLookup }; - const dataRowIdToIdLookup = { ...groupingParams.dataRowIdToIdLookup }; const tree = { ...groupingParams.tree }; const treeDepths = { ...groupingParams.treeDepths }; @@ -52,12 +51,10 @@ export function addPinnedRow({ if (!isAutoGenerated) { dataRowIdToModelLookup[rowId] = rowModel; - dataRowIdToIdLookup[rowId] = rowId; } // Do not push it to ids list so that pagination is not affected by pinned rows apiRef.current.caches.rows.dataRowIdToModelLookup[rowId] = { ...rowModel }; - apiRef.current.caches.rows.dataRowIdToIdLookup[rowId] = rowId; const previousPinnedRows = groupingParams.additionalRowGroups?.pinnedRows || {}; @@ -67,7 +64,6 @@ export function addPinnedRow({ return { ...groupingParams, dataRowIdToModelLookup, - dataRowIdToIdLookup, tree, treeDepths, }; @@ -76,7 +72,6 @@ export function addPinnedRow({ return { ...groupingParams, dataRowIdToModelLookup, - dataRowIdToIdLookup, tree, treeDepths, additionalRowGroups: { @@ -92,9 +87,13 @@ export function addPinnedRow({ export const useGridRowPinningPreProcessors = ( apiRef: React.MutableRefObject, ) => { + const prevPinnedRowsCacheRef = React.useRef(null); + const addPinnedRows = React.useCallback>( (groupingParams) => { const pinnedRowsCache = apiRef.current.caches.pinnedRows || {}; + const prevPinnedRowsCache = prevPinnedRowsCacheRef.current; + prevPinnedRowsCacheRef.current = pinnedRowsCache; let newGroupingParams: GridHydrateRowsValue = { ...groupingParams, @@ -105,6 +104,20 @@ export const useGridRowPinningPreProcessors = ( }, }; + if (prevPinnedRowsCache) { + const pinnedRowCleanup = (rowId: GridRowId) => { + const node = newGroupingParams.tree[rowId]; + if (node?.type === 'pinnedRow') { + delete newGroupingParams.tree[rowId]; + delete newGroupingParams.dataRowIdToModelLookup[rowId]; + delete apiRef.current.caches.rows.dataRowIdToModelLookup[rowId]; + } + }; + + prevPinnedRowsCache.topIds?.forEach(pinnedRowCleanup); + prevPinnedRowsCache.bottomIds?.forEach(pinnedRowCleanup); + } + pinnedRowsCache.topIds?.forEach((rowId) => { newGroupingParams = addPinnedRow({ groupingParams: newGroupingParams, diff --git a/packages/x-data-grid-pro/src/hooks/features/rowReorder/useGridRowReorder.tsx b/packages/x-data-grid-pro/src/hooks/features/rowReorder/useGridRowReorder.tsx index e6c4ed135c1d2..866dd4e242a59 100644 --- a/packages/x-data-grid-pro/src/hooks/features/rowReorder/useGridRowReorder.tsx +++ b/packages/x-data-grid-pro/src/hooks/features/rowReorder/useGridRowReorder.tsx @@ -11,7 +11,10 @@ import { useGridApiOptionHandler, GridRowId, } from '@mui/x-data-grid'; -import { gridEditRowsStateSelector } from '@mui/x-data-grid/internals'; +import { + gridEditRowsStateSelector, + gridSortedRowIndexLookupSelector, +} from '@mui/x-data-grid/internals'; import { GridRowOrderChangeParams } from '../../../models/gridRowOrderChangeParams'; import { GridPrivateApiPro } from '../../../models/gridApiPro'; import { DataGridProProcessedProps } from '../../../models/dataGridProProps'; @@ -63,6 +66,7 @@ export const useGridRowReorder = ( const ownerState = { classes: props.classes }; const classes = useUtilityClasses(ownerState); const [dragRowId, setDragRowId] = React.useState(''); + const sortedRowIndexLookup = useGridSelector(apiRef, gridSortedRowIndexLookupSelector); React.useEffect(() => { return () => { @@ -91,17 +95,16 @@ export const useGridRowReorder = ( dragRowNode.current = event.currentTarget; dragRowNode.current.classList.add(classes.rowDragging); - setDragRowId(params.id); removeDnDStylesTimeout.current = setTimeout(() => { dragRowNode.current!.classList.remove(classes.rowDragging); }); - originRowIndex.current = apiRef.current.getRowIndexRelativeToVisibleRows(params.id); + originRowIndex.current = sortedRowIndexLookup[params.id]; apiRef.current.setCellFocus(params.id, GRID_REORDER_COL_DEF.field); }, - [isRowReorderDisabled, classes.rowDragging, logger, apiRef], + [apiRef, isRowReorderDisabled, logger, classes.rowDragging, sortedRowIndexLookup], ); const handleDragOver = React.useCallback>( @@ -127,7 +130,7 @@ export const useGridRowReorder = ( : event.clientY; if (params.id !== dragRowId) { - const targetRowIndex = apiRef.current.getRowIndexRelativeToVisibleRows(params.id); + const targetRowIndex = sortedRowIndexLookup[params.id]; const dragDirection = mouseMovementDiff > 0 ? Direction.DOWN : Direction.UP; const currentReorderState: ReorderStateProps = { @@ -149,7 +152,7 @@ export const useGridRowReorder = ( previousMousePosition = { x: event.clientX, y: event.clientY }; }, - [apiRef, logger, dragRowId], + [dragRowId, apiRef, logger, sortedRowIndexLookup], ); const handleDragEnd = React.useCallback>( @@ -179,7 +182,7 @@ export const useGridRowReorder = ( // Emit the rowOrderChange event only once when the reordering stops. const rowOrderChangeParams: GridRowOrderChangeParams = { row: apiRef.current.getRow(dragRowId)!, - targetIndex: apiRef.current.getRowIndexRelativeToVisibleRows(params.id), + targetIndex: sortedRowIndexLookup[params.id], oldIndex: originRowIndex.current!, }; @@ -188,7 +191,7 @@ export const useGridRowReorder = ( setDragRowId(''); }, - [isRowReorderDisabled, logger, apiRef, dragRowId], + [apiRef, dragRowId, isRowReorderDisabled, logger, sortedRowIndexLookup], ); useGridApiEventHandler(apiRef, 'rowDragStart', handleDragStart); diff --git a/packages/x-data-grid-pro/src/hooks/features/serverSideLazyLoader/useGridDataSourceLazyLoader.ts b/packages/x-data-grid-pro/src/hooks/features/serverSideLazyLoader/useGridDataSourceLazyLoader.ts new file mode 100644 index 0000000000000..2b940e816308c --- /dev/null +++ b/packages/x-data-grid-pro/src/hooks/features/serverSideLazyLoader/useGridDataSourceLazyLoader.ts @@ -0,0 +1,512 @@ +import * as React from 'react'; +import { throttle } from '@mui/x-internals/throttle'; +import { + useGridApiEventHandler, + useGridSelector, + gridSortModelSelector, + gridFilterModelSelector, + GridEventListener, + GRID_ROOT_GROUP_ID, + GridGroupNode, + GridSkeletonRowNode, + gridPaginationModelSelector, + gridDimensionsSelector, + gridFilteredSortedRowIdsSelector, +} from '@mui/x-data-grid'; +import { + getVisibleRows, + GridGetRowsParams, + gridRenderContextSelector, + GridStrategyGroup, + GridStrategyProcessor, + useGridRegisterStrategyProcessor, +} from '@mui/x-data-grid/internals'; +import { GridPrivateApiPro } from '../../../models/gridApiPro'; +import { DataGridProProcessedProps } from '../../../models/dataGridProProps'; +import { findSkeletonRowsSection } from '../lazyLoader/utils'; +import { GRID_SKELETON_ROW_ROOT_ID } from '../lazyLoader/useGridLazyLoaderPreProcessors'; +import { DataSourceRowsUpdateStrategy, runIf } from '../dataSource/utils'; + +enum LoadingTrigger { + VIEWPORT, + SCROLL_END, +} + +const INTERVAL_CACHE_INITIAL_STATE = { + firstRowToRender: 0, + lastRowToRender: 0, +}; + +const getSkeletonRowId = (index: number) => `${GRID_SKELETON_ROW_ROOT_ID}-${index}`; + +/** + * @requires useGridRows (state) + * @requires useGridPagination (state) + * @requires useGridDimensions (method) - can be after + * @requires useGridScroll (method + */ +export const useGridDataSourceLazyLoader = ( + privateApiRef: React.MutableRefObject, + props: Pick< + DataGridProProcessedProps, + | 'pagination' + | 'paginationMode' + | 'unstable_dataSource' + | 'unstable_lazyLoading' + | 'unstable_lazyLoadingRequestThrottleMs' + | 'scrollEndThreshold' + >, +): void => { + const setStrategyAvailability = React.useCallback(() => { + privateApiRef.current.setStrategyAvailability( + GridStrategyGroup.DataSource, + DataSourceRowsUpdateStrategy.LazyLoading, + props.unstable_dataSource && props.unstable_lazyLoading ? () => true : () => false, + ); + }, [privateApiRef, props.unstable_lazyLoading, props.unstable_dataSource]); + + const [lazyLoadingRowsUpdateStrategyActive, setLazyLoadingRowsUpdateStrategyActive] = + React.useState(false); + const sortModel = useGridSelector(privateApiRef, gridSortModelSelector); + const filterModel = useGridSelector(privateApiRef, gridFilterModelSelector); + const paginationModel = useGridSelector(privateApiRef, gridPaginationModelSelector); + const filteredSortedRowIds = useGridSelector(privateApiRef, gridFilteredSortedRowIdsSelector); + const dimensions = useGridSelector(privateApiRef, gridDimensionsSelector); + const renderContext = useGridSelector(privateApiRef, gridRenderContextSelector); + const renderedRowsIntervalCache = React.useRef(INTERVAL_CACHE_INITIAL_STATE); + const previousLastRowIndex = React.useRef(0); + const loadingTrigger = React.useRef(null); + const rowsStale = React.useRef(false); + + // Adjust the render context range to fit the pagination model's page size + // First row index should be decreased to the start of the page, end row index should be increased to the end of the page + const adjustRowParams = React.useCallback( + (params: GridGetRowsParams) => { + if (typeof params.start !== 'number') { + return params; + } + + return { + ...params, + start: params.start - (params.start % paginationModel.pageSize), + end: params.end + paginationModel.pageSize - (params.end % paginationModel.pageSize) - 1, + }; + }, + [paginationModel], + ); + + const resetGrid = React.useCallback(() => { + privateApiRef.current.setLoading(true); + privateApiRef.current.unstable_dataSource.cache.clear(); + rowsStale.current = true; + previousLastRowIndex.current = 0; + const getRowsParams: GridGetRowsParams = { + start: 0, + end: paginationModel.pageSize - 1, + sortModel, + filterModel, + }; + + privateApiRef.current.unstable_dataSource.fetchRows(GRID_ROOT_GROUP_ID, getRowsParams); + }, [privateApiRef, sortModel, filterModel, paginationModel.pageSize]); + + const ensureValidRowCount = React.useCallback( + (previousLoadingTrigger: LoadingTrigger, newLoadingTrigger: LoadingTrigger) => { + // switching from lazy loading to infinite loading should always reset the grid + // since there is no guarantee that the new data will be placed correctly + // there might be some skeleton rows in between the data or the data has changed (row count became unknown) + if ( + previousLoadingTrigger === LoadingTrigger.VIEWPORT && + newLoadingTrigger === LoadingTrigger.SCROLL_END + ) { + resetGrid(); + return; + } + + // switching from infinite loading to lazy loading should reset the grid only if the known row count + // is smaller than the amount of rows rendered + const tree = privateApiRef.current.state.rows.tree; + const rootGroup = tree[GRID_ROOT_GROUP_ID] as GridGroupNode; + const rootGroupChildren = [...rootGroup.children]; + + const pageRowCount = privateApiRef.current.state.pagination.rowCount; + const rootChildrenCount = rootGroupChildren.length; + + if (rootChildrenCount > pageRowCount) { + resetGrid(); + } + }, + [privateApiRef, resetGrid], + ); + + const addSkeletonRows = React.useCallback(() => { + const tree = privateApiRef.current.state.rows.tree; + const rootGroup = tree[GRID_ROOT_GROUP_ID] as GridGroupNode; + const rootGroupChildren = [...rootGroup.children]; + + const pageRowCount = privateApiRef.current.state.pagination.rowCount; + const rootChildrenCount = rootGroupChildren.length; + + /** + * Do nothing if + * - rowCount is unknown + * - children count is 0 + * - children count is equal to rowCount + */ + if ( + pageRowCount === -1 || + pageRowCount === undefined || + rootChildrenCount === 0 || + rootChildrenCount === pageRowCount + ) { + return; + } + + // fill the grid with skeleton rows + for (let i = 0; i < pageRowCount - rootChildrenCount; i += 1) { + const skeletonId = getSkeletonRowId(i + rootChildrenCount); // to avoid duplicate keys on rebuild + rootGroupChildren.push(skeletonId); + + const skeletonRowNode: GridSkeletonRowNode = { + type: 'skeletonRow', + id: skeletonId, + parent: GRID_ROOT_GROUP_ID, + depth: 0, + }; + + tree[skeletonId] = skeletonRowNode; + } + + tree[GRID_ROOT_GROUP_ID] = { ...rootGroup, children: rootGroupChildren }; + + privateApiRef.current.setState( + (state) => ({ + ...state, + rows: { + ...state.rows, + tree, + }, + }), + 'addSkeletonRows', + ); + }, [privateApiRef]); + + const rebuildSkeletonRows = React.useCallback(() => { + // replace all data rows with skeleton rows. + const tree = privateApiRef.current.state.rows.tree; + const rootGroup = tree[GRID_ROOT_GROUP_ID] as GridGroupNode; + const rootGroupChildren = [...rootGroup.children]; + + for (let i = 0; i < rootGroupChildren.length; i += 1) { + if (tree[rootGroupChildren[i]]?.type === 'skeletonRow') { + continue; + } + + const skeletonId = getSkeletonRowId(i); + rootGroupChildren[i] = skeletonId; + + const skeletonRowNode: GridSkeletonRowNode = { + type: 'skeletonRow', + id: skeletonId, + parent: GRID_ROOT_GROUP_ID, + depth: 0, + }; + + tree[rootGroupChildren[i]] = skeletonRowNode; + } + + tree[GRID_ROOT_GROUP_ID] = { ...rootGroup, children: rootGroupChildren }; + + privateApiRef.current.setState( + (state) => ({ + ...state, + rows: { + ...state.rows, + tree, + }, + }), + 'addSkeletonRows', + ); + }, [privateApiRef]); + + const updateLoadingTrigger = React.useCallback( + (rowCount: number) => { + const newLoadingTrigger = + rowCount === -1 ? LoadingTrigger.SCROLL_END : LoadingTrigger.VIEWPORT; + + if (loadingTrigger.current !== newLoadingTrigger) { + loadingTrigger.current = newLoadingTrigger; + } + + if (loadingTrigger.current !== null) { + ensureValidRowCount(loadingTrigger.current, newLoadingTrigger); + } + }, + [ensureValidRowCount], + ); + + const handleDataUpdate = React.useCallback>( + (params) => { + if ('error' in params) { + return; + } + + const { response, fetchParams } = params; + const pageRowCount = privateApiRef.current.state.pagination.rowCount; + if (response.rowCount !== undefined || pageRowCount === undefined) { + privateApiRef.current.setRowCount(response.rowCount === undefined ? -1 : response.rowCount); + } + + // scroll to the top if the rows are stale and the new request is for the first page + if (rowsStale.current && params.fetchParams.start === 0) { + privateApiRef.current.scroll({ top: 0 }); + // the rows can safely be replaced. skeleton rows will be added later + privateApiRef.current.setRows(response.rows); + } else { + // having stale rows while not having a request for the first page means that the scroll position should be maintained + // convert all existing data to skeleton rows to avoid duplicate keys + if (rowsStale.current) { + rebuildSkeletonRows(); + } + + const startingIndex = + typeof fetchParams.start === 'string' + ? Math.max(filteredSortedRowIds.indexOf(fetchParams.start), 0) + : fetchParams.start; + + privateApiRef.current.unstable_replaceRows(startingIndex, response.rows); + } + + rowsStale.current = false; + + if (loadingTrigger.current === null) { + updateLoadingTrigger(privateApiRef.current.state.pagination.rowCount); + } + + addSkeletonRows(); + privateApiRef.current.setLoading(false); + privateApiRef.current.requestPipeProcessorsApplication('hydrateRows'); + }, + [ + privateApiRef, + filteredSortedRowIds, + updateLoadingTrigger, + rebuildSkeletonRows, + addSkeletonRows, + ], + ); + + const handleRowCountChange = React.useCallback(() => { + if (loadingTrigger.current === null) { + return; + } + + updateLoadingTrigger(privateApiRef.current.state.pagination.rowCount); + addSkeletonRows(); + privateApiRef.current.requestPipeProcessorsApplication('hydrateRows'); + }, [privateApiRef, updateLoadingTrigger, addSkeletonRows]); + + const handleScrolling: GridEventListener<'scrollPositionChange'> = React.useCallback( + (newScrollPosition) => { + if ( + loadingTrigger.current !== LoadingTrigger.SCROLL_END || + previousLastRowIndex.current >= renderContext.lastRowIndex + ) { + return; + } + + const position = newScrollPosition.top + dimensions.viewportInnerSize.height; + const target = dimensions.contentSize.height - props.scrollEndThreshold; + + if (position >= target) { + previousLastRowIndex.current = renderContext.lastRowIndex; + + const getRowsParams: GridGetRowsParams = { + start: renderContext.lastRowIndex, + end: renderContext.lastRowIndex + paginationModel.pageSize - 1, + sortModel, + filterModel, + }; + + privateApiRef.current.setLoading(true); + privateApiRef.current.unstable_dataSource.fetchRows( + GRID_ROOT_GROUP_ID, + adjustRowParams(getRowsParams), + ); + } + }, + [ + privateApiRef, + props.scrollEndThreshold, + sortModel, + filterModel, + dimensions, + paginationModel.pageSize, + renderContext.lastRowIndex, + adjustRowParams, + ], + ); + + const handleRenderedRowsIntervalChange = React.useCallback< + GridEventListener<'renderedRowsIntervalChange'> + >( + (params) => { + if (loadingTrigger.current !== LoadingTrigger.VIEWPORT) { + return; + } + + const getRowsParams: GridGetRowsParams = { + start: params.firstRowIndex, + end: params.lastRowIndex, + sortModel, + filterModel, + }; + + if ( + renderedRowsIntervalCache.current.firstRowToRender === params.firstRowIndex && + renderedRowsIntervalCache.current.lastRowToRender === params.lastRowIndex + ) { + return; + } + + renderedRowsIntervalCache.current = { + firstRowToRender: params.firstRowIndex, + lastRowToRender: params.lastRowIndex, + }; + + const currentVisibleRows = getVisibleRows(privateApiRef, { + pagination: props.pagination, + paginationMode: props.paginationMode, + }); + + const skeletonRowsSection = findSkeletonRowsSection({ + apiRef: privateApiRef, + visibleRows: currentVisibleRows.rows, + range: { + firstRowIndex: params.firstRowIndex, + lastRowIndex: params.lastRowIndex, + }, + }); + + if (!skeletonRowsSection) { + return; + } + + getRowsParams.start = skeletonRowsSection.firstRowIndex; + getRowsParams.end = skeletonRowsSection.lastRowIndex; + + privateApiRef.current.unstable_dataSource.fetchRows( + GRID_ROOT_GROUP_ID, + adjustRowParams(getRowsParams), + ); + }, + [ + privateApiRef, + props.pagination, + props.paginationMode, + sortModel, + filterModel, + adjustRowParams, + ], + ); + + const throttledHandleRenderedRowsIntervalChange = React.useMemo( + () => throttle(handleRenderedRowsIntervalChange, props.unstable_lazyLoadingRequestThrottleMs), + [props.unstable_lazyLoadingRequestThrottleMs, handleRenderedRowsIntervalChange], + ); + + const handleGridSortModelChange = React.useCallback>( + (newSortModel) => { + rowsStale.current = true; + previousLastRowIndex.current = 0; + const rangeParams = + loadingTrigger.current === LoadingTrigger.VIEWPORT + ? { + start: renderContext.firstRowIndex, + end: renderContext.lastRowIndex, + } + : { + start: 0, + end: paginationModel.pageSize - 1, + }; + + const getRowsParams: GridGetRowsParams = { + ...rangeParams, + sortModel: newSortModel, + filterModel, + }; + + privateApiRef.current.setLoading(true); + privateApiRef.current.unstable_dataSource.fetchRows( + GRID_ROOT_GROUP_ID, + adjustRowParams(getRowsParams), + ); + }, + [privateApiRef, filterModel, paginationModel.pageSize, renderContext, adjustRowParams], + ); + + const handleGridFilterModelChange = React.useCallback>( + (newFilterModel) => { + rowsStale.current = true; + previousLastRowIndex.current = 0; + const getRowsParams: GridGetRowsParams = { + start: 0, + end: paginationModel.pageSize - 1, + sortModel, + filterModel: newFilterModel, + }; + + privateApiRef.current.setLoading(true); + privateApiRef.current.unstable_dataSource.fetchRows(GRID_ROOT_GROUP_ID, getRowsParams); + }, + [privateApiRef, sortModel, paginationModel.pageSize], + ); + + const handleStrategyActivityChange = React.useCallback< + GridEventListener<'strategyAvailabilityChange'> + >(() => { + setLazyLoadingRowsUpdateStrategyActive( + privateApiRef.current.getActiveStrategy(GridStrategyGroup.DataSource) === + DataSourceRowsUpdateStrategy.LazyLoading, + ); + }, [privateApiRef]); + + useGridRegisterStrategyProcessor( + privateApiRef, + DataSourceRowsUpdateStrategy.LazyLoading, + 'dataSourceRowsUpdate', + handleDataUpdate, + ); + + useGridApiEventHandler(privateApiRef, 'strategyAvailabilityChange', handleStrategyActivityChange); + + useGridApiEventHandler( + privateApiRef, + 'rowCountChange', + runIf(lazyLoadingRowsUpdateStrategyActive, handleRowCountChange), + ); + useGridApiEventHandler( + privateApiRef, + 'scrollPositionChange', + runIf(lazyLoadingRowsUpdateStrategyActive, handleScrolling), + ); + useGridApiEventHandler( + privateApiRef, + 'renderedRowsIntervalChange', + runIf(lazyLoadingRowsUpdateStrategyActive, throttledHandleRenderedRowsIntervalChange), + ); + useGridApiEventHandler( + privateApiRef, + 'sortModelChange', + runIf(lazyLoadingRowsUpdateStrategyActive, handleGridSortModelChange), + ); + useGridApiEventHandler( + privateApiRef, + 'filterModelChange', + runIf(lazyLoadingRowsUpdateStrategyActive, handleGridFilterModelChange), + ); + + React.useEffect(() => { + setStrategyAvailability(); + }, [setStrategyAvailability]); +}; diff --git a/packages/x-data-grid-pro/src/hooks/features/serverSideTreeData/useGridDataSourceTreeDataPreProcessors.tsx b/packages/x-data-grid-pro/src/hooks/features/serverSideTreeData/useGridDataSourceTreeDataPreProcessors.tsx index 0c6b841f939d8..f2bc190bade4a 100644 --- a/packages/x-data-grid-pro/src/hooks/features/serverSideTreeData/useGridDataSourceTreeDataPreProcessors.tsx +++ b/packages/x-data-grid-pro/src/hooks/features/serverSideTreeData/useGridDataSourceTreeDataPreProcessors.tsx @@ -11,6 +11,7 @@ import { import { GridPipeProcessor, GridRowsPartialUpdates, + GridStrategyGroup, GridStrategyProcessor, useGridRegisterPipeProcessor, useGridRegisterStrategyProcessor, @@ -51,7 +52,7 @@ export const useGridDataSourceTreeDataPreProcessors = ( ) => { const setStrategyAvailability = React.useCallback(() => { privateApiRef.current.setStrategyAvailability( - 'rowTree', + GridStrategyGroup.RowTree, TreeDataStrategy.DataSource, props.treeData && props.unstable_dataSource ? () => true : () => false, ); diff --git a/packages/x-data-grid-pro/src/hooks/features/treeData/useGridTreeDataPreProcessors.tsx b/packages/x-data-grid-pro/src/hooks/features/treeData/useGridTreeDataPreProcessors.tsx index 6a5753c9eb60f..82ae012ad8512 100644 --- a/packages/x-data-grid-pro/src/hooks/features/treeData/useGridTreeDataPreProcessors.tsx +++ b/packages/x-data-grid-pro/src/hooks/features/treeData/useGridTreeDataPreProcessors.tsx @@ -10,6 +10,7 @@ import { } from '@mui/x-data-grid'; import { GridPipeProcessor, + GridStrategyGroup, GridStrategyProcessor, useGridRegisterPipeProcessor, useGridRegisterStrategyProcessor, @@ -51,7 +52,7 @@ export const useGridTreeDataPreProcessors = ( ) => { const setStrategyAvailability = React.useCallback(() => { privateApiRef.current.setStrategyAvailability( - 'rowTree', + GridStrategyGroup.RowTree, TreeDataStrategy.Default, props.treeData && !props.unstable_dataSource ? () => true : () => false, ); diff --git a/packages/x-data-grid-pro/src/internals/index.ts b/packages/x-data-grid-pro/src/internals/index.ts index ed619bb0cc9e4..f821f34170111 100644 --- a/packages/x-data-grid-pro/src/internals/index.ts +++ b/packages/x-data-grid-pro/src/internals/index.ts @@ -43,6 +43,7 @@ export { } from '../hooks/features/rowPinning/useGridRowPinningPreProcessors'; export { useGridLazyLoader } from '../hooks/features/lazyLoader/useGridLazyLoader'; export { useGridLazyLoaderPreProcessors } from '../hooks/features/lazyLoader/useGridLazyLoaderPreProcessors'; +export { useGridDataSourceLazyLoader } from '../hooks/features/serverSideLazyLoader/useGridDataSourceLazyLoader'; export { useGridDataSource, dataSourceStateInitializer, diff --git a/packages/x-data-grid-pro/src/internals/propValidation.ts b/packages/x-data-grid-pro/src/internals/propValidation.ts index 13f138529d47b..06367108d22e9 100644 --- a/packages/x-data-grid-pro/src/internals/propValidation.ts +++ b/packages/x-data-grid-pro/src/internals/propValidation.ts @@ -31,4 +31,10 @@ export const propValidatorsDataGridPro: PropValidator isNumber(props.rowCount) && 'MUI X: Usage of the `rowCount` prop with client side pagination (`paginationMode="client"`) has no effect. `rowCount` is only meant to be used with `paginationMode="server"`.') || undefined, + (props) => + (props.signature !== GridSignature.DataGrid && + (props.rowsLoadingMode === 'server' || props.onRowsScrollEnd) && + props.unstable_lazyLoading && + 'MUI X: Usage of the client side lazy loading (`rowsLoadingMode="server"` or `onRowsScrollEnd=...`) cannot be used together with server side lazy loading `unstable_lazyLoading="true"`.') || + undefined, ]; diff --git a/packages/x-data-grid-pro/src/models/dataGridProProps.ts b/packages/x-data-grid-pro/src/models/dataGridProProps.ts index d2e2c490600d3..af091b4e93408 100644 --- a/packages/x-data-grid-pro/src/models/dataGridProProps.ts +++ b/packages/x-data-grid-pro/src/models/dataGridProProps.ts @@ -77,6 +77,7 @@ export interface DataGridProPropsWithDefaultValue - Columns', () => { const baselineProps = { autoHeight: isJSDOM, rows: [ - { - id: 0, - brand: 'Nike', - }, - { - id: 1, - brand: 'Adidas', - }, - { - id: 2, - brand: 'Puma', - }, + { id: 0, brand: 'Nike' }, + { id: 1, brand: 'Adidas' }, + { id: 2, brand: 'Puma' }, ], columns: [{ field: 'brand' }], }; @@ -166,11 +157,11 @@ describe(' - Columns', () => { await microtasks(); expect(onColumnWidthChange.callCount).to.be.at.least(2); const widthArgs = onColumnWidthChange.args.map((arg) => arg[0].width); - const isWidth114Present = widthArgs.some((width) => width === 114); - expect(isWidth114Present).to.equal(true); + const isWidth120Present = widthArgs.some((width) => width === 120); + expect(isWidth120Present).to.equal(true); const colDefWidthArgs = onColumnWidthChange.args.map((arg) => arg[0].colDef.width); - const isColDefWidth114Present = colDefWidthArgs.some((width) => width === 114); - expect(isColDefWidth114Present).to.equal(true); + const isColDefWidth120Present = colDefWidthArgs.some((width) => width === 120); + expect(isColDefWidth120Present).to.equal(true); }); it('should not affect other cell elements that are not part of the main DataGrid instance', () => { @@ -516,22 +507,10 @@ describe(' - Columns', () => { }); const rows = [ - { - id: 0, - brand: 'Nike', - }, - { - id: 1, - brand: 'Adidas', - }, - { - id: 2, - brand: 'Puma', - }, - { - id: 3, - brand: 'Lululemon Athletica', - }, + { id: 0, brand: 'Nike' }, + { id: 1, brand: 'Adidas' }, + { id: 2, brand: 'Puma' }, + { id: 3, brand: 'Lululemon Athletica' }, ]; const columns = [ { field: 'id', headerName: 'This is the ID column' }, @@ -546,7 +525,7 @@ describe(' - Columns', () => { render(); await apiRef.current.autosizeColumns(); await microtasks(); - expect(getWidths()).to.deep.equal([211, 233]); + expect(getWidths()).to.deep.equal([155, 177]); }); it('should work through double-clicking the separator', async () => { @@ -556,14 +535,34 @@ describe(' - Columns', () => { )[1]; fireEvent.doubleClick(separator); await microtasks(); - expect(getWidths()).to.deep.equal([100, 233]); + expect(getWidths()).to.deep.equal([100, 177]); }); it('should work on mount', async () => { render(); await microtasks(); /* first effect after render */ await microtasks(); /* async autosize operation */ - expect(getWidths()).to.deep.equal([211, 233]); + expect(getWidths()).to.deep.equal([155, 177]); + }); + + it('should work with flex columns', async () => { + render( + , + ); + const separators = document.querySelectorAll(`.${gridClasses['columnSeparator--resizable']}`); + fireEvent.doubleClick(separators[0]); + await microtasks(); + expect(columns.map((_, i) => getColumnHeaderCell(i).offsetWidth)).to.deep.equal([50, 233]); + + fireEvent.doubleClick(separators[1]); + await microtasks(); + expect(columns.map((_, i) => getColumnHeaderCell(i).offsetWidth)).to.deep.equal([50, 64]); }); describe('options', () => { @@ -579,7 +578,7 @@ describe(' - Columns', () => { }); it('.includeHeaders works', async () => { - await autosize({ includeHeaders: true }, [211, 233]); + await autosize({ includeHeaders: true }, [155, 177]); }); it('.includeOutliers works', async () => { diff --git a/packages/x-data-grid-pro/src/tests/dataSourceLazyLoader.DataGridPro.test.tsx b/packages/x-data-grid-pro/src/tests/dataSourceLazyLoader.DataGridPro.test.tsx new file mode 100644 index 0000000000000..9053706deeb6a --- /dev/null +++ b/packages/x-data-grid-pro/src/tests/dataSourceLazyLoader.DataGridPro.test.tsx @@ -0,0 +1,337 @@ +import * as React from 'react'; +import { useMockServer } from '@mui/x-data-grid-generator'; +import { createRenderer, waitFor } from '@mui/internal-test-utils'; +import { getRow } from 'test/utils/helperFn'; +import { expect } from 'chai'; +import { + DataGridPro, + DataGridProProps, + GridApi, + GridDataSource, + GridGetRowsParams, + GridGetRowsResponse, + useGridApiRef, +} from '@mui/x-data-grid-pro'; +import { SinonSpy, spy } from 'sinon'; + +const isJSDOM = /jsdom/.test(window.navigator.userAgent); + +describe(' - Data source lazy loader', () => { + const { render } = createRenderer(); + const defaultTransformGetRowsResponse = (response: GridGetRowsResponse) => response; + + let transformGetRowsResponse: (response: GridGetRowsResponse) => GridGetRowsResponse; + let apiRef: React.MutableRefObject; + let fetchRowsSpy: SinonSpy; + let mockServer: ReturnType; + + function TestDataSourceLazyLoader(props: Partial) { + apiRef = useGridApiRef(); + mockServer = useMockServer( + { rowLength: 100, maxColumns: 1 }, + { useCursorPagination: false, minDelay: 0, maxDelay: 0, verbose: false }, + ); + fetchRowsSpy = spy(mockServer, 'fetchRows'); + const { fetchRows } = mockServer; + + const dataSource: GridDataSource = React.useMemo( + () => ({ + getRows: async (params: GridGetRowsParams) => { + const urlParams = new URLSearchParams({ + filterModel: JSON.stringify(params.filterModel), + sortModel: JSON.stringify(params.sortModel), + start: `${params.start}`, + end: `${params.end}`, + }); + + const getRowsResponse = await fetchRows( + `https://mui.com/x/api/data-grid?${urlParams.toString()}`, + ); + + const response = transformGetRowsResponse(getRowsResponse); + return { + rows: response.rows, + rowCount: response.rowCount, + }; + }, + }), + [fetchRows], + ); + + const baselineProps = { + unstable_dataSource: dataSource, + columns: mockServer.columns, + unstable_lazyLoading: true, + paginationModel: { page: 0, pageSize: 10 }, + disableVirtualization: true, + }; + + return ( +
+ +
+ ); + } + + beforeEach(function beforeTest() { + if (isJSDOM) { + this.skip(); // Needs layout + } + + transformGetRowsResponse = defaultTransformGetRowsResponse; + }); + + it('should load the first page initially', async () => { + render(); + await waitFor(() => { + expect(fetchRowsSpy.callCount).to.equal(1); + }); + }); + + describe('Viewport loading', () => { + it('should render skeleton rows if rowCount is bigger than the number of rows', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // The 11th row should be a skeleton + expect(getRow(10).dataset.id).to.equal('auto-generated-skeleton-row-root-10'); + }); + + it('should make a new data source request once the skeleton rows are in the render context', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // reset the spy call count + fetchRowsSpy.resetHistory(); + + apiRef.current.scrollToIndexes({ rowIndex: 10 }); + + await waitFor(() => { + expect(fetchRowsSpy.callCount).to.equal(1); + }); + }); + + it('should keep the scroll position when sorting is applied', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + const initialSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + expect(initialSearchParams.get('end')).to.equal('9'); + + apiRef.current.scrollToIndexes({ rowIndex: 10 }); + + await waitFor(() => { + expect(fetchRowsSpy.callCount).to.equal(2); + }); + + const beforeSortSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + expect(beforeSortSearchParams.get('end')).to.not.equal('9'); + + apiRef.current.sortColumn(mockServer.columns[0].field, 'asc'); + + await waitFor(() => { + expect(fetchRowsSpy.callCount).to.equal(3); + }); + + const afterSortSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + expect(afterSortSearchParams.get('end')).to.equal(beforeSortSearchParams.get('end')); + }); + + it('should reset the scroll position when filter is applied', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + apiRef.current.scrollToIndexes({ rowIndex: 10 }); + + await waitFor(() => { + expect(fetchRowsSpy.callCount).to.equal(2); + }); + + const beforeFilteringSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + // first row is not the first page anymore + expect(beforeFilteringSearchParams.get('start')).to.not.equal('0'); + + apiRef.current.setFilterModel({ + items: [ + { + field: mockServer.columns[0].field, + value: '0', + operator: 'contains', + }, + ], + }); + + await waitFor(() => { + expect(fetchRowsSpy.callCount).to.equal(3); + }); + + const afterFilteringSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + // first row is the start of the first page + expect(afterFilteringSearchParams.get('start')).to.equal('0'); + }); + }); + + describe('Infinite loading', () => { + beforeEach(() => { + // override rowCount + transformGetRowsResponse = (response) => ({ ...response, rowCount: -1 }); + }); + + it('should not render skeleton rows if rowCount is unknown', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // The 11th row should not exist + expect(() => getRow(10)).to.throw(); + }); + + it('should make a new data source request in infinite loading mode once the bottom row is reached', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // reset the spy call count + fetchRowsSpy.resetHistory(); + + // make one small and one big scroll that makes sure that the bottom of the grid window is reached + apiRef.current.scrollToIndexes({ rowIndex: 1 }); + apiRef.current.scrollToIndexes({ rowIndex: 9 }); + + // Only one additional fetch should have been made + await waitFor(() => { + expect(fetchRowsSpy.callCount).to.equal(1); + }); + }); + + it('should reset the scroll position when sorting is applied', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + apiRef.current.scrollToIndexes({ rowIndex: 9 }); + + // wait until the rows are rendered + await waitFor(() => expect(getRow(10)).not.to.be.undefined); + + const beforeSortingSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + // last row is not the first page anymore + expect(beforeSortingSearchParams.get('end')).to.not.equal('9'); + + apiRef.current.sortColumn(mockServer.columns[0].field, 'asc'); + + const afterSortingSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + // last row is the end of the first page + expect(afterSortingSearchParams.get('end')).to.equal('9'); + }); + + it('should reset the scroll position when filter is applied', async () => { + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + apiRef.current.scrollToIndexes({ rowIndex: 9 }); + + // wait until the rows are rendered + await waitFor(() => expect(getRow(10)).not.to.be.undefined); + + const beforeFilteringSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + // last row is not the first page anymore + expect(beforeFilteringSearchParams.get('end')).to.not.equal('9'); + + apiRef.current.setFilterModel({ + items: [ + { + field: mockServer.columns[0].field, + value: '0', + operator: 'contains', + }, + ], + }); + + const afterFilteringSearchParams = new URL(fetchRowsSpy.lastCall.args[0]).searchParams; + // last row is the end of the first page + expect(afterFilteringSearchParams.get('end')).to.equal('9'); + }); + }); + + describe('Row count updates', () => { + it('should add skeleton rows once the rowCount becomes known', async () => { + // override rowCount + transformGetRowsResponse = (response) => ({ ...response, rowCount: undefined }); + const { setProps } = render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // The 11th row should not exist + expect(() => getRow(10)).to.throw(); + + // make the rowCount known + setProps({ rowCount: 100 }); + + // The 11th row should be a skeleton + expect(getRow(10).dataset.id).to.equal('auto-generated-skeleton-row-root-10'); + }); + + it('should reset the grid if the rowCount becomes unknown', async () => { + // override rowCount + transformGetRowsResponse = (response) => ({ ...response, rowCount: undefined }); + const { setProps } = render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // The 11th row should not exist + expect(getRow(10).dataset.id).to.equal('auto-generated-skeleton-row-root-10'); + + // make the rowCount unknown + setProps({ rowCount: -1 }); + + // The 11th row should not exist + expect(() => getRow(10)).to.throw(); + }); + + it('should reset the grid if the rowCount becomes smaller than the actual row count', async () => { + // override rowCount + transformGetRowsResponse = (response) => ({ ...response, rowCount: undefined }); + render( + , + ); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // reset the spy call count + fetchRowsSpy.resetHistory(); + + // reduce the rowCount to be more than the number of rows + apiRef.current.setRowCount(80); + expect(fetchRowsSpy.callCount).to.equal(0); + + // reduce the rowCount once more, but now to be less than the number of rows + apiRef.current.setRowCount(20); + await waitFor(() => expect(fetchRowsSpy.callCount).to.equal(1)); + }); + + it('should allow setting the row count via API', async () => { + // override rowCount + transformGetRowsResponse = (response) => ({ ...response, rowCount: undefined }); + render(); + // wait until the rows are rendered + await waitFor(() => expect(getRow(0)).not.to.be.undefined); + + // The 11th row should not exist + expect(() => getRow(10)).to.throw(); + + // set the rowCount via API + apiRef.current.setRowCount(100); + + // wait until the rows are added + await waitFor(() => expect(getRow(10)).not.to.be.undefined); + // The 11th row should be a skeleton + expect(getRow(10).dataset.id).to.equal('auto-generated-skeleton-row-root-10'); + }); + }); +}); 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 0f52a5973d60d..be6c832a2d931 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 @@ -16,6 +16,7 @@ import { gridClasses, GridColDef, getGridStringOperators, + GridFilterItem, } from '@mui/x-data-grid-pro'; import { createRenderer, fireEvent, screen, act, within } from '@mui/internal-test-utils'; import { expect } from 'chai'; @@ -1118,6 +1119,74 @@ describe(' - Filter', () => { ); }).not.toErrorDev(); }); + + it('should work correctly with boolean column type', () => { + const getRows = (item: Omit) => { + const { unmount } = render( + { + const value = params.value as boolean | null | undefined; + + if (value === null) { + return 'null'; + } + + if (value === undefined) { + return 'undefined'; + } + + return value.toString(); + }, + }, + ]} + headerFilters + />, + ); + const values = getColumnValues(0); + unmount(); + return values; + }; + const ALL_ROWS = ['undefined', 'null', 'true', 'false']; + const TRUTHY_ROWS = ['true']; + const FALSY_ROWS = ['undefined', 'null', 'false']; + + expect(getRows({ operator: 'is', value: 'true' })).to.deep.equal(TRUTHY_ROWS); + expect(getRows({ operator: 'is', value: true })).to.deep.equal(TRUTHY_ROWS); + + expect(getRows({ operator: 'is', value: 'false' })).to.deep.equal(FALSY_ROWS); + expect(getRows({ operator: 'is', value: false })).to.deep.equal(FALSY_ROWS); + + expect(getRows({ operator: 'is', value: '' })).to.deep.equal(ALL_ROWS); + expect(getRows({ operator: 'is', value: undefined })).to.deep.equal(ALL_ROWS); + expect(getRows({ operator: 'is', value: null })).to.deep.equal(ALL_ROWS); + expect(getRows({ operator: 'is', value: 'test' })).to.deep.equal(ALL_ROWS); // Ignores invalid values + }); }); describe('Read-only filters', () => { 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 20c3b1ab06814..83d587752c507 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,8 +1,8 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { createRenderer, fireEvent, createEvent } from '@mui/internal-test-utils'; -import { getCell, getRowsFieldContent } from 'test/utils/helperFn'; +import { createRenderer, fireEvent, screen, createEvent } from '@mui/internal-test-utils'; +import { getCell, getColumnValues, getRowsFieldContent } from 'test/utils/helperFn'; import { useGridApiRef, DataGridPro, gridClasses, GridApi } from '@mui/x-data-grid-pro'; import { useBasicDemoData } from '@mui/x-data-grid-generator'; @@ -200,4 +200,50 @@ describe(' - Row reorder', () => { expect(handleDragOver.callCount).to.equal(0); expect(handleDragEnd.callCount).to.equal(0); }); + + it('should reorder rows correctly on any page when pagination is enabled', () => { + let apiRef: React.MutableRefObject; + const rows = [ + { id: 0, brand: 'Nike' }, + { id: 1, brand: 'Adidas' }, + { id: 2, brand: 'Puma' }, + { id: 3, brand: 'Skechers' }, + ]; + const columns = [{ field: 'brand' }]; + + function Test() { + apiRef = useGridApiRef(); + + return ( +
+ +
+ ); + } + + render(); + fireEvent.click(screen.getByRole('button', { name: /next page/i })); + expect(getColumnValues(0)).to.deep.equal(['2', '3']); + expect(getRowsFieldContent('brand')).to.deep.equal(['Puma', 'Skechers']); + const rowReorderCell = getCell(2, 0).firstChild!; + const targetCell = getCell(3, 0); + + fireEvent.dragStart(rowReorderCell); + fireEvent.dragEnter(targetCell); + const dragOverEvent = createDragOverEvent(targetCell); + fireEvent(targetCell, dragOverEvent); + expect(getRowsFieldContent('brand')).to.deep.equal(['Skechers', 'Puma']); + }); }); 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 2a5883e2b8a09..18df7ed58dfa6 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 @@ -219,6 +219,7 @@ describe(' - Row selection', () => { rows={gridRows} onFilterModelChange={onFilterChange} keepNonExistentRowsSelected + rowSelectionPropagation={{ parents: false, descendants: false }} /> ); } @@ -938,7 +939,12 @@ describe(' - Row selection', () => { describe('apiRef: selectRows', () => { it('should call onRowSelectionModelChange with the ids selected', () => { const handleRowSelectionModelChange = spy(); - render(); + render( + , + ); act(() => apiRef.current.selectRows([1, 2])); expect(handleRowSelectionModelChange.lastCall.args[0]).to.deep.equal([1, 2]); diff --git a/packages/x-data-grid-pro/src/typeOverloads/modules.ts b/packages/x-data-grid-pro/src/typeOverloads/modules.ts index 1d0fe7a306e60..430f21d777f4c 100644 --- a/packages/x-data-grid-pro/src/typeOverloads/modules.ts +++ b/packages/x-data-grid-pro/src/typeOverloads/modules.ts @@ -42,6 +42,7 @@ export interface GridEventLookupPro { rowOrderChange: { params: GridRowOrderChangeParams }; /** * Fired when a new batch of rows is requested to be loaded. Called with a [[GridFetchRowsParams]] object. + * Used to trigger `onFetchRows`. */ fetchRows: { params: GridFetchRowsParams }; } diff --git a/packages/x-data-grid/package.json b/packages/x-data-grid/package.json index 7bdd01078ad41..8e1de4c44dcbc 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": "8.0.0-alpha.1", + "version": "8.0.0-alpha.3", "description": "The Community plan edition of the Data Grid components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -71,12 +71,12 @@ } }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", + "@mui/internal-test-utils": "^1.0.22", "@mui/joy": "^5.0.0-beta.48", - "@mui/material": "^5.16.7", - "@mui/system": "^5.16.7", + "@mui/material": "^5.16.9", + "@mui/system": "^5.16.8", "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.13", + "@types/prop-types": "^15.7.14", "rimraf": "^6.0.1" }, "engines": { diff --git a/packages/x-data-grid/src/DataGrid/DataGrid.tsx b/packages/x-data-grid/src/DataGrid/DataGrid.tsx index d908551b9a847..0f6d3ebc3b95b 100644 --- a/packages/x-data-grid/src/DataGrid/DataGrid.tsx +++ b/packages/x-data-grid/src/DataGrid/DataGrid.tsx @@ -726,14 +726,6 @@ DataGridRaw.propTypes = { * Controls the modes of the rows. */ rowModesModel: PropTypes.object, - /** - * The milliseconds delay to wait after measuring the row height before recalculating row positions. - * Setting it to a lower value could be useful when using dynamic row height, - * but might reduce performance when displaying a large number of rows. - * @default 166 - * @deprecated - */ - rowPositionsDebounceMs: PropTypes.number, /** * Set of rows of type [[GridRowsProp]]. * @default [] @@ -757,6 +749,11 @@ DataGridRaw.propTypes = { * @default "margin" */ rowSpacingType: PropTypes.oneOf(['border', 'margin']), + /** + * If `true`, the Data Grid will auto span the cells over the rows having the same value. + * @default false + */ + rowSpanning: PropTypes.bool, /** * Override the height/width of the Data Grid inner scrollbar. */ @@ -808,11 +805,6 @@ DataGridRaw.propTypes = { PropTypes.func, PropTypes.object, ]), - /** - * If `true`, the Data Grid will auto span the cells over the rows having the same value. - * @default false - */ - unstable_rowSpanning: PropTypes.bool, /** * If `true`, the Data Grid enables column virtualization when `getRowHeight` is set to `() => 'auto'`. * By default, column virtualization is disabled when dynamic row height is enabled to measure the row height correctly. diff --git a/packages/x-data-grid/src/components/GridPagination.tsx b/packages/x-data-grid/src/components/GridPagination.tsx index 8d117112208d6..909ec8820c410 100644 --- a/packages/x-data-grid/src/components/GridPagination.tsx +++ b/packages/x-data-grid/src/components/GridPagination.tsx @@ -48,7 +48,8 @@ const defaultLabelDisplayedRows: WrappedLabelDisplayedRows = ({ from, to, count, if (!estimated) { return `${from}–${to} of ${count !== -1 ? count : `more than ${to}`}`; } - return `${from}–${to} of ${count !== -1 ? count : `more than ${estimated > to ? estimated : to}`}`; + const estimateLabel = estimated && estimated > to ? `around ${estimated}` : `more than ${to}`; + return `${from}–${to} of ${count !== -1 ? count : estimateLabel}`; }; // A mutable version of a readonly array. diff --git a/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx b/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx index a3e7877b9b499..d20cf2cd870f3 100644 --- a/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx +++ b/packages/x-data-grid/src/components/columnSelection/GridHeaderCheckbox.tsx @@ -68,10 +68,14 @@ const GridHeaderCheckbox = React.forwardRef>((acc, id) => { + if (!apiRef.current.isRowSelectable(id)) { + return acc; + } acc[id] = true; return acc; }, {}); }, [ + apiRef, rootProps.pagination, rootProps.checkboxSelectionVisibleOnly, paginatedVisibleRowIds, diff --git a/packages/x-data-grid/src/constants/dataGridPropsDefaultValues.ts b/packages/x-data-grid/src/constants/dataGridPropsDefaultValues.ts index 120a47f06c228..df9cfed47780e 100644 --- a/packages/x-data-grid/src/constants/dataGridPropsDefaultValues.ts +++ b/packages/x-data-grid/src/constants/dataGridPropsDefaultValues.ts @@ -47,15 +47,14 @@ export const DATA_GRID_PROPS_DEFAULT_VALUES: DataGridPropsWithDefaultValues = { resizeThrottleMs: 60, rowBufferPx: 150, rowHeight: 52, - rowPositionsDebounceMs: 166, rows: [], rowSelection: true, rowSpacingType: 'margin', + rowSpanning: false, showCellVerticalBorder: false, showColumnVerticalBorder: false, sortingMode: 'client', sortingOrder: ['asc' as const, 'desc' as const, null], throttleRowsMs: 0, - unstable_rowSpanning: false, virtualizeColumnsWithAutoRowHeight: false, }; diff --git a/packages/x-data-grid/src/hooks/core/strategyProcessing/gridStrategyProcessingApi.ts b/packages/x-data-grid/src/hooks/core/strategyProcessing/gridStrategyProcessingApi.ts index ef4094d3887fb..3daf33790fe03 100644 --- a/packages/x-data-grid/src/hooks/core/strategyProcessing/gridStrategyProcessingApi.ts +++ b/packages/x-data-grid/src/hooks/core/strategyProcessing/gridStrategyProcessingApi.ts @@ -13,30 +13,48 @@ import { GridSortingMethodParams, GridSortingMethodValue, } from '../../features/sorting/gridSortingState'; +import { GridGetRowsParams, GridGetRowsResponse } from '../../../models/gridDataSource'; export type GridStrategyProcessorName = keyof GridStrategyProcessingLookup; -export type GridStrategyGroup = - GridStrategyProcessingLookup[keyof GridStrategyProcessingLookup]['group']; +export enum GridStrategyGroup { + DataSource = 'dataSource', + RowTree = 'rowTree', +} + +export type GridStrategyGroupValue = `${GridStrategyGroup}`; export interface GridStrategyProcessingLookup { + dataSourceRowsUpdate: { + group: GridStrategyGroup.DataSource; + params: + | { + response: GridGetRowsResponse; + fetchParams: GridGetRowsParams; + } + | { + error: Error; + fetchParams: GridGetRowsParams; + }; + value: void; + }; rowTreeCreation: { - group: 'rowTree'; + group: GridStrategyGroup.RowTree; params: GridRowTreeCreationParams; value: GridRowTreeCreationValue; }; filtering: { - group: 'rowTree'; + group: GridStrategyGroup.RowTree; params: GridFilteringMethodParams; value: GridFilteringMethodValue; }; sorting: { - group: 'rowTree'; + group: GridStrategyGroup.RowTree; params: GridSortingMethodParams; value: GridSortingMethodValue; }; visibleRowsLookupCreation: { - group: 'rowTree'; + group: GridStrategyGroup.RowTree; params: { tree: GridRowsState['tree']; filteredRowsLookup: GridFilterState['filteredRowsLookup']; @@ -66,21 +84,21 @@ export interface GridStrategyProcessingApi { ) => () => void; /** * Set a callback to know if a strategy is available. - * @param {GridStrategyGroup} strategyGroup The group for which we set strategy availability. + * @param {GridStrategyGroupValue} strategyGroup The group for which we set strategy availability. * @param {string} strategyName The name of the strategy. * @param {boolean} callback A callback to know if this strategy is available. */ setStrategyAvailability: ( - strategyGroup: GridStrategyGroup, + strategyGroup: GridStrategyGroupValue, strategyName: string, callback: () => boolean, ) => void; /** * Returns the name of the active strategy of a given strategy group - * @param {GridStrategyGroup} strategyGroup The group from which we want the active strategy. + * @param {GridStrategyGroupValue} strategyGroup The group from which we want the active strategy. * @returns {string} The name of the active strategy. */ - getActiveStrategy: (strategyGroup: GridStrategyGroup) => string; + getActiveStrategy: (strategyGroup: GridStrategyGroupValue) => string; /** * Run the processor registered for the active strategy. * @param {GridStrategyProcessorName} processorName The name of the processor to run. diff --git a/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridStrategyProcessing.ts b/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridStrategyProcessing.ts index 0dbe135f4d75d..1fc83517a1fcb 100644 --- a/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridStrategyProcessing.ts +++ b/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridStrategyProcessing.ts @@ -4,7 +4,7 @@ import { GridStrategyProcessor, GridStrategyProcessorName, GridStrategyProcessingApi, - GridStrategyProcessingLookup, + GridStrategyGroupValue, GridStrategyGroup, } from './gridStrategyProcessingApi'; import { useGridApiMethod } from '../../utils/useGridApiMethod'; @@ -12,12 +12,13 @@ import { useGridApiMethod } from '../../utils/useGridApiMethod'; export const GRID_DEFAULT_STRATEGY = 'none'; export const GRID_STRATEGIES_PROCESSORS: { - [P in GridStrategyProcessorName]: GridStrategyProcessingLookup[P]['group']; + [P in GridStrategyProcessorName]: GridStrategyGroupValue; } = { - rowTreeCreation: 'rowTree', - filtering: 'rowTree', - sorting: 'rowTree', - visibleRowsLookupCreation: 'rowTree', + dataSourceRowsUpdate: GridStrategyGroup.DataSource, + rowTreeCreation: GridStrategyGroup.RowTree, + filtering: GridStrategyGroup.RowTree, + sorting: GridStrategyGroup.RowTree, + visibleRowsLookupCreation: GridStrategyGroup.RowTree, }; type UntypedStrategyProcessors = { @@ -59,14 +60,11 @@ type UntypedStrategyProcessors = { * ===================================================================================================================== * * Each processor name is part of a strategy group which can only have one active strategy at the time. - * For now, there is only one strategy group named `rowTree` which customize - * - row tree creation algorithm. - * - sorting algorithm. - * - filtering algorithm. + * There are two active groups named `rowTree` and `dataSource`. */ export const useGridStrategyProcessing = (apiRef: React.MutableRefObject) => { const availableStrategies = React.useRef( - new Map boolean }>(), + new Map boolean }>(), ); const strategiesCache = React.useRef<{ [P in GridStrategyProcessorName]?: { [strategyName: string]: GridStrategyProcessor }; 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 7d166b1509981..75792dd697634 100644 --- a/packages/x-data-grid/src/hooks/features/columnResize/useGridColumnResize.tsx +++ b/packages/x-data-grid/src/hooks/features/columnResize/useGridColumnResize.tsx @@ -728,6 +728,7 @@ export const useGridColumnResize = ( ...column, width: widthByField[column.field], computedWidth: widthByField[column.field], + flex: 0, })); if (options.expand) { 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 dae588d1d1bdb..c29918e30bbf7 100644 --- a/packages/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts +++ b/packages/x-data-grid/src/hooks/features/dimensions/useGridDimensions.ts @@ -329,7 +329,7 @@ export function useGridDimensions( rootDimensionsRef.current = size; // jsdom has no layout capabilities - const isJSDOM = /jsdom/.test(window.navigator.userAgent); + const isJSDOM = /jsdom|HappyDOM/.test(window.navigator.userAgent); if (size.height === 0 && !errorShown.current && !props.autoHeight && !isJSDOM) { logger.error( diff --git a/packages/x-data-grid/src/hooks/features/editing/useGridCellEditing.ts b/packages/x-data-grid/src/hooks/features/editing/useGridCellEditing.ts index 92dfa83d8ddc2..189c13fc82bfd 100644 --- a/packages/x-data-grid/src/hooks/features/editing/useGridCellEditing.ts +++ b/packages/x-data-grid/src/hooks/features/editing/useGridCellEditing.ts @@ -31,7 +31,7 @@ import { useGridApiMethod } from '../../utils/useGridApiMethod'; import { gridEditRowsStateSelector } from './gridEditingSelectors'; import { GridRowId } from '../../../models/gridRows'; import { isPrintableKey, isPasteShortcut } from '../../../utils/keyboardUtils'; -import { gridRowsDataRowIdToIdLookupSelector } from '../rows/gridRowsSelector'; +import { gridRowsLookupSelector } from '../rows/gridRowsSelector'; import { deepClone } from '../../../utils/utils'; import { GridCellEditStartParams, @@ -560,7 +560,7 @@ export const useGridCellEditing = ( // Run this effect synchronously so that the keyboard event can impact the yet-to-be-rendered input. useEnhancedEffect(() => { - const idToIdLookup = gridRowsDataRowIdToIdLookupSelector(apiRef); + const rowsLookup = gridRowsLookupSelector(apiRef); // Update the ref here because updateStateToStopCellEditMode may change it later const copyOfPrevCellModes = prevCellModesModel.current; @@ -569,7 +569,7 @@ export const useGridCellEditing = ( Object.entries(cellModesModel).forEach(([id, fields]) => { Object.entries(fields).forEach(([field, params]) => { const prevMode = copyOfPrevCellModes[id]?.[field]?.mode || GridCellModes.View; - const originalId = idToIdLookup[id] ?? id; + const originalId = apiRef.current.getRowId(rowsLookup[id]) ?? id; if (params.mode === GridCellModes.Edit && prevMode === GridCellModes.View) { updateStateToStartCellEditMode({ id: originalId, field, ...params }); } else if (params.mode === GridCellModes.View && prevMode === GridCellModes.Edit) { diff --git a/packages/x-data-grid/src/hooks/features/editing/useGridRowEditing.ts b/packages/x-data-grid/src/hooks/features/editing/useGridRowEditing.ts index f0b21f9e62674..600c55d8d7f76 100644 --- a/packages/x-data-grid/src/hooks/features/editing/useGridRowEditing.ts +++ b/packages/x-data-grid/src/hooks/features/editing/useGridRowEditing.ts @@ -37,7 +37,7 @@ import { gridVisibleColumnFieldsSelector, } from '../columns/gridColumnsSelector'; import { GridCellParams } from '../../../models/params/gridCellParams'; -import { gridRowsDataRowIdToIdLookupSelector } from '../rows/gridRowsSelector'; +import { gridRowsLookupSelector } from '../rows/gridRowsSelector'; import { deepClone } from '../../../utils/utils'; import { GridRowEditStopParams, @@ -743,7 +743,7 @@ export const useGridRowEditing = ( // Run this effect synchronously so that the keyboard event can impact the yet-to-be-rendered input. useEnhancedEffect(() => { - const idToIdLookup = gridRowsDataRowIdToIdLookupSelector(apiRef); + const rowsLookup = gridRowsLookupSelector(apiRef); // Update the ref here because updateStateToStopRowEditMode may change it later const copyOfPrevRowModesModel = prevRowModesModel.current; @@ -753,7 +753,7 @@ export const useGridRowEditing = ( Array.from(ids).forEach((id) => { const params = rowModesModel[id] ?? { mode: GridRowModes.View }; const prevMode = copyOfPrevRowModesModel[id]?.mode || GridRowModes.View; - const originalId = idToIdLookup[id] ?? id; + const originalId = apiRef.current.getRowId(rowsLookup[id]) ?? id; if (params.mode === GridRowModes.Edit && prevMode === GridRowModes.View) { updateStateToStartRowEditMode({ id: originalId, ...params }); } else if (params.mode === GridRowModes.View && prevMode === GridRowModes.Edit) { diff --git a/packages/x-data-grid/src/hooks/features/index.ts b/packages/x-data-grid/src/hooks/features/index.ts index 4bebafde94ae8..8660d879545fc 100644 --- a/packages/x-data-grid/src/hooks/features/index.ts +++ b/packages/x-data-grid/src/hooks/features/index.ts @@ -7,6 +7,7 @@ export * from './density'; export * from './editing'; export * from './filter'; export * from './focus'; +export * from './listView'; export * from './pagination'; export * from './preferencesPanel'; export * from './rows'; diff --git a/packages/x-data-grid/src/hooks/features/listView/gridListViewSelectors.ts b/packages/x-data-grid/src/hooks/features/listView/gridListViewSelectors.ts index a5e69fc079bb7..e4b9a591fea5f 100644 --- a/packages/x-data-grid/src/hooks/features/listView/gridListViewSelectors.ts +++ b/packages/x-data-grid/src/hooks/features/listView/gridListViewSelectors.ts @@ -1,6 +1,8 @@ import { GridStateCommunity } from '../../../models/gridStateCommunity'; /** - * Get a list column definition + * Get the list column definition + * @category List View + * @ignore - Do not document */ export const gridListColumnSelector = (state: GridStateCommunity) => state.listViewColumn; diff --git a/packages/x-data-grid/src/hooks/features/listView/index.ts b/packages/x-data-grid/src/hooks/features/listView/index.ts new file mode 100644 index 0000000000000..e96a08afb4afd --- /dev/null +++ b/packages/x-data-grid/src/hooks/features/listView/index.ts @@ -0,0 +1 @@ +export * from './gridListViewSelectors'; diff --git a/packages/x-data-grid/src/hooks/features/rowSelection/utils.ts b/packages/x-data-grid/src/hooks/features/rowSelection/utils.ts index 6084acb11686b..99aa33d01b89e 100644 --- a/packages/x-data-grid/src/hooks/features/rowSelection/utils.ts +++ b/packages/x-data-grid/src/hooks/features/rowSelection/utils.ts @@ -14,8 +14,8 @@ import type { import type { GridRowSelectionPropagation } from '../../../models/gridRowSelectionModel'; export const ROW_SELECTION_PROPAGATION_DEFAULT: GridRowSelectionPropagation = { - parents: false, - descendants: false, + parents: true, + descendants: true, }; function getGridRowGroupSelectableDescendants( diff --git a/packages/x-data-grid/src/hooks/features/rows/gridRowsInterfaces.ts b/packages/x-data-grid/src/hooks/features/rows/gridRowsInterfaces.ts index fc999812ee922..e1a90de774c29 100644 --- a/packages/x-data-grid/src/hooks/features/rows/gridRowsInterfaces.ts +++ b/packages/x-data-grid/src/hooks/features/rows/gridRowsInterfaces.ts @@ -24,10 +24,6 @@ export interface GridRowsInternalCache { * Lookup containing the latest model at all time (even those not stored in the state yet). */ dataRowIdToModelLookup: GridRowIdToModelLookup; - /** - * Lookup containing the latest ids at all time (even those not stored in the state yet). - */ - dataRowIdToIdLookup: GridRowIdToIdLookup; /** * List of updates (partial or full) applied since the last time the state was synced with the cache. * It is used to build the tree. @@ -66,7 +62,6 @@ export interface GridRowsState { */ totalTopLevelRowCount: number; dataRowIdToModelLookup: GridRowIdToModelLookup; - dataRowIdToIdLookup: GridRowIdToIdLookup; additionalRowGroups?: { pinnedRows?: GridPinnedRowsState; }; @@ -82,7 +77,6 @@ export interface GridRowTreeCreationParams { previousTree: GridRowTreeConfig | null; previousTreeDepths: GridTreeDepths | null; updates: GridRowsPartialUpdates | GridRowsFullUpdate; - dataRowIdToIdLookup: GridRowIdToIdLookup; dataRowIdToModelLookup: GridRowIdToModelLookup; previousGroupsToFetch?: GridRowId[]; } @@ -107,12 +101,7 @@ export type GridRowTreeCreationValue = Pick< export type GridHydrateRowsValue = Pick< GridRowsState, - | 'tree' - | 'treeDepths' - | 'dataRowIds' - | 'dataRowIdToIdLookup' - | 'dataRowIdToModelLookup' - | 'additionalRowGroups' + 'tree' | 'treeDepths' | 'dataRowIds' | 'dataRowIdToModelLookup' | 'additionalRowGroups' >; export type GridRowsPartialUpdateAction = 'insert' | 'modify' | 'remove'; @@ -122,8 +111,6 @@ export type GridRowIdToModelLookup; -export type GridRowIdToIdLookup = Record; - export type GridTreeDepths = { [depth: number]: number }; export interface GridRowsFullUpdate { diff --git a/packages/x-data-grid/src/hooks/features/rows/gridRowsSelector.ts b/packages/x-data-grid/src/hooks/features/rows/gridRowsSelector.ts index c0f3614d0ad37..fbf1f413e50b3 100644 --- a/packages/x-data-grid/src/hooks/features/rows/gridRowsSelector.ts +++ b/packages/x-data-grid/src/hooks/features/rows/gridRowsSelector.ts @@ -24,11 +24,6 @@ export const gridRowsLookupSelector = createSelector( (rows) => rows.dataRowIdToModelLookup, ); -export const gridRowsDataRowIdToIdLookupSelector = createSelector( - gridRowsStateSelector, - (rows) => rows.dataRowIdToIdLookup, -); - export const gridRowTreeSelector = createSelector(gridRowsStateSelector, (rows) => rows.tree); export const gridRowGroupsToFetchSelector = createSelector( diff --git a/packages/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts b/packages/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts index 86be1ee376470..a56b68bddcdba 100644 --- a/packages/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts +++ b/packages/x-data-grid/src/hooks/features/rows/gridRowsUtils.ts @@ -21,7 +21,6 @@ import { GridRowsState, GridRowTreeCreationParams, GridRowIdToModelLookup, - GridRowIdToIdLookup, GridRowsPartialUpdateAction, } from './gridRowsInterfaces'; import { gridPinnedRowsSelector } from './gridRowsSelector'; @@ -90,13 +89,11 @@ export const createRowsInternalCache = ({ }; const dataRowIdToModelLookup: GridRowIdToModelLookup = {}; - const dataRowIdToIdLookup: GridRowIdToIdLookup = {}; for (let i = 0; i < rows.length; i += 1) { const model = rows[i]; const id = getRowIdFromRowModel(model, getRowId); dataRowIdToModelLookup[id] = model; - dataRowIdToIdLookup[id] = id; updates.rows.push(id); } @@ -105,7 +102,6 @@ export const createRowsInternalCache = ({ loadingPropBeforePartialUpdates: loading, rowCountPropBeforePartialUpdates: rowCount, updates, - dataRowIdToIdLookup, dataRowIdToModelLookup, }; }; @@ -153,7 +149,6 @@ export const getRowsStateFromCache = ({ previousTree, previousTreeDepths, updates: cache.updates, - dataRowIdToIdLookup: cache.dataRowIdToIdLookup, dataRowIdToModelLookup: cache.dataRowIdToModelLookup, previousGroupsToFetch, }); @@ -162,7 +157,6 @@ export const getRowsStateFromCache = ({ const groupingParamsWithHydrateRows = apiRef.current.unstable_applyPipeProcessors('hydrateRows', { tree: unProcessedTree, treeDepths: unProcessedTreeDepths, - dataRowIdToIdLookup: cache.dataRowIdToIdLookup, dataRowIds: unProcessedDataRowIds, dataRowIdToModelLookup: cache.dataRowIdToModelLookup, }); @@ -280,7 +274,6 @@ export const updateCacheWithNewRows = ({ groupKeys, }; const dataRowIdToModelLookup = { ...previousCache.dataRowIdToModelLookup }; - const dataRowIdToIdLookup = { ...previousCache.dataRowIdToIdLookup }; const alreadyAppliedActionsToRemove: Record< GridRowsPartialUpdateAction, @@ -313,7 +306,6 @@ export const updateCacheWithNewRows = ({ // Remove the data row from the lookups and add it to the "delete" update. partialUpdates.actions.remove.push(id); delete dataRowIdToModelLookup[id]; - delete dataRowIdToIdLookup[id]; return; } @@ -354,7 +346,6 @@ export const updateCacheWithNewRows = ({ // Update the data row lookups. dataRowIdToModelLookup[id] = partialRow; - dataRowIdToIdLookup[id] = id; }); const actionTypeWithActionsToRemove = Object.keys( @@ -372,7 +363,6 @@ export const updateCacheWithNewRows = ({ return { dataRowIdToModelLookup, - dataRowIdToIdLookup, updates: partialUpdates, rowsBeforePartialUpdates: previousCache.rowsBeforePartialUpdates, loadingPropBeforePartialUpdates: previousCache.loadingPropBeforePartialUpdates, diff --git a/packages/x-data-grid/src/hooks/features/rows/index.ts b/packages/x-data-grid/src/hooks/features/rows/index.ts index c946d462137ca..81b512217493d 100644 --- a/packages/x-data-grid/src/hooks/features/rows/index.ts +++ b/packages/x-data-grid/src/hooks/features/rows/index.ts @@ -5,7 +5,6 @@ export { gridRowsLoadingSelector, gridTopLevelRowCountSelector, gridRowsLookupSelector, - gridRowsDataRowIdToIdLookupSelector, gridRowTreeSelector, gridRowGroupingNameSelector, gridRowTreeDepthsSelector, diff --git a/packages/x-data-grid/src/hooks/features/rows/useGridRowSpanning.ts b/packages/x-data-grid/src/hooks/features/rows/useGridRowSpanning.ts index ef9dafab23218..1c29902b6e791 100644 --- a/packages/x-data-grid/src/hooks/features/rows/useGridRowSpanning.ts +++ b/packages/x-data-grid/src/hooks/features/rows/useGridRowSpanning.ts @@ -164,7 +164,7 @@ const computeRowSpanningState = ( * @requires filterStateInitializer (method) - should be initialized before */ export const rowSpanningStateInitializer: GridStateInitializer = (state, props, apiRef) => { - if (props.unstable_rowSpanning) { + if (props.rowSpanning) { const rowIds = state.rows!.dataRowIds || []; const orderedFields = state.columns!.orderedFields || []; const dataRowIdToModelLookup = state.rows!.dataRowIdToModelLookup; @@ -221,7 +221,7 @@ export const rowSpanningStateInitializer: GridStateInitializer = (state, props, export const useGridRowSpanning = ( apiRef: React.MutableRefObject, - props: Pick, + props: Pick, ): void => { const { range, rows: visibleRows } = useGridVisibleRows(apiRef, props); const renderContext = useGridSelector(apiRef, gridRenderContextSelector); @@ -247,7 +247,7 @@ export const useGridRowSpanning = ( // - The `paginationModel` is updated // - The rows are updated (resetState: boolean = true) => { - if (!props.unstable_rowSpanning) { + if (!props.rowSpanning) { if (apiRef.current.state.rowSpanning !== EMPTY_STATE) { apiRef.current.setState((state) => ({ ...state, rowSpanning: EMPTY_STATE })); } @@ -320,15 +320,7 @@ export const useGridRowSpanning = ( }; }); }, - [ - apiRef, - props.unstable_rowSpanning, - range, - renderContext, - visibleRows, - colDefs, - processedRange, - ], + [apiRef, props.rowSpanning, range, renderContext, visibleRows, colDefs, processedRange], ); const prevRenderContext = React.useRef(renderContext); diff --git a/packages/x-data-grid/src/hooks/features/rows/useGridRows.ts b/packages/x-data-grid/src/hooks/features/rows/useGridRows.ts index bd89c281f7292..dffb31dbf0069 100644 --- a/packages/x-data-grid/src/hooks/features/rows/useGridRows.ts +++ b/packages/x-data-grid/src/hooks/features/rows/useGridRows.ts @@ -14,7 +14,6 @@ import { gridRowGroupingNameSelector, gridRowTreeDepthsSelector, gridDataRowIdsSelector, - gridRowsDataRowIdToIdLookupSelector, gridRowMaximumTreeDepthSelector, gridRowGroupsToFetchSelector, } from './gridRowsSelector'; @@ -38,6 +37,7 @@ import { computeRowsUpdates, } from './gridRowsUtils'; import { useGridRegisterPipeApplier } from '../../core/pipeProcessing'; +import { GridStrategyGroup } from '../../core/strategyProcessing'; export const rowsStateInitializer: GridStateInitializer< Pick @@ -417,7 +417,6 @@ export const useGridRows = ( const tree = { ...gridRowTreeSelector(apiRef) }; const dataRowIdToModelLookup = { ...gridRowsLookupSelector(apiRef) }; - const dataRowIdToIdLookup = { ...gridRowsDataRowIdToIdLookupSelector(apiRef) }; const rootGroup = tree[GRID_ROOT_GROUP_ID] as GridGroupNode; const rootGroupChildren = [...rootGroup.children]; const seenIds = new Set(); @@ -434,7 +433,6 @@ export const useGridRows = ( if (!seenIds.has(removedRowId)) { delete dataRowIdToModelLookup[removedRowId]; - delete dataRowIdToIdLookup[removedRowId]; delete tree[removedRowId]; } @@ -446,7 +444,6 @@ export const useGridRows = ( groupingKey: null, }; dataRowIdToModelLookup[rowId] = rowModel; - dataRowIdToIdLookup[rowId] = rowId; tree[rowId] = rowTreeNodeConfig; seenIds.add(rowId); @@ -458,21 +455,21 @@ export const useGridRows = ( const dataRowIds = rootGroupChildren.filter((childId) => tree[childId]?.type === 'leaf'); apiRef.current.caches.rows.dataRowIdToModelLookup = dataRowIdToModelLookup; - apiRef.current.caches.rows.dataRowIdToIdLookup = dataRowIdToIdLookup; apiRef.current.setState((state) => ({ ...state, rows: { ...state.rows, + loading: props.loading, + totalRowCount: Math.max(props.rowCount || 0, rootGroupChildren.length), dataRowIdToModelLookup, - dataRowIdToIdLookup, dataRowIds, tree, }, })); apiRef.current.publishEvent('rowsSet'); }, - [apiRef, props.signature, props.getRowId], + [apiRef, props.signature, props.getRowId, props.loading, props.rowCount], ); const rowApi: GridRowApi = { @@ -559,7 +556,10 @@ export const useGridRows = ( >(() => { // `rowTreeCreation` is the only processor ran when `strategyAvailabilityChange` is fired. // All the other processors listen to `rowsSet` which will be published by the `groupRows` method below. - if (apiRef.current.getActiveStrategy('rowTree') !== gridRowGroupingNameSelector(apiRef)) { + if ( + apiRef.current.getActiveStrategy(GridStrategyGroup.RowTree) !== + gridRowGroupingNameSelector(apiRef) + ) { groupRows(); } }, [apiRef, groupRows]); @@ -577,7 +577,6 @@ export const useGridRows = ( treeDepths: gridRowTreeDepthsSelector(state, apiRef.current.instanceId), dataRowIds: gridDataRowIdsSelector(state, apiRef.current.instanceId), dataRowIdToModelLookup: gridRowsLookupSelector(state, apiRef.current.instanceId), - dataRowIdToIdLookup: gridRowsDataRowIdToIdLookupSelector(state, apiRef.current.instanceId), }); return { @@ -621,8 +620,11 @@ export const useGridRows = ( lastRowCount.current = props.rowCount; } + const currentRows = props.unstable_dataSource + ? Array.from(apiRef.current.getRowModels().values()) + : props.rows; const areNewRowsAlreadyInState = - apiRef.current.caches.rows.rowsBeforePartialUpdates === props.rows; + apiRef.current.caches.rows.rowsBeforePartialUpdates === currentRows; const isNewLoadingAlreadyInState = apiRef.current.caches.rows.loadingPropBeforePartialUpdates === props.loading; const isNewRowCountAlreadyInState = @@ -657,10 +659,10 @@ export const useGridRows = ( } } - logger.debug(`Updating all rows, new length ${props.rows?.length}`); + logger.debug(`Updating all rows, new length ${currentRows?.length}`); throttledRowsChange({ cache: createRowsInternalCache({ - rows: props.rows, + rows: currentRows, getRowId: props.getRowId, loading: props.loading, rowCount: props.rowCount, @@ -672,6 +674,7 @@ export const useGridRows = ( props.rowCount, props.getRowId, props.loading, + props.unstable_dataSource, logger, throttledRowsChange, apiRef, diff --git a/packages/x-data-grid/src/hooks/features/rows/useGridRowsMeta.ts b/packages/x-data-grid/src/hooks/features/rows/useGridRowsMeta.ts index 501b8690a7102..ac882db677273 100644 --- a/packages/x-data-grid/src/hooks/features/rows/useGridRowsMeta.ts +++ b/packages/x-data-grid/src/hooks/features/rows/useGridRowsMeta.ts @@ -50,7 +50,6 @@ export const useGridRowsMeta = ( | 'pagination' | 'paginationMode' | 'rowHeight' - | 'rowPositionsDebounceMs' >, ): void => { const { getRowHeight: getRowHeightProp, getRowSpacing, getEstimatedRowHeight } = props; diff --git a/packages/x-data-grid/src/hooks/features/sorting/gridSortingSelector.ts b/packages/x-data-grid/src/hooks/features/sorting/gridSortingSelector.ts index 70c9993cac463..1022a5ee6f2c7 100644 --- a/packages/x-data-grid/src/hooks/features/sorting/gridSortingSelector.ts +++ b/packages/x-data-grid/src/hooks/features/sorting/gridSortingSelector.ts @@ -3,7 +3,7 @@ import { GridSortDirection, GridSortModel } from '../../../models/gridSortModel' import { gridRowTreeSelector, gridRowsLookupSelector } from '../rows/gridRowsSelector'; import { GRID_ID_AUTOGENERATED, isAutogeneratedRowNode } from '../rows/gridRowsUtils'; import type { GridStateCommunity } from '../../../models/gridStateCommunity'; -import type { GridValidRowModel, GridRowEntry } from '../../../models/gridRows'; +import type { GridValidRowModel, GridRowEntry, GridRowId } from '../../../models/gridRows'; /** * @category Sorting @@ -73,3 +73,17 @@ export const gridSortColumnLookupSelector = createSelectorMemoized( return result; }, ); + +/** + * @category Sorting + * @ignore - do not document. + */ +export const gridSortedRowIndexLookupSelector = createSelectorMemoized( + gridSortedRowIdsSelector, + (sortedIds) => { + return sortedIds.reduce>((acc, id, index) => { + acc[id] = index; + return acc; + }, Object.create(null)); + }, +); diff --git a/packages/x-data-grid/src/hooks/features/sorting/index.ts b/packages/x-data-grid/src/hooks/features/sorting/index.ts index 4a13963b493aa..8b879c541b031 100644 --- a/packages/x-data-grid/src/hooks/features/sorting/index.ts +++ b/packages/x-data-grid/src/hooks/features/sorting/index.ts @@ -1,4 +1,10 @@ -export * from './gridSortingSelector'; +export { + gridSortedRowIdsSelector, + gridSortedRowEntriesSelector, + gridSortModelSelector, + gridSortColumnLookupSelector, +} from './gridSortingSelector'; +export type { GridSortColumnLookup } from './gridSortingSelector'; export type { GridSortingState, GridSortingInitialState } from './gridSortingState'; export { gridDateComparator, 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 679b05f8bbbbb..1502dfbf4ec61 100644 --- a/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx +++ b/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx @@ -92,7 +92,7 @@ type ScrollCache = ReturnType; let isJSDOM = false; try { if (typeof window !== 'undefined') { - isJSDOM = /jsdom/.test(window.navigator.userAgent); + isJSDOM = /jsdom|HappyDOM/.test(window.navigator.userAgent); } } catch (_) { /* ignore */ @@ -267,9 +267,14 @@ export const useGridVirtualScroller = () => { ); const triggerUpdateRenderContext = useEventCallback(() => { + const scroller = scrollerRef.current; + if (!scroller) { + return undefined; + } + const newScroll = { - top: scrollerRef.current!.scrollTop, - left: scrollerRef.current!.scrollLeft, + top: scroller.scrollTop, + left: scroller.scrollLeft, }; const dx = newScroll.left - scrollPosition.current.left; diff --git a/packages/x-data-grid/src/internals/index.ts b/packages/x-data-grid/src/internals/index.ts index f12ed42b1a35c..d2feea4b7c287 100644 --- a/packages/x-data-grid/src/internals/index.ts +++ b/packages/x-data-grid/src/internals/index.ts @@ -17,6 +17,7 @@ export { getValueOptions } from '../components/panel/filterPanel/filterPanelUtil export { useGridRegisterPipeProcessor } from '../hooks/core/pipeProcessing'; export type { GridPipeProcessor } from '../hooks/core/pipeProcessing'; export { + GridStrategyGroup, useGridRegisterStrategyProcessor, GRID_DEFAULT_STRATEGY, } from '../hooks/core/strategyProcessing'; @@ -117,6 +118,7 @@ export { export { useGridRowSelectionPreProcessors } from '../hooks/features/rowSelection/useGridRowSelectionPreProcessors'; export { useGridSorting, sortingStateInitializer } from '../hooks/features/sorting/useGridSorting'; export type { GridSortingModelApplier } from '../hooks/features/sorting/gridSortingState'; +export { gridSortedRowIndexLookupSelector } from '../hooks/features/sorting/gridSortingSelector'; export { useGridScroll } from '../hooks/features/scroll/useGridScroll'; export { useGridEvents } from '../hooks/features/events/useGridEvents'; export { diff --git a/packages/x-data-grid/src/locales/deDE.ts b/packages/x-data-grid/src/locales/deDE.ts index 64e680eb5428b..26162e1b4146a 100644 --- a/packages/x-data-grid/src/locales/deDE.ts +++ b/packages/x-data-grid/src/locales/deDE.ts @@ -32,15 +32,16 @@ const deDEGrid: Partial = { toolbarQuickFilterDeleteIconLabel: 'Löschen', // Prompt toolbar field - // toolbarPromptControlPlaceholder: 'Type a prompt…', - // toolbarPromptControlWithRecordingPlaceholder: 'Type or record a prompt…', - // toolbarPromptControlRecordingPlaceholder: 'Listening for prompt…', - // toolbarPromptControlLabel: 'Prompt input', - // toolbarPromptControlRecordButtonDefaultLabel: 'Record', - // toolbarPromptControlRecordButtonActiveLabel: 'Stop recording', - // toolbarPromptControlSendActionLabel: 'Send', - // toolbarPromptControlSendActionAriaLabel: 'Send prompt', - // toolbarPromptControlErrorMessage: 'An error occurred while processing the request. Please try again with a different prompt.', + toolbarPromptControlPlaceholder: 'Prompt eingeben…', + toolbarPromptControlWithRecordingPlaceholder: 'Prompt eingeben oder aufnehmen…', + toolbarPromptControlRecordingPlaceholder: 'Hört Prompteingabe zu…', + toolbarPromptControlLabel: 'Prompteingabe', + toolbarPromptControlRecordButtonDefaultLabel: 'Aufnahme starten', + toolbarPromptControlRecordButtonActiveLabel: 'Aufnahme stoppen', + toolbarPromptControlSendActionLabel: 'Senden', + toolbarPromptControlSendActionAriaLabel: 'Prompt senden', + toolbarPromptControlErrorMessage: + 'Ein Fehler ist während der Bearbeitung der Anfrage aufgetreten. Bitte versuche es nochmal mit einem anderen Prompt.', // Export selector toolbar button text toolbarExport: 'Exportieren', @@ -54,7 +55,7 @@ const deDEGrid: Partial = { columnsManagementNoColumns: 'Keine Spalten', columnsManagementShowHideAllText: 'Alle anzeigen/verbergen', columnsManagementReset: 'Zurücksetzen', - // columnsManagementDeleteIconLabel: 'Clear', + columnsManagementDeleteIconLabel: 'Löschen', // Filter panel text filterPanelAddFilter: 'Filter hinzufügen', diff --git a/packages/x-data-grid/src/locales/heIL.ts b/packages/x-data-grid/src/locales/heIL.ts index 9385edd8fd399..becf3c591944f 100644 --- a/packages/x-data-grid/src/locales/heIL.ts +++ b/packages/x-data-grid/src/locales/heIL.ts @@ -32,15 +32,15 @@ const heILGrid: Partial = { toolbarQuickFilterDeleteIconLabel: 'ניקוי', // Prompt toolbar field - // toolbarPromptControlPlaceholder: 'Type a prompt…', - // toolbarPromptControlWithRecordingPlaceholder: 'Type or record a prompt…', - // toolbarPromptControlRecordingPlaceholder: 'Listening for prompt…', - // toolbarPromptControlLabel: 'Prompt input', - // toolbarPromptControlRecordButtonDefaultLabel: 'Record', - // toolbarPromptControlRecordButtonActiveLabel: 'Stop recording', - // toolbarPromptControlSendActionLabel: 'Send', - // toolbarPromptControlSendActionAriaLabel: 'Send prompt', - // toolbarPromptControlErrorMessage: 'An error occurred while processing the request. Please try again with a different prompt.', + toolbarPromptControlPlaceholder: 'הקלד ערך…', + toolbarPromptControlWithRecordingPlaceholder: 'הקלד או הקלט ערך…', + toolbarPromptControlRecordingPlaceholder: 'ממתין להנחיה…', + toolbarPromptControlLabel: 'הזן ערך', + toolbarPromptControlRecordButtonDefaultLabel: 'הקלטה', + toolbarPromptControlRecordButtonActiveLabel: 'הפסק הקלטה', + toolbarPromptControlSendActionLabel: 'שלח', + toolbarPromptControlSendActionAriaLabel: 'שלח ערך', + toolbarPromptControlErrorMessage: 'התרחשה שגיאה בזמן העיבוד של הבקשה. נסה שוב עם ערך אחר בבקשה.', // Export selector toolbar button text toolbarExport: 'ייצוא', @@ -54,7 +54,7 @@ const heILGrid: Partial = { columnsManagementNoColumns: 'אין עמודות', columnsManagementShowHideAllText: 'הצג/הסתר הכל', columnsManagementReset: 'אתחול', - // columnsManagementDeleteIconLabel: 'Clear', + columnsManagementDeleteIconLabel: 'נקה', // Filter panel text filterPanelAddFilter: 'הוסף מסנן', @@ -70,9 +70,9 @@ const heILGrid: Partial = { // Filter operators text filterOperatorContains: 'מכיל', - // filterOperatorDoesNotContain: 'does not contain', + filterOperatorDoesNotContain: 'לא מכיל', filterOperatorEquals: 'שווה', - // filterOperatorDoesNotEqual: 'does not equal', + filterOperatorDoesNotEqual: 'לא שווה', filterOperatorStartsWith: 'מתחיל ב-', filterOperatorEndsWith: 'נגמר ב-', filterOperatorIs: 'הינו', @@ -93,9 +93,9 @@ const heILGrid: Partial = { // Header filter operators text headerFilterOperatorContains: 'מכיל', - // headerFilterOperatorDoesNotContain: 'Does not contain', + headerFilterOperatorDoesNotContain: 'לא מכיל', headerFilterOperatorEquals: 'שווה', - // headerFilterOperatorDoesNotEqual: 'Does not equal', + headerFilterOperatorDoesNotEqual: 'לא שווה', headerFilterOperatorStartsWith: 'מתחיל ב-', headerFilterOperatorEndsWith: 'נגמר ב-', headerFilterOperatorIs: 'הינו', diff --git a/packages/x-data-grid/src/locales/roRO.ts b/packages/x-data-grid/src/locales/roRO.ts index 778b94e1b1725..c7949fe83a726 100644 --- a/packages/x-data-grid/src/locales/roRO.ts +++ b/packages/x-data-grid/src/locales/roRO.ts @@ -32,15 +32,16 @@ const roROGrid: Partial = { toolbarQuickFilterDeleteIconLabel: 'Ștergere', // Prompt toolbar field - // toolbarPromptControlPlaceholder: 'Type a prompt…', - // toolbarPromptControlWithRecordingPlaceholder: 'Type or record a prompt…', - // toolbarPromptControlRecordingPlaceholder: 'Listening for prompt…', - // toolbarPromptControlLabel: 'Prompt input', - // toolbarPromptControlRecordButtonDefaultLabel: 'Record', - // toolbarPromptControlRecordButtonActiveLabel: 'Stop recording', - // toolbarPromptControlSendActionLabel: 'Send', - // toolbarPromptControlSendActionAriaLabel: 'Send prompt', - // toolbarPromptControlErrorMessage: 'An error occurred while processing the request. Please try again with a different prompt.', + toolbarPromptControlPlaceholder: 'Scrie un prompt…', + toolbarPromptControlWithRecordingPlaceholder: 'Scrie sau înregistrează un prompt…', + toolbarPromptControlRecordingPlaceholder: 'Ascultare prompt…', + toolbarPromptControlLabel: 'Introducere prompt', + toolbarPromptControlRecordButtonDefaultLabel: 'Înregistrează', + toolbarPromptControlRecordButtonActiveLabel: 'Oprește înregistrare', + toolbarPromptControlSendActionLabel: 'Trimite', + toolbarPromptControlSendActionAriaLabel: 'Trimite prompt', + toolbarPromptControlErrorMessage: + 'A apărut o eroare la procesare. Încercați din nou cu un alt prompt.', // Export selector toolbar button text toolbarExport: 'Export', @@ -50,11 +51,11 @@ const roROGrid: Partial = { toolbarExportExcel: 'Download în format Excel', // Columns management text - // columnsManagementSearchTitle: 'Search', - // columnsManagementNoColumns: 'No columns', - // columnsManagementShowHideAllText: 'Show/Hide All', - // columnsManagementReset: 'Reset', - // columnsManagementDeleteIconLabel: 'Clear', + columnsManagementSearchTitle: 'Caută', + columnsManagementNoColumns: 'Nicio coloană', + columnsManagementShowHideAllText: 'Arată/Ascunde tot', + columnsManagementReset: 'Resetează', + columnsManagementDeleteIconLabel: 'Șterge', // Filter panel text filterPanelAddFilter: 'Adăugare filtru', @@ -70,9 +71,9 @@ const roROGrid: Partial = { // Filter operators text filterOperatorContains: 'conține', - // filterOperatorDoesNotContain: 'does not contain', + filterOperatorDoesNotContain: 'nu conține', filterOperatorEquals: 'este egal cu', - // filterOperatorDoesNotEqual: 'does not equal', + filterOperatorDoesNotEqual: 'nu este egal cu', filterOperatorStartsWith: 'începe cu', filterOperatorEndsWith: 'se termină cu', filterOperatorIs: 'este', @@ -93,9 +94,9 @@ const roROGrid: Partial = { // Header filter operators text headerFilterOperatorContains: 'Conține', - // headerFilterOperatorDoesNotContain: 'Does not contain', + headerFilterOperatorDoesNotContain: 'Nu conține', headerFilterOperatorEquals: 'Egal cu', - // headerFilterOperatorDoesNotEqual: 'Does not equal', + headerFilterOperatorDoesNotEqual: 'Nu este egal cu', headerFilterOperatorStartsWith: 'Începe cu', headerFilterOperatorEndsWith: 'Se termină cu', headerFilterOperatorIs: 'Este', diff --git a/packages/x-data-grid/src/locales/trTR.ts b/packages/x-data-grid/src/locales/trTR.ts index e3064ebdcc86d..cd0bb0dad56a6 100644 --- a/packages/x-data-grid/src/locales/trTR.ts +++ b/packages/x-data-grid/src/locales/trTR.ts @@ -31,15 +31,16 @@ const trTRGrid: Partial = { toolbarQuickFilterDeleteIconLabel: 'Temizle', // Prompt toolbar field - // toolbarPromptControlPlaceholder: 'Type a prompt…', - // toolbarPromptControlWithRecordingPlaceholder: 'Type or record a prompt…', - // toolbarPromptControlRecordingPlaceholder: 'Listening for prompt…', - // toolbarPromptControlLabel: 'Prompt input', - // toolbarPromptControlRecordButtonDefaultLabel: 'Record', - // toolbarPromptControlRecordButtonActiveLabel: 'Stop recording', - // toolbarPromptControlSendActionLabel: 'Send', - // toolbarPromptControlSendActionAriaLabel: 'Send prompt', - // toolbarPromptControlErrorMessage: 'An error occurred while processing the request. Please try again with a different prompt.', + toolbarPromptControlPlaceholder: 'Bir istem yazın…', + toolbarPromptControlWithRecordingPlaceholder: 'Bir istem yazın veya kaydedin…', + toolbarPromptControlRecordingPlaceholder: 'İstem dinleniyor…', + toolbarPromptControlLabel: 'İstem girişi', + toolbarPromptControlRecordButtonDefaultLabel: 'Kaydet', + toolbarPromptControlRecordButtonActiveLabel: 'Kaydı durdur', + toolbarPromptControlSendActionLabel: 'Gönder', + toolbarPromptControlSendActionAriaLabel: 'İstemi gönder', + toolbarPromptControlErrorMessage: + 'İstek işlenirken bir hata oluştu. Lütfen farklı bir istemle tekrar deneyin.', // Export selector toolbar button text toolbarExport: 'Dışa aktar', @@ -53,7 +54,7 @@ const trTRGrid: Partial = { columnsManagementNoColumns: 'Kolon yok', columnsManagementShowHideAllText: 'Hepsini Göster/Gizle', columnsManagementReset: 'Sıfırla', - // columnsManagementDeleteIconLabel: 'Clear', + columnsManagementDeleteIconLabel: 'Temizle', // Filter panel text filterPanelAddFilter: 'Filtre Ekle', @@ -69,9 +70,9 @@ const trTRGrid: Partial = { // Filter operators text filterOperatorContains: 'içerir', - // filterOperatorDoesNotContain: 'does not contain', + filterOperatorDoesNotContain: 'içermiyor', filterOperatorEquals: 'eşittir', - // filterOperatorDoesNotEqual: 'does not equal', + filterOperatorDoesNotEqual: 'eşit değil', filterOperatorStartsWith: 'ile başlar', filterOperatorEndsWith: 'ile biter', filterOperatorIs: 'eşittir', diff --git a/packages/x-data-grid/src/models/colDef/gridColDef.ts b/packages/x-data-grid/src/models/colDef/gridColDef.ts index 16630570eb28e..9d7c3950284c6 100644 --- a/packages/x-data-grid/src/models/colDef/gridColDef.ts +++ b/packages/x-data-grid/src/models/colDef/gridColDef.ts @@ -91,43 +91,43 @@ export type GridColSpanFn { /** - * The column identifier. It's used to map with [[GridRowModel]] values. + * The unique identifier of the column. Used to map with [[GridRowModel]] values. */ field: string; /** - * The title of the column rendered in the column header cell. + * The title displayed in the column header cell. */ headerName?: string; /** - * The description of the column rendered as tooltip if the column header name is not fully displayed. + * The tooltip text shown when the column header name is truncated. */ description?: string; /** - * Set the width of the column. + * The width of the column in pixels. * @default 100 */ width?: number; /** - * If set, it indicates that a column has fluid width. Range [0, ∞). + * The flex grow factor of the column. Must be a positive number. */ flex?: number; /** - * Sets the minimum width of a column. + * The minimum width of the column in pixels. * @default 50 */ minWidth?: number; /** - * Sets the maximum width of a column. + * The maximum width of the column in pixels. * @default Infinity */ maxWidth?: number; /** - * If `false`, removes the buttons for hiding this column. + * If `false`, removes the option to hide this column. * @default true */ hideable?: boolean; /** - * If `true`, the column is sortable. + * If `false`, disables sorting for this column. * @default true */ sortable?: boolean; @@ -136,7 +136,7 @@ export interface GridBaseColDef; /** - * Allows to use a different comparator function depending on the sort direction. + * Provide an alternative comparator function for sorting. * Takes precedence over `sortComparator`. * @param {GridSortDirection} sortDirection The direction of the sort. * @returns {GridComparatorFn} The comparator function to use. @@ -177,25 +177,25 @@ export interface GridBaseColDef; /** - * Function that allows to provide a specific value to be used in row spanning. + * Function that returns a specific value to be used in row spanning. */ rowSpanValueGetter?: GridValueGetter; /** - * Function that allows to customize how the entered value is stored in the row. - * It only works with cell/row editing. + * Function that customizes how the entered value is stored in the row. + * Only works with cell/row editing. * @returns {R} The row with the updated field. */ valueSetter?: GridValueSetter; /** - * Function that allows to apply a formatter before rendering its value. + * Formats the cell value before rendering. */ valueFormatter?: GridValueFormatter; /** @@ -204,7 +204,7 @@ export interface GridBaseColDef; /** - * Class name that will be added in cells for that column. + * Class name added to cells in this column. */ cellClassName?: GridCellClassNamePropType; /** @@ -214,21 +214,21 @@ export interface GridBaseColDef} params Object containing parameters for the renderer. * @returns {React.ReactNode} The element to be rendered. */ renderCell?: (params: GridRenderCellParams) => React.ReactNode; /** - * Allows to override the component rendered in edit cell mode for this column. + * Override the component rendered in edit cell mode for this column. * @param {GridRenderEditCellParams} params Object containing parameters for the renderer. * @returns {React.ReactNode} The element to be rendered. */ renderEditCell?: (params: GridRenderEditCellParams) => React.ReactNode; /** * Callback fired when the edit props of the cell changes. - * It allows to process the props that saved into the state. + * Processes the props before being saved into the state. * @param {GridPreProcessEditCellProps} params Object containing parameters of the cell being edited. * @returns {GridEditCellProps | Promise} The new edit cell props. */ @@ -236,18 +236,18 @@ export interface GridBaseColDef GridEditCellProps | Promise; /** - * Class name that will be added in the column header cell. + * Class name added to the column header cell. */ headerClassName?: GridColumnHeaderClassNamePropType; /** - * Allows to render a component in the column header cell. + * Override the component rendered in the column header cell. * @template R, V, F * @param {GridColumnHeaderParams} params Object containing parameters for the renderer. * @returns {React.ReactNode} The element to be rendered. */ renderHeader?: (params: GridColumnHeaderParams) => React.ReactNode; /** - * Header cell element alignment. + * Align column header content. */ headerAlign?: GridAlignment; /** diff --git a/packages/x-data-grid/src/models/events/gridEventLookup.ts b/packages/x-data-grid/src/models/events/gridEventLookup.ts index b323518b8963b..fd6628cfc0716 100644 --- a/packages/x-data-grid/src/models/events/gridEventLookup.ts +++ b/packages/x-data-grid/src/models/events/gridEventLookup.ts @@ -389,6 +389,7 @@ export interface GridControlledStateReasonLookup { | 'restoreState' | 'removeAllFilterItems'; pagination: 'setPaginationModel' | 'stateRestorePreProcessing'; + rows: 'addSkeletonRows'; } export interface GridEventLookup diff --git a/packages/x-data-grid/src/models/gridDataSource.ts b/packages/x-data-grid/src/models/gridDataSource.ts index 2df17b84cf2dc..75197e0afd1f0 100644 --- a/packages/x-data-grid/src/models/gridDataSource.ts +++ b/packages/x-data-grid/src/models/gridDataSource.ts @@ -12,7 +12,7 @@ export interface GridGetRowsParams { /** * Alternate to `start` and `end`, maps to `GridPaginationModel` interface. */ - paginationModel: GridPaginationModel; + paginationModel?: GridPaginationModel; /** * First row index to fetch (number) or cursor information (number | string). */ @@ -20,7 +20,7 @@ export interface GridGetRowsParams { /** * Last row index to fetch. */ - end: number; // last row index to fetch + end: number; /** * List of grouped columns (only applicable with `rowGrouping`). */ diff --git a/packages/x-data-grid/src/models/props/DataGridProps.ts b/packages/x-data-grid/src/models/props/DataGridProps.ts index 2e2183ec8f2a0..e5ea2a80cf5ff 100644 --- a/packages/x-data-grid/src/models/props/DataGridProps.ts +++ b/packages/x-data-grid/src/models/props/DataGridProps.ts @@ -365,14 +365,6 @@ export interface DataGridPropsWithDefaultValues 'auto'`. * By default, column virtualization is disabled when dynamic row height is enabled to measure the row height correctly. @@ -855,7 +847,7 @@ export interface DataGridProSharedPropsWithDefaultValue { * - Deselecting a descendant of a selected parent deselects the parent automatically. * * Works with tree data and row grouping on the client-side only. - * @default { parents: false, descendants: false } + * @default { parents: true, descendants: true } */ rowSelectionPropagation: GridRowSelectionPropagation; /** diff --git a/packages/x-data-grid/src/tests/DataGrid.spec.tsx b/packages/x-data-grid/src/tests/DataGrid.spec.tsx index c82da0c7f74e6..5eff934863a06 100644 --- a/packages/x-data-grid/src/tests/DataGrid.spec.tsx +++ b/packages/x-data-grid/src/tests/DataGrid.spec.tsx @@ -60,11 +60,11 @@ function RowPropTest() { return (
{/* @ts-expect-error */} - rows={[{ firstName: 2 }]} columns={[]} />; + rows={[{ firstName: 2 }]} columns={[]} /> {/* @ts-expect-error */} - rows={[{}]} columns={[]} />; - rows={[{ firstName: 'John' }]} columns={[]} />; - ; + rows={[{}]} columns={[]} /> + rows={[{ firstName: 'John' }]} columns={[]} /> +
); } 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 6aff1383998ac..5e333fd3765bb 100644 --- a/packages/x-data-grid/src/tests/filtering.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/filtering.DataGrid.test.tsx @@ -1127,6 +1127,7 @@ describe(' - Filter', () => { expect(getRows({ operator: 'is', value: '' })).to.deep.equal(ALL_ROWS); expect(getRows({ operator: 'is', value: undefined })).to.deep.equal(ALL_ROWS); + expect(getRows({ operator: 'is', value: null })).to.deep.equal(ALL_ROWS); expect(getRows({ operator: 'is', value: 'test' })).to.deep.equal(ALL_ROWS); // Ignores invalid values }); }); 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 a83f17033416a..987b7c3c7a7b3 100644 --- a/packages/x-data-grid/src/tests/keyboard.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/keyboard.DataGrid.test.tsx @@ -38,7 +38,7 @@ const expectAriaCoordinate = ( }; describe(' - Keyboard', () => { - const { render } = createRenderer({ clock: 'fake' }); + const { render } = createRenderer(); function NavigationTestCaseNoScrollX( props: Omit< @@ -499,96 +499,100 @@ describe(' - Keyboard', () => { ); } - it('should scroll horizontally when navigating between column group headers with arrows', function test() { + it('should scroll horizontally when navigating between column group headers with arrows', async function test() { if (isJSDOM) { // Need layouting for column virtualization this.skip(); } - render( -
- + const { user } = render( +
+
, ); - act(() => getColumnHeaderCell(0, 0).focus()); + // Tab to the first column header + await user.keyboard('{Tab}'); const virtualScroller = document.querySelector('.MuiDataGrid-virtualScroller')!; expect(virtualScroller.scrollLeft).to.equal(0); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowRight' }); + // We then need to move up to the group header, then right to the first named column + await user.keyboard('{ArrowUp}{ArrowUp}{ArrowRight}'); expect(virtualScroller.scrollLeft).not.to.equal(0); }); - it('should scroll horizontally when navigating between column headers with arrows even if rows are empty', function test() { + it('should scroll horizontally when navigating between column headers with arrows even if rows are empty', async function test() { if (isJSDOM) { // Need layouting for column virtualization this.skip(); } - render( -
+ const { user } = render( +
, ); - act(() => getColumnHeaderCell(0, 0).focus()); + // Tab to the first column header + await user.keyboard('{Tab}'); const virtualScroller = document.querySelector('.MuiDataGrid-virtualScroller')!; expect(virtualScroller.scrollLeft).to.equal(0); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowRight' }); + // We then need to move up to the group header, then right to the first named column + await user.keyboard('{ArrowUp}{ArrowUp}{ArrowRight}'); expect(virtualScroller.scrollLeft).not.to.equal(0); expect(document.activeElement!).toHaveAccessibleName('prices'); }); - it('should move to the group header below when pressing "ArrowDown" on a column group header', () => { - render(); + it('should move to the group header below when pressing "ArrowDown" on a column group header', async () => { + const { user } = render(); - act(() => getColumnHeaderCell(2, 0).focus()); + // Tab to the first column header then move to the first group header on the third column + await user.keyboard('{Tab}{ArrowUp}{ArrowUp}{ArrowRight}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 3 }); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowDown' }); + // Move down to the group header below + await user.keyboard('{ArrowDown}'); expectAriaCoordinate(document.activeElement, { rowIndex: 2, colIndex: 3 }); }); - it('should go back to the same group header when pressing "ArrowUp" and "ArrowDown"', () => { - render(); + it('should go back to the same group header when pressing "ArrowUp" and "ArrowDown"', async () => { + const { user } = render(); - act(() => getColumnHeaderCell(3, 1).focus()); + // Tab to the first column header then move to the testing group header + await user.keyboard('{Tab}{ArrowUp}{ArrowRight}{ArrowRight}'); expectAriaCoordinate(document.activeElement, { rowIndex: 2, colIndex: 4 }); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowUp' }); + await user.keyboard('{ArrowUp}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 3 }); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowDown' }); + await user.keyboard('{ArrowDown}'); expectAriaCoordinate(document.activeElement, { rowIndex: 2, colIndex: 4 }); }); - it('should go to next group header when pressing "ArrowRight"', () => { - render(); + it('should go to next group header when pressing "ArrowRight"', async () => { + const { user } = render(); - act(() => getColumnHeaderCell(0, 0).focus()); + // Tab to the first column header then move to the testing group header + await user.keyboard('{Tab}{ArrowUp}{ArrowUp}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 1 }); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowRight' }); + await user.keyboard('{ArrowRight}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 3 }); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowRight' }); + await user.keyboard('{ArrowRight}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 7 }); }); - it('should go to previous group header when pressing "ArrowLeft"', () => { - render(); + it('should go to previous group header when pressing "ArrowLeft"', async () => { + const { user } = render(); - act(() => getColumnHeaderCell(6, 0).focus()); + // Tab to the first column header then move to the testing group header + await user.keyboard('{Tab}{ArrowUp}{ArrowUp}{ArrowRight}{ArrowRight}{ArrowRight}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 7 }); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowLeft' }); + await user.keyboard('{ArrowLeft}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 3 }); - fireEvent.keyDown(document.activeElement!, { key: 'ArrowLeft' }); + await user.keyboard('{ArrowLeft}'); expectAriaCoordinate(document.activeElement, { rowIndex: 1, colIndex: 1 }); }); 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 002a0d18ccad8..3bcd4f342042b 100644 --- a/packages/x-data-grid/src/tests/pagination.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/pagination.DataGrid.test.tsx @@ -613,7 +613,7 @@ describe(' - Pagination', () => { it('should support server side pagination with estimated row count', () => { const { setProps } = render(); expect(getColumnValues(0)).to.deep.equal(['0']); - expect(screen.getByText('1–1 of more than 2')).not.to.equal(null); + expect(screen.getByText('1–1 of around 2')).not.to.equal(null); fireEvent.click(screen.getByRole('button', { name: /next page/i })); expect(getColumnValues(0)).to.deep.equal(['1']); expect(screen.getByText('2–2 of more than 2')).not.to.equal(null); 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 62016200ac5fd..c9018d6db8e3c 100644 --- a/packages/x-data-grid/src/tests/rowSelection.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/rowSelection.DataGrid.test.tsx @@ -1,14 +1,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { - createRenderer, - fireEvent, - screen, - act, - waitFor, - flushMicrotasks, -} from '@mui/internal-test-utils'; +import { createRenderer, fireEvent, screen, act, waitFor } from '@mui/internal-test-utils'; import { DataGrid, DataGridProps, @@ -46,7 +39,7 @@ function getSelectedRowIds() { } describe(' - Row selection', () => { - const { render, clock } = createRenderer(); + const { render } = createRenderer(); const defaultData = getBasicGridData(4, 2); @@ -592,25 +585,26 @@ describe(' - Row selection', () => { expect(getSelectedRowIds()).to.deep.equal([]); }); - describe('ripple', () => { - clock.withFakeTimers(); - - it('should keep only one ripple visible when navigating between checkboxes', async function test() { - if (isJSDOM) { - // JSDOM doesn't fire "blur" when .focus is called in another element - // FIXME Firefox doesn't show any ripple - this.skip(); - } - render(); - const cell = getCell(1, 1); - fireUserEvent.mousePress(cell); - fireEvent.keyDown(cell, { key: 'ArrowLeft' }); - fireEvent.keyDown(getCell(1, 0).querySelector('input')!, { key: 'ArrowUp' }); - clock.runToLast(); // Wait for transition - await flushMicrotasks(); - expect(document.querySelectorAll('.MuiTouchRipple-rippleVisible')).to.have.length(1); - }); - }); + // Skip on everything as this is failing on all environments on ubuntu/CI + // describe('ripple', () => { + // clock.withFakeTimers(); + + // it('should keep only one ripple visible when navigating between checkboxes', async function test() { + // if (isJSDOM) { + // // JSDOM doesn't fire "blur" when .focus is called in another element + // // FIXME Firefox doesn't show any ripple + // this.skip(); + // } + // render(); + // const cell = getCell(1, 1); + // fireUserEvent.mousePress(cell); + // fireEvent.keyDown(cell, { key: 'ArrowLeft' }); + // fireEvent.keyDown(getCell(1, 0).querySelector('input')!, { key: 'ArrowUp' }); + // clock.runToLast(); // Wait for transition + // await flushMicrotasks(); + // expect(document.querySelectorAll('.MuiTouchRipple-rippleVisible')).to.have.length(1); + // }); + // }); }); describe('prop: isRowSelectable', () => { @@ -677,6 +671,17 @@ describe(' - Row selection', () => { ); }).not.toErrorDev(); }); + + it('should set the "Select all" checkbox to selected state on clicking even when some rows are not selectable', () => { + render( + Number(id) % 2 === 0} + />, + ); + fireEvent.click(getColumnHeaderCell(0).querySelector('input')!); + expect(getColumnHeaderCell(0).querySelector('input')).to.have.property('checked', true); + }); }); describe('prop: rows', () => { diff --git a/packages/x-data-grid/src/tests/rowSpanning.DataGrid.test.tsx b/packages/x-data-grid/src/tests/rowSpanning.DataGrid.test.tsx index c3875d9b3889f..ef0b006133d1c 100644 --- a/packages/x-data-grid/src/tests/rowSpanning.DataGrid.test.tsx +++ b/packages/x-data-grid/src/tests/rowSpanning.DataGrid.test.tsx @@ -11,7 +11,7 @@ describe(' - Row spanning', () => { let apiRef: React.MutableRefObject; const baselineProps: DataGridProps = { - unstable_rowSpanning: true, + rowSpanning: true, columns: [ { field: 'code', diff --git a/packages/x-date-pickers-pro/package.json b/packages/x-date-pickers-pro/package.json index 7ea584efa2297..28a2b17b1eea1 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": "8.0.0-alpha.1", + "version": "8.0.0-alpha.3", "description": "The Pro plan edition of the Date and Time Picker components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -96,11 +96,11 @@ } }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", - "@mui/material": "^5.16.7", - "@mui/system": "^5.16.7", + "@mui/internal-test-utils": "^1.0.22", + "@mui/material": "^5.16.9", + "@mui/system": "^5.16.8", "@types/luxon": "^3.4.2", - "@types/prop-types": "^15.7.13", + "@types/prop-types": "^15.7.14", "date-fns": "^2.30.0", "date-fns-jalali": "^2.30.0-0", "dayjs": "^1.11.13", diff --git a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.types.ts b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.types.ts index 8afa430155061..013359cc8f084 100644 --- a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.types.ts +++ b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePicker.types.ts @@ -9,7 +9,7 @@ import { MobileDateRangePickerSlots, MobileDateRangePickerSlotProps, } from '../MobileDateRangePicker'; -import { DateRangeValidationError, RangeFieldSection } from '../models'; +import { DateRangeValidationError } from '../models'; import { ValidateDateRangeProps } from '../validation'; export interface DateRangePickerSlots @@ -48,7 +48,6 @@ export type DateRangePickerFieldProps; diff --git a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx index 97fb5bf29d8a4..2ce9fb24f1d27 100644 --- a/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx +++ b/packages/x-date-pickers-pro/src/DateRangePicker/DateRangePickerToolbar.tsx @@ -12,6 +12,8 @@ import { BaseToolbarProps, ExportedBaseToolbarProps, PickerRangeValue, + PickerToolbarOwnerState, + useToolbarOwnerState, } from '@mui/x-date-pickers/internals'; import { usePickerTranslations } from '@mui/x-date-pickers/hooks'; import { UseRangePositionResponse } from '../internals/hooks/useRangePosition'; @@ -20,8 +22,7 @@ import { getDateRangePickerToolbarUtilityClass, } from './dateRangePickerToolbarClasses'; -const useUtilityClasses = (ownerState: DateRangePickerToolbarProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], container: ['container'], @@ -47,7 +48,7 @@ const DateRangePickerToolbarRoot = styled(PickersToolbar, { slot: 'Root', overridesResolver: (_, styles) => styles.root, })<{ - ownerState: DateRangePickerToolbarProps; + ownerState: PickerToolbarOwnerState; }>({}); const DateRangePickerToolbarContainer = styled('div', { @@ -85,6 +86,7 @@ const DateRangePickerToolbar = React.forwardRef(function DateRangePickerToolbar( onRangePositionChange, toolbarFormat, className, + classes: classesProp, onViewChange, view, views, @@ -92,6 +94,8 @@ const DateRangePickerToolbar = React.forwardRef(function DateRangePickerToolbar( } = props; const translations = usePickerTranslations(); + const ownerState = useToolbarOwnerState(); + const classes = useUtilityClasses(classesProp); const startDateValue = start ? utils.formatByString(start, toolbarFormat || utils.formats.shortDate) @@ -101,9 +105,6 @@ const DateRangePickerToolbar = React.forwardRef(function DateRangePickerToolbar( ? utils.formatByString(end, toolbarFormat || utils.formats.shortDate) : translations.end; - const ownerState = props; - const classes = useUtilityClasses(ownerState); - return ( = ValidateDateTimeRangeProps & BaseSingleInputFieldProps< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, DateTimeRangeValidationError >; diff --git a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx index a4139a783f6c6..e2c0511949eba 100644 --- a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx +++ b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerTabs.tsx @@ -11,7 +11,9 @@ import { BaseTabsProps, ExportedBaseTabsProps, isDatePickerView, + usePickerPrivateContext, } from '@mui/x-date-pickers/internals'; +import { PickerOwnerState } from '@mui/x-date-pickers/models'; import { usePickerTranslations } from '@mui/x-date-pickers/hooks'; import IconButton from '@mui/material/IconButton'; import Button from '@mui/material/Button'; @@ -67,8 +69,7 @@ export interface DateTimeRangePickerTabsProps BaseTabsProps, Pick {} -const useUtilityClasses = (ownerState: DateTimeRangePickerTabsProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], tabButton: ['tabButton'], @@ -83,7 +84,7 @@ const DateTimeRangePickerTabsRoot = styled('div', { name: 'MuiDateTimeRangePickerTabs', slot: 'Root', overridesResolver: (_, styles) => styles.root, -})<{ ownerState: DateTimeRangePickerTabsProps }>(({ theme }) => ({ +})<{ ownerState: PickerOwnerState }>(({ theme }) => ({ display: 'flex', justifyContent: 'space-between', alignItems: 'center', @@ -120,11 +121,13 @@ const DateTimeRangePickerTabs = function DateTimeRangePickerTabs( rangePosition, onRangePositionChange, className, + classes: classesProp, sx, } = props; const translations = usePickerTranslations(); - const classes = useUtilityClasses(props); + const { ownerState } = usePickerPrivateContext(); + const classes = useUtilityClasses(classesProp); const value = React.useMemo(() => viewToTab(view, rangePosition), [view, rangePosition]); const isPreviousHidden = value === 'start-date'; const isNextHidden = value === 'end-time'; @@ -175,7 +178,7 @@ const DateTimeRangePickerTabs = function DateTimeRangePickerTabs( return ( diff --git a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx index d551097dbfe1b..bc2dcc282966a 100644 --- a/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx +++ b/packages/x-date-pickers-pro/src/DateTimeRangePicker/DateTimeRangePickerToolbar.tsx @@ -9,15 +9,14 @@ import { ExportedBaseToolbarProps, useUtils, DateOrTimeViewWithMeridiem, - PickerVariant, PickerRangeValue, + useToolbarOwnerState, + PickerToolbarOwnerState, + DateTimePickerToolbarForceDesktopVariant, } from '@mui/x-date-pickers/internals'; import { usePickerContext, usePickerTranslations } from '@mui/x-date-pickers/hooks'; import { PickerValidDate } from '@mui/x-date-pickers/models'; -import { - DateTimePickerToolbarProps, - DateTimePickerToolbar, -} from '@mui/x-date-pickers/DateTimePicker'; +import { DateTimePickerToolbar } from '@mui/x-date-pickers/DateTimePicker'; import { UseRangePositionResponse } from '../internals/hooks/useRangePosition'; import { DateTimeRangePickerToolbarClasses, @@ -25,8 +24,7 @@ import { } from './dateTimeRangePickerToolbarClasses'; import { calculateRangeChange } from '../internals/utils/date-range-manager'; -const useUtilityClasses = (ownerState: DateTimeRangePickerToolbarProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], startToolbar: ['startToolbar'], @@ -43,7 +41,6 @@ export interface DateTimeRangePickerToolbarProps Pick, ExportedDateTimeRangePickerToolbarProps { ampm?: boolean; - toolbarVariant?: PickerVariant; } export interface ExportedDateTimeRangePickerToolbarProps extends ExportedBaseToolbarProps { @@ -58,58 +55,26 @@ const DateTimeRangePickerToolbarRoot = styled('div', { slot: 'Root', overridesResolver: (_, styles) => styles.root, })<{ - ownerState: DateTimeRangePickerToolbarProps; + ownerState: PickerToolbarOwnerState; }>({ display: 'flex', flexDirection: 'column', }); -type DateTimeRangePickerStartOrEndToolbarProps = DateTimePickerToolbarProps & { - ownerState?: DateTimeRangePickerToolbarProps; -}; - -type DateTimeRangePickerStartOrEndToolbarComponent = ( - props: DateTimeRangePickerStartOrEndToolbarProps, -) => React.JSX.Element; - const DateTimeRangePickerToolbarStart = styled(DateTimePickerToolbar, { name: 'MuiDateTimeRangePickerToolbar', slot: 'StartToolbar', overridesResolver: (_, styles) => styles.startToolbar, -})({ +})<{ ownerState?: PickerToolbarOwnerState }>({ borderBottom: 'none', - variants: [ - { - props: ({ toolbarVariant }: DateTimeRangePickerStartOrEndToolbarProps) => - toolbarVariant !== 'desktop', - style: { - padding: '12px 8px 0 12px', - }, - }, - { - props: { toolbarVariant: 'desktop' }, - style: { - paddingBottom: 0, - }, - }, - ], -}) as DateTimeRangePickerStartOrEndToolbarComponent; + paddingBottom: 0, +}); const DateTimeRangePickerToolbarEnd = styled(DateTimePickerToolbar, { name: 'MuiDateTimeRangePickerToolbar', slot: 'EndToolbar', overridesResolver: (_, styles) => styles.endToolbar, -})({ - variants: [ - { - props: ({ toolbarVariant }: DateTimeRangePickerStartOrEndToolbarProps) => - toolbarVariant !== 'desktop', - style: { - padding: '12px 8px 12px 12px', - }, - }, - ], -}) as DateTimeRangePickerStartOrEndToolbarComponent; +})<{ ownerState?: PickerToolbarOwnerState }>({}); type DateTimeRangePickerToolbarComponent = (( props: DateTimeRangePickerToolbarProps & React.RefAttributes, @@ -127,8 +92,8 @@ const DateTimeRangePickerToolbar = React.forwardRef(function DateTimeRangePicker rangePosition, onRangePositionChange, className, + classes: classesProp, onViewChange, - toolbarVariant, onChange, classes: inClasses, view, @@ -144,6 +109,9 @@ const DateTimeRangePickerToolbar = React.forwardRef(function DateTimeRangePicker } = props; const { disabled, readOnly } = usePickerContext(); + const translations = usePickerTranslations(); + const ownerState = useToolbarOwnerState(); + const classes = useUtilityClasses(classesProp); const commonToolbarProps = { isLandscape, @@ -156,11 +124,6 @@ const DateTimeRangePickerToolbar = React.forwardRef(function DateTimeRangePicker toolbarPlaceholder, }; - const translations = usePickerTranslations(); - - const ownerState = props; - const classes = useUtilityClasses(ownerState); - const handleStartRangeViewChange = React.useCallback( (newView: DateOrTimeViewWithMeridiem) => { if (newView === 'year' || newView === 'month') { @@ -214,30 +177,30 @@ const DateTimeRangePickerToolbar = React.forwardRef(function DateTimeRangePicker sx={sx} {...other} > - - + + + + ); }) as DateTimeRangePickerToolbarComponent; @@ -286,7 +249,6 @@ DateTimeRangePickerToolbar.propTypes = { * @default "––" */ toolbarPlaceholder: PropTypes.node, - toolbarVariant: PropTypes.oneOf(['desktop', 'mobile']), value: PropTypes.arrayOf(PropTypes.object).isRequired, /** * Currently visible picker view. 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 8fd06df96b685..f9255bdd65af6 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 @@ -12,6 +12,7 @@ import { } from 'test/utils/pickers'; import { DesktopDateRangePicker } from '@mui/x-date-pickers-pro/DesktopDateRangePicker'; import { SingleInputDateRangeField } from '@mui/x-date-pickers-pro/SingleInputDateRangeField'; +import { PickerNonNullableRangeValue, PickerRangeValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -45,7 +46,7 @@ describe(' - Describes', () => { ], })); - describeValue(DesktopDateRangePicker, () => ({ + describeValue(DesktopDateRangePicker, () => ({ render, componentFamily: 'picker', type: 'date-range', @@ -76,7 +77,7 @@ describe(' - Describes', () => { value, { isOpened, applySameValue, setEndDate = false, selectSection, pressKey }, ) => { - let newValue: any[]; + let newValue: PickerNonNullableRangeValue; if (applySameValue) { newValue = value; } else if (setEndDate) { @@ -101,7 +102,7 @@ describe(' - Describes', () => { })); // With single input field - describeValue(DesktopDateRangePicker, () => ({ + describeValue(DesktopDateRangePicker, () => ({ render, componentFamily: 'picker', type: 'date-range', @@ -138,7 +139,7 @@ describe(' - Describes', () => { value, { isOpened, applySameValue, setEndDate = false, selectSection, pressKey }, ) => { - let newValue: any[]; + let newValue: PickerNonNullableRangeValue; if (applySameValue) { newValue = value; } else if (setEndDate) { diff --git a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx index 4c93efaf101e3..fe76558163298 100644 --- a/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/DesktopDateTimeRangePicker/DesktopDateTimeRangePicker.tsx @@ -190,7 +190,6 @@ const DesktopDateTimeRangePicker = React.forwardRef(function DesktopDateTimeRang }, toolbar: { hidden: true, - toolbarVariant: 'desktop', ...defaultizedProps.slotProps?.toolbar, }, actionBar: (ownerState: PickerLayoutOwnerState) => ({ 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 d3a4235ce6e1b..dfdd329087ff3 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,6 @@ import * as React from 'react'; import { describeConformance, fireEvent, screen } from '@mui/internal-test-utils'; +import { PickerNonNullableRangeValue, PickerRangeValue } from '@mui/x-date-pickers/internals'; import { createPickerRenderer, adapterToUse, @@ -46,7 +47,7 @@ describe(' - Describes', () => { ], })); - describeValue(DesktopDateTimeRangePicker, () => ({ + describeValue(DesktopDateTimeRangePicker, () => ({ render, componentFamily: 'picker', type: 'date-time-range', @@ -86,7 +87,7 @@ describe(' - Describes', () => { value, { isOpened, applySameValue, setEndDate = false, selectSection, pressKey }, ) => { - let newValue: any[]; + let newValue: PickerNonNullableRangeValue; if (applySameValue) { newValue = value; } else if (setEndDate) { 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 3d5b9c2013bc3..8304680152111 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,6 +1,7 @@ import * as React from 'react'; import { screen, fireDiscreteEvent, fireEvent } from '@mui/internal-test-utils'; import { MobileDateRangePicker } from '@mui/x-date-pickers-pro/MobileDateRangePicker'; +import { PickerNonNullableRangeValue, PickerRangeValue } from '@mui/x-date-pickers/internals'; import { adapterToUse, createPickerRenderer, @@ -45,7 +46,7 @@ describe(' - Describes', () => { ], })); - describeValue(MobileDateRangePicker, () => ({ + describeValue(MobileDateRangePicker, () => ({ render, componentFamily: 'picker', type: 'date-range', @@ -73,7 +74,7 @@ describe(' - Describes', () => { expectFieldValueV7(endFieldRoot, expectedEndValueStr); }, setNewValue: (value, { isOpened, applySameValue, setEndDate = false }) => { - let newValue: any[]; + let newValue: PickerNonNullableRangeValue; if (applySameValue) { newValue = value; } else if (setEndDate) { diff --git a/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx b/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx index 05cd5521a2ce9..5bade8b66ee44 100644 --- a/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/MobileDateTimeRangePicker/MobileDateTimeRangePicker.tsx @@ -188,7 +188,6 @@ const MobileDateTimeRangePicker = React.forwardRef(function MobileDateTimeRangeP }, toolbar: { hidden: false, - toolbarVariant: 'mobile', ...defaultizedProps.slotProps?.toolbar, }, }, 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 e0ba6d9c933a9..90a5dc4057ec1 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,6 @@ import * as React from 'react'; import { describeConformance, fireEvent, screen } from '@mui/internal-test-utils'; +import { PickerNonNullableRangeValue, PickerRangeValue } from '@mui/x-date-pickers/internals'; import { createPickerRenderer, adapterToUse, @@ -10,7 +11,7 @@ import { getFieldSectionsContainer, openPicker, } from 'test/utils/pickers'; -import { MobileDateTimeRangePicker } from '../MobileDateTimeRangePicker'; +import { MobileDateTimeRangePicker } from '@mui/x-date-pickers-pro/MobileDateTimeRangePicker'; describe(' - Describes', () => { const { render, clock } = createPickerRenderer({ @@ -47,7 +48,7 @@ describe(' - Describes', () => { ], })); - describeValue(MobileDateTimeRangePicker, () => ({ + describeValue(MobileDateTimeRangePicker, () => ({ render, componentFamily: 'picker', type: 'date-time-range', @@ -91,7 +92,7 @@ describe(' - Describes', () => { initialFocus: setEndDate ? 'end' : 'start', }); } - let newValue: any[]; + let newValue: PickerNonNullableRangeValue; if (applySameValue) { newValue = value; } else if (setEndDate) { diff --git a/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx b/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx index c3c9fb73c19d5..50cd4f22cbb75 100644 --- a/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx +++ b/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.tsx @@ -12,7 +12,10 @@ import { unstable_generateUtilityClass as generateUtilityClass, unstable_generateUtilityClasses as generateUtilityClasses, } from '@mui/utils'; -import { convertFieldResponseIntoMuiTextFieldProps } from '@mui/x-date-pickers/internals'; +import { + convertFieldResponseIntoMuiTextFieldProps, + useFieldOwnerState, +} from '@mui/x-date-pickers/internals'; import { useSplitFieldProps } from '@mui/x-date-pickers/hooks'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { @@ -30,8 +33,7 @@ export const multiInputDateRangeFieldClasses: MultiInputRangeFieldClasses = gene export const getMultiInputDateRangeFieldUtilityClass = (slot: string) => generateUtilityClass('MuiMultiInputDateRangeField', slot); -const useUtilityClasses = (ownerState: MultiInputDateRangeFieldProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], separator: ['separator'], @@ -95,11 +97,12 @@ const MultiInputDateRangeField = React.forwardRef(function MultiInputDateRangeFi unstableStartFieldRef, unstableEndFieldRef, className, + classes: classesProp, ...otherForwardedProps } = forwardedProps; - const ownerState = themeProps; - const classes = useUtilityClasses(ownerState); + const ownerState = useFieldOwnerState(internalProps); + const classes = useUtilityClasses(classesProp); const Root = slots?.root ?? MultiInputDateRangeFieldRoot; const rootProps = useSlotProps({ @@ -118,7 +121,7 @@ const MultiInputDateRangeField = React.forwardRef(function MultiInputDateRangeFi (inProps.enableAccessibleFieldDOMStructure === false ? MuiTextField : PickersTextField); const startTextFieldProps = useSlotProps< typeof TextField, - MultiInputDateRangeFieldSlotProps['textField'], + MultiInputDateRangeFieldSlotProps['textField'], {}, MultiInputDateRangeFieldProps & { position: RangePosition; @@ -130,7 +133,7 @@ const MultiInputDateRangeField = React.forwardRef(function MultiInputDateRangeFi }); const endTextFieldProps = useSlotProps< typeof TextField, - MultiInputDateRangeFieldSlotProps['textField'], + MultiInputDateRangeFieldSlotProps['textField'], {}, MultiInputDateRangeFieldProps & { position: RangePosition; @@ -323,10 +326,10 @@ MultiInputDateRangeField.propTypes = { */ shouldDisableDate: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.types.ts b/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.types.ts index 8b31315cee9fb..6565d64012de7 100644 --- a/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.types.ts +++ b/packages/x-date-pickers-pro/src/MultiInputDateRangeField/MultiInputDateRangeField.types.ts @@ -1,8 +1,10 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import Typography from '@mui/material/Typography'; -import Stack, { StackProps } from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; +import type { TypographyProps } from '@mui/material/Typography'; +import type { StackProps } from '@mui/material/Stack'; +import type { TextFieldProps } from '@mui/material/TextField'; +import { FieldOwnerState } from '@mui/x-date-pickers/models'; +import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; +import { PickersTextFieldProps } from '@mui/x-date-pickers/PickersTextField'; import { UseMultiInputRangeFieldParams } from '../internals/hooks/useMultiInputRangeField/useMultiInputRangeField.types'; import { MultiInputFieldRefs, @@ -53,7 +55,7 @@ export interface MultiInputDateRangeFieldProps< * The props used for each component slot. * @default {} */ - slotProps?: MultiInputDateRangeFieldSlotProps; + slotProps?: MultiInputDateRangeFieldSlotProps; } export interface MultiInputDateRangeFieldSlots { @@ -65,7 +67,7 @@ export interface MultiInputDateRangeFieldSlots { /** * Form control with an input to render a date. * It is rendered twice: once for the start date and once for the end date. - * @default TextField from '@mui/material' or PickersTextField if `enableAccessibleFieldDOMStructure` is `true`. + * @default , or from '@mui/material' if `enableAccessibleFieldDOMStructure` is `false`. */ textField?: React.ElementType; /** @@ -75,24 +77,14 @@ export interface MultiInputDateRangeFieldSlots { separator?: React.ElementType; } -export interface MultiInputDateRangeFieldSlotProps< - TEnableAccessibleFieldDOMStructure extends boolean, -> { - root?: SlotComponentProps< - typeof Stack, - {}, - MultiInputDateRangeFieldProps - >; - textField?: SlotComponentProps< - typeof TextField, +export interface MultiInputDateRangeFieldSlotProps { + root?: SlotComponentPropsFromProps; + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - MultiInputDateRangeFieldProps & { + FieldOwnerState & { position: RangePosition; } >; - separator?: SlotComponentProps< - typeof Typography, - {}, - MultiInputDateRangeFieldProps - >; + separator?: SlotComponentPropsFromProps; } diff --git a/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx b/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx index 3531d3a14dd9d..06b5798770357 100644 --- a/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.tsx @@ -12,7 +12,10 @@ import { unstable_generateUtilityClass as generateUtilityClass, unstable_generateUtilityClasses as generateUtilityClasses, } from '@mui/utils'; -import { convertFieldResponseIntoMuiTextFieldProps } from '@mui/x-date-pickers/internals'; +import { + convertFieldResponseIntoMuiTextFieldProps, + useFieldOwnerState, +} from '@mui/x-date-pickers/internals'; import { useSplitFieldProps } from '@mui/x-date-pickers/hooks'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { @@ -28,8 +31,7 @@ export const multiInputDateTimeRangeFieldClasses: MultiInputRangeFieldClasses = export const getMultiInputDateTimeRangeFieldUtilityClass = (slot: string) => generateUtilityClass('MuiMultiInputDateTimeRangeField', slot); -const useUtilityClasses = (ownerState: MultiInputDateTimeRangeFieldProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], separator: ['separator'], @@ -93,11 +95,12 @@ const MultiInputDateTimeRangeField = React.forwardRef(function MultiInputDateTim unstableStartFieldRef, unstableEndFieldRef, className, + classes: classesProp, ...otherForwardedProps } = forwardedProps; - const ownerState = themeProps; - const classes = useUtilityClasses(ownerState); + const ownerState = useFieldOwnerState(themeProps); + const classes = useUtilityClasses(classesProp); const Root = slots?.root ?? MultiInputDateTimeRangeFieldRoot; const rootProps = useSlotProps({ @@ -116,7 +119,7 @@ const MultiInputDateTimeRangeField = React.forwardRef(function MultiInputDateTim (inProps.enableAccessibleFieldDOMStructure === false ? MuiTextField : PickersTextField); const startTextFieldProps = useSlotProps< typeof TextField, - MultiInputDateTimeRangeFieldSlotProps['textField'], + MultiInputDateTimeRangeFieldSlotProps['textField'], {}, MultiInputDateTimeRangeFieldProps & { position: RangePosition; @@ -128,7 +131,7 @@ const MultiInputDateTimeRangeField = React.forwardRef(function MultiInputDateTim }); const endTextFieldProps = useSlotProps< typeof TextField, - MultiInputDateTimeRangeFieldSlotProps['textField'], + MultiInputDateTimeRangeFieldSlotProps['textField'], {}, MultiInputDateTimeRangeFieldProps & { position: RangePosition; @@ -361,10 +364,10 @@ MultiInputDateTimeRangeField.propTypes = { */ shouldDisableTime: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.ts b/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.ts index e66073ee71f5e..51675345af78b 100644 --- a/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.ts +++ b/packages/x-date-pickers-pro/src/MultiInputDateTimeRangeField/MultiInputDateTimeRangeField.types.ts @@ -1,8 +1,10 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import Typography from '@mui/material/Typography'; -import Stack, { StackProps } from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; +import type { TypographyProps } from '@mui/material/Typography'; +import type { StackProps } from '@mui/material/Stack'; +import type { TextFieldProps } from '@mui/material/TextField'; +import { FieldOwnerState } from '@mui/x-date-pickers/models'; +import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; +import { PickersTextFieldProps } from '@mui/x-date-pickers/PickersTextField'; import { UseDateTimeRangeFieldProps } from '../internals/models/dateTimeRange'; import { UseMultiInputRangeFieldParams } from '../internals/hooks/useMultiInputRangeField/useMultiInputRangeField.types'; import { MultiInputFieldRefs, MultiInputRangeFieldClasses, RangePosition } from '../models'; @@ -52,7 +54,7 @@ export interface MultiInputDateTimeRangeFieldProps< * The props used for each component slot. * @default {} */ - slotProps?: MultiInputDateTimeRangeFieldSlotProps; + slotProps?: MultiInputDateTimeRangeFieldSlotProps; } export interface MultiInputDateTimeRangeFieldSlots { @@ -74,24 +76,14 @@ export interface MultiInputDateTimeRangeFieldSlots { separator?: React.ElementType; } -export interface MultiInputDateTimeRangeFieldSlotProps< - TEnableAccessibleFieldDOMStructure extends boolean, -> { - root?: SlotComponentProps< - typeof Stack, - {}, - MultiInputDateTimeRangeFieldProps - >; - textField?: SlotComponentProps< - typeof TextField, +export interface MultiInputDateTimeRangeFieldSlotProps { + root?: SlotComponentPropsFromProps; + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - MultiInputDateTimeRangeFieldProps & { + FieldOwnerState & { position: RangePosition; } >; - separator?: SlotComponentProps< - typeof Typography, - {}, - MultiInputDateTimeRangeFieldProps - >; + separator?: SlotComponentPropsFromProps; } diff --git a/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx b/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx index c533888fd193c..e9e5c24a2ea26 100644 --- a/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.tsx @@ -12,7 +12,10 @@ import { unstable_generateUtilityClass as generateUtilityClass, unstable_generateUtilityClasses as generateUtilityClasses, } from '@mui/utils'; -import { convertFieldResponseIntoMuiTextFieldProps } from '@mui/x-date-pickers/internals'; +import { + convertFieldResponseIntoMuiTextFieldProps, + useFieldOwnerState, +} from '@mui/x-date-pickers/internals'; import { useSplitFieldProps } from '@mui/x-date-pickers/hooks'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { @@ -30,8 +33,7 @@ export const multiInputTimeRangeFieldClasses: MultiInputRangeFieldClasses = gene export const getMultiInputTimeRangeFieldUtilityClass = (slot: string) => generateUtilityClass('MuiMultiInputTimeRangeField', slot); -const useUtilityClasses = (ownerState: MultiInputTimeRangeFieldProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], separator: ['separator'], @@ -95,11 +97,12 @@ const MultiInputTimeRangeField = React.forwardRef(function MultiInputTimeRangeFi unstableStartFieldRef, unstableEndFieldRef, className, + classes: classesProp, ...otherForwardedProps } = forwardedProps; - const ownerState = themeProps; - const classes = useUtilityClasses(ownerState); + const ownerState = useFieldOwnerState(themeProps); + const classes = useUtilityClasses(classesProp); const Root = slots?.root ?? MultiInputTimeRangeFieldRoot; const rootProps = useSlotProps({ @@ -118,7 +121,7 @@ const MultiInputTimeRangeField = React.forwardRef(function MultiInputTimeRangeFi (inProps.enableAccessibleFieldDOMStructure === false ? MuiTextField : PickersTextField); const startTextFieldProps = useSlotProps< typeof TextField, - MultiInputTimeRangeFieldSlotProps['textField'], + MultiInputTimeRangeFieldSlotProps['textField'], {}, MultiInputTimeRangeFieldProps & { position: RangePosition; @@ -131,7 +134,7 @@ const MultiInputTimeRangeField = React.forwardRef(function MultiInputTimeRangeFi const endTextFieldProps = useSlotProps< typeof TextField, - MultiInputTimeRangeFieldSlotProps['textField'], + MultiInputTimeRangeFieldSlotProps['textField'], {}, MultiInputTimeRangeFieldProps & { position: RangePosition; @@ -336,10 +339,10 @@ MultiInputTimeRangeField.propTypes = { */ shouldDisableTime: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.types.ts b/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.types.ts index a9fcc08313112..08708712d12de 100644 --- a/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.types.ts +++ b/packages/x-date-pickers-pro/src/MultiInputTimeRangeField/MultiInputTimeRangeField.types.ts @@ -1,8 +1,10 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import Typography from '@mui/material/Typography'; -import Stack, { StackProps } from '@mui/material/Stack'; -import TextField from '@mui/material/TextField'; +import type { TypographyProps } from '@mui/material/Typography'; +import type { StackProps } from '@mui/material/Stack'; +import type { TextFieldProps } from '@mui/material/TextField'; +import { FieldOwnerState } from '@mui/x-date-pickers/models'; +import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; +import { PickersTextFieldProps } from '@mui/x-date-pickers/PickersTextField'; import { UseTimeRangeFieldProps } from '../internals/models/timeRange'; import { UseMultiInputRangeFieldParams } from '../internals/hooks/useMultiInputRangeField/useMultiInputRangeField.types'; import { MultiInputFieldRefs, MultiInputRangeFieldClasses, RangePosition } from '../models'; @@ -49,7 +51,7 @@ export interface MultiInputTimeRangeFieldProps< * The props used for each component slot. * @default {} */ - slotProps?: MultiInputTimeRangeFieldSlotProps; + slotProps?: MultiInputTimeRangeFieldSlotProps; } export interface MultiInputTimeRangeFieldSlots { @@ -71,24 +73,14 @@ export interface MultiInputTimeRangeFieldSlots { separator?: React.ElementType; } -export interface MultiInputTimeRangeFieldSlotProps< - TEnableAccessibleFieldDOMStructure extends boolean, -> { - root?: SlotComponentProps< - typeof Stack, - {}, - MultiInputTimeRangeFieldProps - >; - textField?: SlotComponentProps< - typeof TextField, +export interface MultiInputTimeRangeFieldSlotProps { + root?: SlotComponentPropsFromProps; + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - MultiInputTimeRangeFieldProps & { + FieldOwnerState & { position: RangePosition; } >; - separator?: SlotComponentProps< - typeof Typography, - {}, - MultiInputTimeRangeFieldProps - >; + separator?: SlotComponentPropsFromProps; } diff --git a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx index 02f127c0c715d..86707618138fb 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.tsx @@ -6,7 +6,10 @@ import { useThemeProps } from '@mui/material/styles'; import useSlotProps from '@mui/utils/useSlotProps'; import { refType } from '@mui/utils'; import { useClearableField } from '@mui/x-date-pickers/hooks'; -import { convertFieldResponseIntoMuiTextFieldProps } from '@mui/x-date-pickers/internals'; +import { + convertFieldResponseIntoMuiTextFieldProps, + useFieldOwnerState, +} from '@mui/x-date-pickers/internals'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { SingleInputDateRangeFieldProps } from './SingleInputDateRangeField.types'; import { useSingleInputDateRangeField } from './useSingleInputDateRangeField'; @@ -40,7 +43,7 @@ const SingleInputDateRangeField = React.forwardRef(function SingleInputDateRange const { slots, slotProps, InputProps, inputProps, ...other } = themeProps; - const ownerState = themeProps; + const ownerState = useFieldOwnerState(themeProps); const TextField = slots?.textField ?? @@ -292,10 +295,10 @@ SingleInputDateRangeField.propTypes = { */ shouldDisableDate: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.types.ts b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.types.ts index da88995ac3044..027ffbfbdb1de 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.types.ts +++ b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/SingleInputDateRangeField.types.ts @@ -1,18 +1,15 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import TextField from '@mui/material/TextField'; -import { UseFieldInternalProps, PickerRangeValue } from '@mui/x-date-pickers/internals'; -import { BuiltInFieldTextFieldProps } from '@mui/x-date-pickers/models'; +import { TextFieldProps } from '@mui/material/TextField'; +import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; +import { PickerRangeValue, UseFieldInternalProps } from '@mui/x-date-pickers/internals'; +import { BuiltInFieldTextFieldProps, FieldOwnerState } from '@mui/x-date-pickers/models'; import { ExportedUseClearableFieldProps, UseClearableFieldSlots, UseClearableFieldSlotProps, } from '@mui/x-date-pickers/hooks'; -import type { - RangeFieldSection, - DateRangeValidationError, - UseDateRangeFieldProps, -} from '../models'; +import { PickersTextFieldProps } from '@mui/x-date-pickers/PickersTextField'; +import type { DateRangeValidationError, UseDateRangeFieldProps } from '../models'; export interface UseSingleInputDateRangeFieldProps< TEnableAccessibleFieldDOMStructure extends boolean, @@ -21,7 +18,6 @@ export interface UseSingleInputDateRangeFieldProps< Pick< UseFieldInternalProps< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, DateRangeValidationError >, @@ -44,23 +40,21 @@ export type SingleInputDateRangeFieldProps< * The props used for each component slot. * @default {} */ - slotProps?: SingleInputDateRangeFieldSlotProps; + slotProps?: SingleInputDateRangeFieldSlotProps; }; export interface SingleInputDateRangeFieldSlots extends UseClearableFieldSlots { /** * Form control with an input to render the value. - * @default TextField from '@mui/material' or PickersTextField if `enableAccessibleFieldDOMStructure` is `true`. + * @default , or from '@mui/material' if `enableAccessibleFieldDOMStructure` is `false`. */ textField?: React.ElementType; } -export interface SingleInputDateRangeFieldSlotProps< - TEnableAccessibleFieldDOMStructure extends boolean, -> extends UseClearableFieldSlotProps { - textField?: SlotComponentProps< - typeof TextField, +export interface SingleInputDateRangeFieldSlotProps extends UseClearableFieldSlotProps { + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - SingleInputDateRangeFieldProps + FieldOwnerState >; } diff --git a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/useSingleInputDateRangeField.ts b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/useSingleInputDateRangeField.ts index 628a548326c42..e1b71090039e7 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateRangeField/useSingleInputDateRangeField.ts +++ b/packages/x-date-pickers-pro/src/SingleInputDateRangeField/useSingleInputDateRangeField.ts @@ -5,7 +5,6 @@ import { useSplitFieldProps } from '@mui/x-date-pickers/hooks'; import { UseSingleInputDateRangeFieldProps } from './SingleInputDateRangeField.types'; import { rangeValueManager, getRangeFieldValueManager } from '../internals/utils/valueManagers'; import { validateDateRange } from '../validation'; -import { RangeFieldSection } from '../models'; export const useSingleInputDateRangeField = < TEnableAccessibleFieldDOMStructure extends boolean, @@ -27,7 +26,6 @@ export const useSingleInputDateRangeField = < return useField< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, typeof forwardedProps, typeof internalProps diff --git a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx index 1c3a0b1469dd2..f81834fd4ff77 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.tsx @@ -2,7 +2,10 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import MuiTextField from '@mui/material/TextField'; -import { convertFieldResponseIntoMuiTextFieldProps } from '@mui/x-date-pickers/internals'; +import { + convertFieldResponseIntoMuiTextFieldProps, + useFieldOwnerState, +} from '@mui/x-date-pickers/internals'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { useThemeProps } from '@mui/material/styles'; import { refType } from '@mui/utils'; @@ -40,7 +43,7 @@ const SingleInputDateTimeRangeField = React.forwardRef(function SingleInputDateT const { slots, slotProps, InputProps, inputProps, ...other } = themeProps; - const ownerState = themeProps; + const ownerState = useFieldOwnerState(themeProps); const TextField = slots?.textField ?? @@ -332,10 +335,10 @@ SingleInputDateTimeRangeField.propTypes = { */ shouldDisableTime: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.types.ts b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.types.ts index 6632d68fc3eb4..9624ffa1c73e0 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.types.ts +++ b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/SingleInputDateTimeRangeField.types.ts @@ -1,15 +1,16 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import TextField from '@mui/material/TextField'; -import { UseFieldInternalProps, PickerRangeValue } from '@mui/x-date-pickers/internals'; -import { BuiltInFieldTextFieldProps } from '@mui/x-date-pickers/models'; +import { TextFieldProps } from '@mui/material/TextField'; +import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; +import { PickersTextFieldProps } from '@mui/x-date-pickers/PickersTextField'; +import { PickerRangeValue, UseFieldInternalProps } from '@mui/x-date-pickers/internals'; +import { BuiltInFieldTextFieldProps, FieldOwnerState } from '@mui/x-date-pickers/models'; import { ExportedUseClearableFieldProps, UseClearableFieldSlots, UseClearableFieldSlotProps, } from '@mui/x-date-pickers/hooks'; import { UseDateTimeRangeFieldProps } from '../internals/models'; -import { RangeFieldSection, DateTimeRangeValidationError } from '../models'; +import { DateTimeRangeValidationError } from '../models'; export interface UseSingleInputDateTimeRangeFieldProps< TEnableAccessibleFieldDOMStructure extends boolean, @@ -18,7 +19,6 @@ export interface UseSingleInputDateTimeRangeFieldProps< Pick< UseFieldInternalProps< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, DateTimeRangeValidationError >, @@ -41,23 +41,21 @@ export type SingleInputDateTimeRangeFieldProps< * The props used for each component slot. * @default {} */ - slotProps?: SingleInputDateTimeRangeFieldSlotProps; + slotProps?: SingleInputDateTimeRangeFieldSlotProps; }; export interface SingleInputDateTimeRangeFieldSlots extends UseClearableFieldSlots { /** * Form control with an input to render the value. - * @default TextField from '@mui/material' or PickersTextField if `enableAccessibleFieldDOMStructure` is `true`. + * @default , or from '@mui/material' if `enableAccessibleFieldDOMStructure` is `false`. */ textField?: React.ElementType; } -export interface SingleInputDateTimeRangeFieldSlotProps< - TEnableAccessibleFieldDOMStructure extends boolean, -> extends UseClearableFieldSlotProps { - textField?: SlotComponentProps< - typeof TextField, +export interface SingleInputDateTimeRangeFieldSlotProps extends UseClearableFieldSlotProps { + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - SingleInputDateTimeRangeFieldProps + FieldOwnerState >; } diff --git a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.ts b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.ts index f96bfe35fd10d..1fbed22a25d09 100644 --- a/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.ts +++ b/packages/x-date-pickers-pro/src/SingleInputDateTimeRangeField/useSingleInputDateTimeRangeField.ts @@ -9,7 +9,6 @@ import { useSplitFieldProps } from '@mui/x-date-pickers/hooks'; import { UseSingleInputDateTimeRangeFieldProps } from './SingleInputDateTimeRangeField.types'; import { rangeValueManager, getRangeFieldValueManager } from '../internals/utils/valueManagers'; import { validateDateTimeRange } from '../validation'; -import { RangeFieldSection } from '../models'; export const useSingleInputDateTimeRangeField = < TEnableAccessibleFieldDOMStructure extends boolean, @@ -31,7 +30,6 @@ export const useSingleInputDateTimeRangeField = < return useField< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, typeof forwardedProps, typeof internalProps diff --git a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx index ff5b9d8524cd9..b820b6a27f605 100644 --- a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx +++ b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.tsx @@ -3,7 +3,10 @@ import * as React from 'react'; import PropTypes from 'prop-types'; import MuiTextField from '@mui/material/TextField'; import { useClearableField } from '@mui/x-date-pickers/hooks'; -import { convertFieldResponseIntoMuiTextFieldProps } from '@mui/x-date-pickers/internals'; +import { + convertFieldResponseIntoMuiTextFieldProps, + useFieldOwnerState, +} from '@mui/x-date-pickers/internals'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { useThemeProps } from '@mui/material/styles'; import useSlotProps from '@mui/utils/useSlotProps'; @@ -40,7 +43,7 @@ const SingleInputTimeRangeField = React.forwardRef(function SingleInputTimeRange const { slots, slotProps, InputProps, inputProps, ...other } = themeProps; - const ownerState = themeProps; + const ownerState = useFieldOwnerState(themeProps); const TextField = slots?.textField ?? @@ -304,10 +307,10 @@ SingleInputTimeRangeField.propTypes = { */ shouldDisableTime: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.types.ts b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.types.ts index 1cc0fa3fd4835..46b019e84e955 100644 --- a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.types.ts +++ b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/SingleInputTimeRangeField.types.ts @@ -1,15 +1,16 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import TextField from '@mui/material/TextField'; +import type { TextFieldProps } from '@mui/material/TextField'; import { PickerRangeValue, UseFieldInternalProps } from '@mui/x-date-pickers/internals'; -import { BuiltInFieldTextFieldProps } from '@mui/x-date-pickers/models'; +import { BuiltInFieldTextFieldProps, FieldOwnerState } from '@mui/x-date-pickers/models'; +import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; +import { PickersTextFieldProps } from '@mui/x-date-pickers/PickersTextField'; import { ExportedUseClearableFieldProps, UseClearableFieldSlots, UseClearableFieldSlotProps, } from '@mui/x-date-pickers/hooks'; import { UseTimeRangeFieldProps } from '../internals/models'; -import { RangeFieldSection, TimeRangeValidationError } from '../models'; +import { TimeRangeValidationError } from '../models'; export interface UseSingleInputTimeRangeFieldProps< TEnableAccessibleFieldDOMStructure extends boolean, @@ -18,7 +19,6 @@ export interface UseSingleInputTimeRangeFieldProps< Pick< UseFieldInternalProps< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, TimeRangeValidationError >, @@ -41,23 +41,21 @@ export type SingleInputTimeRangeFieldProps< * The props used for each component slot. * @default {} */ - slotProps?: SingleInputTimeRangeFieldSlotProps; + slotProps?: SingleInputTimeRangeFieldSlotProps; }; export interface SingleInputTimeRangeFieldSlots extends UseClearableFieldSlots { /** * Form control with an input to render the value. - * @default TextField from '@mui/material' or PickersTextField if `enableAccessibleFieldDOMStructure` is `true`. + * @default , or from '@mui/material' if `enableAccessibleFieldDOMStructure` is `false`. */ textField?: React.ElementType; } -export interface SingleInputTimeRangeFieldSlotProps< - TEnableAccessibleFieldDOMStructure extends boolean, -> extends UseClearableFieldSlotProps { - textField?: SlotComponentProps< - typeof TextField, +export interface SingleInputTimeRangeFieldSlotProps extends UseClearableFieldSlotProps { + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - SingleInputTimeRangeFieldProps + FieldOwnerState >; } diff --git a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/useSingleInputTimeRangeField.ts b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/useSingleInputTimeRangeField.ts index f7a4eec521e66..a55e35d42c97f 100644 --- a/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/useSingleInputTimeRangeField.ts +++ b/packages/x-date-pickers-pro/src/SingleInputTimeRangeField/useSingleInputTimeRangeField.ts @@ -5,7 +5,6 @@ import { useSplitFieldProps } from '@mui/x-date-pickers/hooks'; import { UseSingleInputTimeRangeFieldProps } from './SingleInputTimeRangeField.types'; import { rangeValueManager, getRangeFieldValueManager } from '../internals/utils/valueManagers'; import { validateTimeRange } from '../validation'; -import { RangeFieldSection } from '../models'; export const useSingleInputTimeRangeField = < TEnableAccessibleFieldDOMStructure extends boolean, @@ -27,7 +26,6 @@ export const useSingleInputTimeRangeField = < return useField< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, typeof forwardedProps, typeof internalProps diff --git a/packages/x-date-pickers-pro/src/internals/hooks/models/useRangePicker.ts b/packages/x-date-pickers-pro/src/internals/hooks/models/useRangePicker.ts index 53e0cd5f8b160..9564e78e3c579 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/models/useRangePicker.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/models/useRangePicker.ts @@ -5,7 +5,7 @@ import { UsePickerViewsProps, BaseNonStaticPickerProps, UsePickerValueNonStaticProps, - UsePickerViewsNonStaticProps, + UsePickerProviderNonStaticProps, DateOrTimeViewWithMeridiem, ExportedBaseTabsProps, PickerRangeValue, @@ -20,7 +20,6 @@ import { RangePickerFieldSlots, RangePickerFieldSlotProps, } from '../useEnrichedRangePickerFieldProps'; -import { RangeFieldSection } from '../../../models'; export interface UseRangePickerSlots extends ExportedPickersLayoutSlots, @@ -38,7 +37,7 @@ export interface UseRangePickerSlotProps< export interface RangeOnlyPickerProps extends BaseNonStaticPickerProps, UsePickerValueNonStaticProps, - UsePickerViewsNonStaticProps, + UsePickerProviderNonStaticProps, BaseRangeNonStaticPickerProps, UseRangePositionProps {} @@ -58,13 +57,7 @@ export interface UseRangePickerParams< TExternalProps extends UseRangePickerProps, TAdditionalViewProps extends {}, > extends Pick< - UsePickerParams< - PickerRangeValue, - TView, - RangeFieldSection, - TExternalProps, - TAdditionalViewProps - >, + UsePickerParams, 'valueManager' | 'valueType' | 'validator' | 'rendererInterceptor' > { props: TExternalProps; diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.tsx b/packages/x-date-pickers-pro/src/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.tsx index 34d4e46d8008a..4dabe621a1e73 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.tsx @@ -11,6 +11,7 @@ import { DateOrTimeViewWithMeridiem, ExportedBaseTabsProps, PickerProvider, + PickerValue, PickerRangeValue, } from '@mui/x-date-pickers/internals'; import { FieldRef, InferError } from '@mui/x-date-pickers/models'; @@ -24,7 +25,6 @@ import { useEnrichedRangePickerFieldProps, } from '../useEnrichedRangePickerFieldProps'; import { getReleaseInfo } from '../../utils/releaseInfo'; -import { RangeFieldSection } from '../../../models'; import { useRangePosition } from '../useRangePosition'; const releaseInfo = getReleaseInfo(); @@ -69,16 +69,26 @@ export const useDesktopRangePicker = < const fieldContainerRef = React.useRef(null); const anchorRef = React.useRef(null); const popperRef = React.useRef(null); - const startFieldRef = React.useRef>(null); - const endFieldRef = React.useRef>(null); + const startFieldRef = React.useRef>(null); + const endFieldRef = React.useRef>(null); + const singleInputFieldRef = React.useRef>(null); const initialView = React.useRef(props.openTo ?? null); const fieldType = (slots.field as any).fieldType ?? 'multi-input'; const { rangePosition, onRangePositionChange } = useRangePosition( props, - fieldType === 'single-input' ? startFieldRef : undefined, + fieldType === 'single-input' ? singleInputFieldRef : undefined, ); + let fieldRef: React.RefObject | FieldRef>; + if (fieldType === 'single-input') { + fieldRef = singleInputFieldRef; + } else if (rangePosition === 'start') { + fieldRef = startFieldRef; + } else { + fieldRef = endFieldRef; + } + const { open, actions, @@ -88,18 +98,12 @@ export const useDesktopRangePicker = < shouldRestoreFocus, fieldProps: pickerFieldProps, ownerState, - } = usePicker< - PickerRangeValue, - TView, - RangeFieldSection, - TExternalProps, - DesktopRangePickerAdditionalViewProps - >({ + } = usePicker({ ...pickerParams, props, variant: 'desktop', autoFocusView: false, - fieldRef: rangePosition === 'start' ? startFieldRef : endFieldRef, + fieldRef, localeText, additionalViewProps: { rangePosition, @@ -181,6 +185,7 @@ export const useDesktopRangePicker = < anchorRef, startFieldRef, endFieldRef, + singleInputFieldRef, currentView: layoutProps.view !== props.openTo ? layoutProps.view : undefined, initialView: initialView.current ?? undefined, onViewChange: layoutProps.onViewChange, diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useEnrichedRangePickerFieldProps.ts b/packages/x-date-pickers-pro/src/internals/hooks/useEnrichedRangePickerFieldProps.ts index 17ffbc770c215..a858ae3df40b3 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useEnrichedRangePickerFieldProps.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/useEnrichedRangePickerFieldProps.ts @@ -6,7 +6,12 @@ import resolveComponentProps from '@mui/utils/resolveComponentProps'; import useEventCallback from '@mui/utils/useEventCallback'; import useForkRef from '@mui/utils/useForkRef'; import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; -import { FieldSelectedSections, FieldRef, PickerOwnerState } from '@mui/x-date-pickers/models'; +import { + FieldSelectedSections, + FieldRef, + PickerOwnerState, + FieldOwnerState, +} from '@mui/x-date-pickers/models'; import { UseClearableFieldSlots, UseClearableFieldSlotProps, @@ -20,15 +25,14 @@ import { DateOrTimeViewWithMeridiem, BaseSingleInputFieldProps, PickerRangeValue, + PickerValue, } from '@mui/x-date-pickers/internals'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { MultiInputFieldSlotRootProps, MultiInputFieldSlotTextFieldProps, - RangeFieldSection, RangePosition, FieldType, - UseDateRangeFieldProps, PickerRangeFieldSlotProps, } from '../../models'; import { UseRangePositionResponse } from './useRangePosition'; @@ -57,20 +61,16 @@ export interface RangePickerFieldSlots extends UseClearableFieldSlots { export interface RangePickerFieldSlotProps extends UseClearableFieldSlotProps { field?: SlotComponentPropsFromProps< - PickerRangeFieldSlotProps< - PickerRangeValue, - RangeFieldSection, - TEnableAccessibleFieldDOMStructure - >, + PickerRangeFieldSlotProps, {}, PickerOwnerState >; - fieldRoot?: SlotComponentProps>; - fieldSeparator?: SlotComponentProps>; + fieldRoot?: SlotComponentProps; + fieldSeparator?: SlotComponentProps; textField?: SlotComponentProps< typeof PickersTextField, {}, - UseDateRangeFieldProps & { position?: RangePosition } + FieldOwnerState & { position?: RangePosition } >; } @@ -80,20 +80,10 @@ export type RangePickerPropsForFieldSlot< TError, > = | (TIsSingleInput extends true - ? BaseSingleInputFieldProps< - PickerRangeValue, - RangeFieldSection, - TEnableAccessibleFieldDOMStructure, - TError - > + ? BaseSingleInputFieldProps : never) | (TIsSingleInput extends false - ? BaseMultiInputFieldProps< - PickerRangeValue, - RangeFieldSection, - TEnableAccessibleFieldDOMStructure, - TError - > + ? BaseMultiInputFieldProps : never); export interface UseEnrichedRangePickerFieldPropsParams< @@ -101,10 +91,7 @@ export interface UseEnrichedRangePickerFieldPropsParams< TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, TError, -> extends Pick< - UsePickerResponse, - 'open' | 'actions' - >, +> extends Pick, 'open' | 'actions'>, UseRangePositionResponse { variant: PickerVariant; fieldType: FieldType; @@ -125,8 +112,9 @@ export interface UseEnrichedRangePickerFieldPropsParams< currentView?: TView | null; initialView?: TView; onViewChange?: (view: TView) => void; - startFieldRef: React.RefObject>; - endFieldRef: React.RefObject>; + startFieldRef: React.RefObject>; + endFieldRef: React.RefObject>; + singleInputFieldRef: React.RefObject>; } const useMultiInputFieldSlotProps = < @@ -159,12 +147,7 @@ const useMultiInputFieldSlotProps = < TEnableAccessibleFieldDOMStructure, TError >) => { - type ReturnType = BaseMultiInputFieldProps< - PickerRangeValue, - RangeFieldSection, - TEnableAccessibleFieldDOMStructure, - TError - >; + type ReturnType = BaseMultiInputFieldProps; const translations = usePickerTranslations(); const handleStartFieldRef = useForkRef(fieldProps.unstableStartFieldRef, startFieldRef); @@ -322,8 +305,7 @@ const useSingleInputFieldSlotProps = < onBlur, rangePosition, onRangePositionChange, - startFieldRef, - endFieldRef, + singleInputFieldRef, pickerSlots, pickerSlotProps, fieldProps, @@ -337,40 +319,39 @@ const useSingleInputFieldSlotProps = < >) => { type ReturnType = BaseSingleInputFieldProps< PickerRangeValue, - RangeFieldSection, TEnableAccessibleFieldDOMStructure, TError >; - const handleFieldRef = useForkRef(fieldProps.unstableFieldRef, startFieldRef, endFieldRef); + const handleFieldRef = useForkRef(fieldProps.unstableFieldRef, singleInputFieldRef); React.useEffect(() => { - if (!open || !startFieldRef.current || variant === 'mobile') { + if (!open || !singleInputFieldRef.current || variant === 'mobile') { return; } - if (startFieldRef.current.isFieldFocused()) { + if (singleInputFieldRef.current.isFieldFocused()) { return; } // bring back focus to the field with the current view section selected if (currentView) { - const sections = startFieldRef.current.getSections().map((section) => section.type); + const sections = singleInputFieldRef.current.getSections().map((section) => section.type); const newSelectedSection = rangePosition === 'start' ? sections.indexOf(currentView) : sections.lastIndexOf(currentView); - startFieldRef.current?.focusField(newSelectedSection); + singleInputFieldRef.current?.focusField(newSelectedSection); } - }, [rangePosition, open, currentView, startFieldRef, variant]); + }, [rangePosition, open, currentView, singleInputFieldRef, variant]); const updateRangePosition = () => { - if (!startFieldRef.current?.isFieldFocused()) { + if (!singleInputFieldRef.current?.isFieldFocused()) { return; } - const sections = startFieldRef.current.getSections(); - const activeSectionIndex = startFieldRef.current?.getActiveSectionIndex(); + const sections = singleInputFieldRef.current.getSections(); + const activeSectionIndex = singleInputFieldRef.current?.getActiveSectionIndex(); const domRangePosition = activeSectionIndex == null || activeSectionIndex < sections.length / 2 ? 'start' : 'end'; diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useMobileRangePicker/useMobileRangePicker.tsx b/packages/x-date-pickers-pro/src/internals/hooks/useMobileRangePicker/useMobileRangePicker.tsx index fecc321ac037a..32b4ac1dab036 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useMobileRangePicker/useMobileRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/internals/hooks/useMobileRangePicker/useMobileRangePicker.tsx @@ -10,6 +10,7 @@ import { ExportedBaseTabsProps, PickerProvider, PickerRangeValue, + PickerValue, } from '@mui/x-date-pickers/internals'; import { usePickerTranslations } from '@mui/x-date-pickers/hooks'; import { FieldRef, InferError } from '@mui/x-date-pickers/models'; @@ -24,7 +25,6 @@ import { useEnrichedRangePickerFieldProps, } from '../useEnrichedRangePickerFieldProps'; import { getReleaseInfo } from '../../utils/releaseInfo'; -import { RangeFieldSection } from '../../../models'; import { useRangePosition } from '../useRangePosition'; const releaseInfo = getReleaseInfo(); @@ -64,17 +64,27 @@ export const useMobileRangePicker = < localeText, } = props; - const startFieldRef = React.useRef>(null); - const endFieldRef = React.useRef>(null); + const startFieldRef = React.useRef>(null); + const endFieldRef = React.useRef>(null); + const singleInputFieldRef = React.useRef>(null); const fieldType = (slots.field as any).fieldType ?? 'multi-input'; const { rangePosition, onRangePositionChange } = useRangePosition( props, - fieldType === 'single-input' ? startFieldRef : undefined, + fieldType === 'single-input' ? singleInputFieldRef : undefined, ); const labelId = useId(); const contextTranslations = usePickerTranslations(); + let fieldRef: React.Ref | FieldRef>; + if (fieldType === 'single-input') { + fieldRef = singleInputFieldRef; + } else if (rangePosition === 'start') { + fieldRef = startFieldRef; + } else { + fieldRef = endFieldRef; + } + const { open, actions, @@ -83,18 +93,12 @@ export const useMobileRangePicker = < renderCurrentView, fieldProps: pickerFieldProps, ownerState, - } = usePicker< - PickerRangeValue, - TView, - RangeFieldSection, - TExternalProps, - MobileRangePickerAdditionalViewProps - >({ + } = usePicker({ ...pickerParams, props, variant: 'mobile', autoFocusView: true, - fieldRef: rangePosition === 'start' ? startFieldRef : endFieldRef, + fieldRef, localeText, additionalViewProps: { rangePosition, @@ -155,6 +159,7 @@ export const useMobileRangePicker = < fieldProps, startFieldRef, endFieldRef, + singleInputFieldRef, }); const slotPropsForLayout: PickersLayoutSlotProps = { diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputFieldSelectedSections.ts b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputFieldSelectedSections.ts index 68e10d651b1a5..b5fb7e3f74f05 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputFieldSelectedSections.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputFieldSelectedSections.ts @@ -1,23 +1,26 @@ import * as React from 'react'; import useForkRef from '@mui/utils/useForkRef'; import useEventCallback from '@mui/utils/useEventCallback'; -import { UseFieldInternalProps } from '@mui/x-date-pickers/internals'; +import { + PickerRangeValue, + PickerValue, + UseFieldInternalProps, +} from '@mui/x-date-pickers/internals'; import { FieldRef, FieldSelectedSections } from '@mui/x-date-pickers/models'; -import { RangeFieldSection } from '../../models'; interface UseMultiInputFieldSelectedSectionsParams extends Pick< - UseFieldInternalProps, + UseFieldInternalProps, 'selectedSections' | 'onSelectedSectionsChange' > { - unstableStartFieldRef?: React.Ref>; - unstableEndFieldRef?: React.Ref>; + unstableStartFieldRef?: React.Ref>; + unstableEndFieldRef?: React.Ref>; } export const useMultiInputFieldSelectedSections = ( params: UseMultiInputFieldSelectedSectionsParams, ) => { - const unstableEndFieldRef = React.useRef>(null); + const unstableEndFieldRef = React.useRef>(null); const handleUnstableEndFieldRef = useForkRef(params.unstableEndFieldRef, unstableEndFieldRef); const [startSelectedSection, setStartSelectedSection] = React.useState( diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateRangeField.ts b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateRangeField.ts index 651ebdbd216c0..081fbf140f0ee 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateRangeField.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateRangeField.ts @@ -4,12 +4,13 @@ import { FieldChangeHandler, FieldChangeHandlerContext, PickerRangeValue, + PickerValue, UseFieldResponse, useControlledValueWithTimezone, useDefaultizedDateField, } from '@mui/x-date-pickers/internals'; import { useValidation } from '@mui/x-date-pickers/validation'; -import { DateValidationError, PickerValidDate } from '@mui/x-date-pickers/models'; +import { DateValidationError } from '@mui/x-date-pickers/models'; import { UseMultiInputDateRangeFieldParams, UseMultiInputDateRangeFieldProps, @@ -77,7 +78,7 @@ export const useMultiInputDateRangeField = < // TODO: Maybe export utility from `useField` instead of copy/pasting the logic const buildChangeHandler = ( index: 0 | 1, - ): FieldChangeHandler => { + ): FieldChangeHandler => { return (newDate, rawContext) => { const newDateRange: PickerRangeValue = index === 0 ? [newDate, value[1]] : [value[0], newDate]; diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.ts b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.ts index 021ef4f196b11..3a006da7c913b 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputDateTimeRangeField.ts @@ -4,11 +4,12 @@ import { FieldChangeHandler, FieldChangeHandlerContext, PickerRangeValue, + PickerValue, UseFieldResponse, useControlledValueWithTimezone, useDefaultizedDateTimeField, } from '@mui/x-date-pickers/internals'; -import { DateTimeValidationError, PickerValidDate } from '@mui/x-date-pickers/models'; +import { DateTimeValidationError } from '@mui/x-date-pickers/models'; import { useValidation } from '@mui/x-date-pickers/validation'; import type { UseMultiInputDateTimeRangeFieldParams, @@ -77,7 +78,7 @@ export const useMultiInputDateTimeRangeField = < // TODO: Maybe export utility from `useField` instead of copy/pasting the logic const buildChangeHandler = ( index: 0 | 1, - ): FieldChangeHandler => { + ): FieldChangeHandler => { return (newDate, rawContext) => { const newDateRange: PickerRangeValue = index === 0 ? [newDate, value[1]] : [value[0], newDate]; diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.ts b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.ts index 6b9d4c42313f0..9f8b36291f5fe 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/useMultiInputRangeField/useMultiInputTimeRangeField.ts @@ -4,12 +4,13 @@ import { FieldChangeHandler, FieldChangeHandlerContext, PickerRangeValue, + PickerValue, UseFieldResponse, useControlledValueWithTimezone, useDefaultizedTimeField, } from '@mui/x-date-pickers/internals'; import { useValidation } from '@mui/x-date-pickers/validation'; -import { PickerValidDate, TimeValidationError } from '@mui/x-date-pickers/models'; +import { TimeValidationError } from '@mui/x-date-pickers/models'; import { validateTimeRange } from '../../../validation'; import { TimeRangeValidationError } from '../../../models'; import type { @@ -77,7 +78,7 @@ export const useMultiInputTimeRangeField = < // TODO: Maybe export utility from `useField` instead of copy/pasting the logic const buildChangeHandler = ( index: 0 | 1, - ): FieldChangeHandler => { + ): FieldChangeHandler => { return (newDate, rawContext) => { const newDateRange: PickerRangeValue = index === 0 ? [newDate, value[1]] : [value[0], newDate]; diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useRangePosition.ts b/packages/x-date-pickers-pro/src/internals/hooks/useRangePosition.ts index c5029471e4e88..4b71d9e2ecb74 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useRangePosition.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/useRangePosition.ts @@ -2,7 +2,8 @@ import * as React from 'react'; import useControlled from '@mui/utils/useControlled'; import useEventCallback from '@mui/utils/useEventCallback'; import { FieldRef } from '@mui/x-date-pickers/models'; -import { RangePosition, RangeFieldSection } from '../../models'; +import { PickerRangeValue } from '@mui/x-date-pickers/internals'; +import { RangePosition } from '../../models'; export interface UseRangePositionProps { /** @@ -30,7 +31,7 @@ export interface UseRangePositionResponse { export const useRangePosition = ( props: UseRangePositionProps, - singleInputFieldRef?: React.RefObject>, + singleInputFieldRef?: React.RefObject>, ): UseRangePositionResponse => { const [rangePosition, setRangePosition] = useControlled({ name: 'useRangePosition', diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.tsx b/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.tsx index 43b7b168f4931..c37b8aa219039 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.tsx +++ b/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.tsx @@ -14,7 +14,6 @@ import { UseStaticRangePickerParams, UseStaticRangePickerProps, } from './useStaticRangePicker.types'; -import { RangeFieldSection } from '../../../models'; import { useRangePosition } from '../useRangePosition'; const PickerStaticLayout = styled(PickersLayout)(({ theme }) => ({ @@ -42,7 +41,6 @@ export const useStaticRangePicker = < const { layoutProps, providerProps, renderCurrentView } = usePicker< PickerRangeValue, TView, - RangeFieldSection, TExternalProps, {} >({ diff --git a/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.types.ts b/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.types.ts index ebe5fcbf95d18..b4c62b6437d0a 100644 --- a/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.types.ts +++ b/packages/x-date-pickers-pro/src/internals/hooks/useStaticRangePicker/useStaticRangePicker.types.ts @@ -11,7 +11,6 @@ import { ExportedPickersLayoutSlots, ExportedPickersLayoutSlotProps, } from '@mui/x-date-pickers/PickersLayout'; -import { RangeFieldSection } from '../../../models'; import { UseRangePositionProps } from '../useRangePosition'; export interface UseStaticRangePickerSlots @@ -46,7 +45,7 @@ export interface UseStaticRangePickerParams< TView extends DateOrTimeViewWithMeridiem, TExternalProps extends UseStaticRangePickerProps, > extends Pick< - UsePickerParams, + UsePickerParams, 'valueManager' | 'valueType' | 'validator' > { props: TExternalProps; diff --git a/packages/x-date-pickers-pro/src/internals/models/dateTimeRange.ts b/packages/x-date-pickers-pro/src/internals/models/dateTimeRange.ts index efcd335df3534..dddac7c0a86bc 100644 --- a/packages/x-date-pickers-pro/src/internals/models/dateTimeRange.ts +++ b/packages/x-date-pickers-pro/src/internals/models/dateTimeRange.ts @@ -5,11 +5,7 @@ import { AmPmProps, PickerRangeValue, } from '@mui/x-date-pickers/internals'; -import { - DateTimeRangeValidationError, - RangeFieldSection, - RangeFieldSeparatorProps, -} from '../../models'; +import { DateTimeRangeValidationError, RangeFieldSeparatorProps } from '../../models'; import { ExportedValidateDateTimeRangeProps } from '../../validation/validateDateTimeRange'; export interface UseDateTimeRangeFieldProps @@ -17,7 +13,6 @@ export interface UseDateTimeRangeFieldProps, diff --git a/packages/x-date-pickers-pro/src/internals/models/fields.ts b/packages/x-date-pickers-pro/src/internals/models/fields.ts index 79a498efbd54f..016c83a7d8dc4 100644 --- a/packages/x-date-pickers-pro/src/internals/models/fields.ts +++ b/packages/x-date-pickers-pro/src/internals/models/fields.ts @@ -1,8 +1,8 @@ import { SxProps } from '@mui/material/styles'; import { SlotComponentProps } from '@mui/utils'; import { MakeRequired } from '@mui/x-internals/types'; -import { UseFieldInternalProps } from '@mui/x-date-pickers/internals'; -import { FieldSection } from '@mui/x-date-pickers/models'; +import { PickerRangeValue, UseFieldInternalProps } from '@mui/x-date-pickers/internals'; +import { FieldOwnerState } from '@mui/x-date-pickers/models'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import type { MultiInputFieldRefs, @@ -16,13 +16,11 @@ import type { * Only contains what the MUI components are passing to the field, not what users can pass using the `props.slotProps.field`. */ export interface BaseMultiInputFieldProps< - TValue, - TSection extends FieldSection, TEnableAccessibleFieldDOMStructure extends boolean, TError, > extends MakeRequired< Pick< - UseFieldInternalProps, + UseFieldInternalProps, | 'readOnly' | 'disabled' | 'format' @@ -47,15 +45,11 @@ export interface BaseMultiInputFieldProps< textField?: React.ElementType; }; slotProps?: { - root?: SlotComponentProps< - React.ElementType, - {}, - Record - >; + root?: SlotComponentProps, {}, FieldOwnerState>; textField?: SlotComponentProps< typeof PickersTextField, {}, - { position?: RangePosition } & Record + FieldOwnerState & { position?: RangePosition } >; }; } diff --git a/packages/x-date-pickers-pro/src/internals/models/timeRange.ts b/packages/x-date-pickers-pro/src/internals/models/timeRange.ts index 129069c9df565..171ad2c8c7cdb 100644 --- a/packages/x-date-pickers-pro/src/internals/models/timeRange.ts +++ b/packages/x-date-pickers-pro/src/internals/models/timeRange.ts @@ -1,10 +1,6 @@ import { MakeOptional } from '@mui/x-internals/types'; import { UseFieldInternalProps, AmPmProps, PickerRangeValue } from '@mui/x-date-pickers/internals'; -import { - TimeRangeValidationError, - RangeFieldSection, - RangeFieldSeparatorProps, -} from '../../models'; +import { TimeRangeValidationError, RangeFieldSeparatorProps } from '../../models'; import type { ExportedValidateTimeRangeProps } from '../../validation/validateTimeRange'; export interface UseTimeRangeFieldProps @@ -12,7 +8,6 @@ export interface UseTimeRangeFieldProps, diff --git a/packages/x-date-pickers-pro/src/internals/utils/date-fields-utils.ts b/packages/x-date-pickers-pro/src/internals/utils/date-fields-utils.ts index 9210c310244de..51000b91b1e8e 100644 --- a/packages/x-date-pickers-pro/src/internals/utils/date-fields-utils.ts +++ b/packages/x-date-pickers-pro/src/internals/utils/date-fields-utils.ts @@ -1,8 +1,8 @@ -import { RangeFieldSection } from '../../models'; +import { FieldRangeSection } from '@mui/x-date-pickers/internals'; -export const splitDateRangeSections = (sections: RangeFieldSection[]) => { - const startDateSections: RangeFieldSection[] = []; - const endDateSections: RangeFieldSection[] = []; +export const splitDateRangeSections = (sections: FieldRangeSection[]) => { + const startDateSections: FieldRangeSection[] = []; + const endDateSections: FieldRangeSection[] = []; sections.forEach((section) => { if (section.dateName === 'start') { startDateSections.push(section); @@ -14,7 +14,7 @@ export const splitDateRangeSections = (sections: RangeFieldSection[]) => { return { startDate: startDateSections, endDate: endDateSections }; }; -export const removeLastSeparator = (dateSections: RangeFieldSection[]) => +export const removeLastSeparator = (dateSections: FieldRangeSection[]) => dateSections.map((section, sectionIndex) => { if (sectionIndex === dateSections.length - 1) { return { ...section, separator: null }; 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 f3f8200c67958..59009cfebe630 100644 --- a/packages/x-date-pickers-pro/src/internals/utils/valueManagers.ts +++ b/packages/x-date-pickers-pro/src/internals/utils/valueManagers.ts @@ -8,6 +8,8 @@ import { getTodayDate, getDefaultReferenceDate, PickerRangeValue, + PickerNonNullableRangeValue, + FieldRangeSection, } from '@mui/x-date-pickers/internals'; import { PickerValidDate } from '@mui/x-date-pickers/models'; import { splitDateRangeSections, removeLastSeparator } from './date-fields-utils'; @@ -15,17 +17,15 @@ import type { DateRangeValidationError, DateTimeRangeValidationError, TimeRangeValidationError, - RangeFieldSection, RangePosition, } from '../../models'; -export type RangePickerValueManager< - TValue = [any, any], +type RangePickerValueManager< TError extends | DateRangeValidationError | TimeRangeValidationError | DateTimeRangeValidationError = any, -> = PickerValueManager; +> = PickerValueManager; export const rangeValueManager: RangePickerValueManager = { emptyValue: [null, null], @@ -38,14 +38,14 @@ export const rangeValueManager: RangePickerValueManager = { const shouldKeepEndDate = value[1] != null && params.utils.isValid(value[1]); if (shouldKeepStartDate && shouldKeepEndDate) { - return value; + return value as PickerNonNullableRangeValue; } const referenceDate = referenceDateProp ?? getDefaultReferenceDate(params); return [ - shouldKeepStartDate ? value[0] : referenceDate, - shouldKeepEndDate ? value[1] : referenceDate, + shouldKeepStartDate ? value[0]! : referenceDate, + shouldKeepEndDate ? value[1]! : referenceDate, ]; }, cleanValue: (utils, value) => @@ -77,7 +77,7 @@ export const getRangeFieldValueManager = ({ dateSeparator = '–', }: { dateSeparator: string | undefined; -}): FieldValueManager => ({ +}): FieldValueManager => ({ updateReferenceValue: (utils, value, prevReferenceValue) => { const shouldKeepStartDate = value[0] != null && utils.isValid(value[0]); const shouldKeepEndDate = value[1] != null && utils.isValid(value[1]); @@ -87,14 +87,14 @@ export const getRangeFieldValueManager = ({ } if (shouldKeepStartDate && shouldKeepEndDate) { - return value; + return value as PickerNonNullableRangeValue; } if (shouldKeepStartDate) { - return [value[0], prevReferenceValue[0]]; + return [value[0]!, prevReferenceValue[0]!]; } - return [prevReferenceValue[1], value[1]]; + return [prevReferenceValue[1]!, value[1]!]; }, getSectionsFromValue: (utils, [start, end], fallbackSections, getSectionsFromDate) => { const separatedFallbackSections = @@ -104,7 +104,7 @@ export const getRangeFieldValueManager = ({ const getSections = ( newDate: PickerValidDate | null, - fallbackDateSections: RangeFieldSection[] | null, + fallbackDateSections: FieldRangeSection[] | null, position: RangePosition, ) => { const shouldReUsePrevDateSections = !utils.isValid(newDate) && !!fallbackDateSections; @@ -167,7 +167,9 @@ export const getRangeFieldValueManager = ({ const index = activeSection.dateName === 'start' ? 0 : 1; const updateDateInRange = (newDate: PickerValidDate | null, prevDateRange: PickerRangeValue) => - (index === 0 ? [newDate, prevDateRange[1]] : [prevDateRange[0], newDate]) as PickerRangeValue; + (index === 0 + ? [newDate, prevDateRange[1]] + : [prevDateRange[0], newDate]) as PickerNonNullableRangeValue; return { date: state.value[index], diff --git a/packages/x-date-pickers-pro/src/models/dateRange.ts b/packages/x-date-pickers-pro/src/models/dateRange.ts index 88511e4c0e6a5..0e29e30990cc1 100644 --- a/packages/x-date-pickers-pro/src/models/dateRange.ts +++ b/packages/x-date-pickers-pro/src/models/dateRange.ts @@ -1,6 +1,6 @@ import { MakeOptional } from '@mui/x-internals/types'; -import { UseFieldInternalProps, PickerRangeValue } from '@mui/x-date-pickers/internals'; -import { RangeFieldSection, RangeFieldSeparatorProps } from './fields'; +import { PickerRangeValue, UseFieldInternalProps } from '@mui/x-date-pickers/internals'; +import { RangeFieldSeparatorProps } from './fields'; import { DateRangeValidationError } from './validation'; import type { ExportedValidateDateRangeProps } from '../validation/validateDateRange'; @@ -9,7 +9,6 @@ export interface UseDateRangeFieldProps, diff --git a/packages/x-date-pickers-pro/src/models/fields.ts b/packages/x-date-pickers-pro/src/models/fields.ts index 09c12ac543076..648dc4c4f277a 100644 --- a/packages/x-date-pickers-pro/src/models/fields.ts +++ b/packages/x-date-pickers-pro/src/models/fields.ts @@ -1,12 +1,14 @@ import * as React from 'react'; -import { UseFieldResponse, FormProps } from '@mui/x-date-pickers/internals'; -import { FieldRef, FieldSection, PickerFieldSlotProps } from '@mui/x-date-pickers/models'; +import { + UseFieldResponse, + FormProps, + PickerValue, + PickerRangeValue, +} from '@mui/x-date-pickers/internals'; +import { FieldRef, PickerFieldSlotProps } from '@mui/x-date-pickers/models'; import { UseClearableFieldResponse } from '@mui/x-date-pickers/hooks'; -import { RangePosition } from './range'; -export interface RangeFieldSection extends FieldSection { - dateName: RangePosition; -} +export type { FieldRangeSection } from '@mui/x-date-pickers/internals'; export type FieldType = 'single-input' | 'multi-input'; @@ -35,8 +37,8 @@ export interface MultiInputFieldSlotRootProps { } export interface MultiInputFieldRefs { - unstableStartFieldRef?: React.Ref>; - unstableEndFieldRef?: React.Ref>; + unstableStartFieldRef?: React.Ref>; + unstableEndFieldRef?: React.Ref>; } export interface RangeFieldSeparatorProps { @@ -50,12 +52,9 @@ export interface RangeFieldSeparatorProps { /** * Props the `slotProps.field` of a range picker component can receive. */ -export type PickerRangeFieldSlotProps< - TValue, - TSection extends FieldSection, - TEnableAccessibleFieldDOMStructure extends boolean, -> = PickerFieldSlotProps & - RangeFieldSeparatorProps; +export type PickerRangeFieldSlotProps = + PickerFieldSlotProps & + RangeFieldSeparatorProps; /** * Props the text field receives when used with a multi input picker. diff --git a/packages/x-date-pickers-pro/src/models/index.ts b/packages/x-date-pickers-pro/src/models/index.ts index f97efb2767d14..f3b7d852521cc 100644 --- a/packages/x-date-pickers-pro/src/models/index.ts +++ b/packages/x-date-pickers-pro/src/models/index.ts @@ -3,3 +3,5 @@ export * from './fields'; export * from './range'; export * from './validation'; export * from './multiInputRangeFieldClasses'; + +export type { RangePosition } from '@mui/x-date-pickers/internals'; diff --git a/packages/x-date-pickers-pro/src/models/range.ts b/packages/x-date-pickers-pro/src/models/range.ts index d0a4b4de2b1df..1dc74741d76b7 100644 --- a/packages/x-date-pickers-pro/src/models/range.ts +++ b/packages/x-date-pickers-pro/src/models/range.ts @@ -5,5 +5,3 @@ export type DateRange = [TDate | null, TDate | nu // TODO v8: Remove export type NonEmptyDateRange = [PickerValidDate, PickerValidDate]; - -export type RangePosition = 'start' | 'end'; diff --git a/packages/x-date-pickers/package.json b/packages/x-date-pickers/package.json index 8683eaf1569d1..781289be2a723 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": "8.0.0-alpha.1", + "version": "8.0.0-alpha.3", "description": "The community edition of the Date and Time Picker components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -98,13 +98,13 @@ } }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", - "@mui/material": "^5.16.7", - "@mui/system": "^5.16.7", + "@mui/internal-test-utils": "^1.0.22", + "@mui/material": "^5.16.9", + "@mui/system": "^5.16.8", "@types/luxon": "^3.4.2", "@types/moment-hijri": "^2.1.4", "@types/moment-jalaali": "^0.7.9", - "@types/prop-types": "^15.7.13", + "@types/prop-types": "^15.7.14", "date-fns": "^2.30.0", "date-fns-jalali": "^2.30.0-0", "dayjs": "^1.11.13", diff --git a/packages/x-date-pickers/src/AdapterMoment/AdapterMoment.ts b/packages/x-date-pickers/src/AdapterMoment/AdapterMoment.ts index e92f7c9a06fed..3201691862e98 100644 --- a/packages/x-date-pickers/src/AdapterMoment/AdapterMoment.ts +++ b/packages/x-date-pickers/src/AdapterMoment/AdapterMoment.ts @@ -522,6 +522,7 @@ export class AdapterMoment implements MuiPickersAdapter { let count = 0; let current = start; + let currentDayOfYear = current.get('dayOfYear'); const nestedWeeks: Moment[][] = []; while (current.isBefore(end)) { @@ -529,7 +530,17 @@ export class AdapterMoment implements MuiPickersAdapter { nestedWeeks[weekNumber] = nestedWeeks[weekNumber] || []; nestedWeeks[weekNumber].push(current); + const prevDayOfYear = currentDayOfYear; current = this.addDays(current, 1); + currentDayOfYear = current.get('dayOfYear'); + + // If there is a TZ change at midnight, adding 1 day may only increase the date by 23 hours to 11pm + // To fix, bump the date into the next day (add 12 hours) and then revert to the start of the day + // See https://github.com/moment/moment/issues/4743#issuecomment-811306874 for context. + if (prevDayOfYear === currentDayOfYear) { + current = current.add(12, 'h').startOf('day'); + } + count += 1; } diff --git a/packages/x-date-pickers/src/DateCalendar/DateCalendar.types.ts b/packages/x-date-pickers/src/DateCalendar/DateCalendar.types.ts index a068987b9bb4c..022149cfdc804 100644 --- a/packages/x-date-pickers/src/DateCalendar/DateCalendar.types.ts +++ b/packages/x-date-pickers/src/DateCalendar/DateCalendar.types.ts @@ -26,6 +26,7 @@ import { } from '../MonthCalendar/MonthCalendar.types'; import { ExportedValidateDateProps } from '../validation/validateDate'; import { FormProps } from '../internals/models/formProps'; +import { PickerValue } from '../internals/models'; export interface DateCalendarSlots extends PickersCalendarHeaderSlots, @@ -80,7 +81,7 @@ export interface ExportedDateCalendarProps export interface DateCalendarProps extends ExportedDateCalendarProps, - ExportedUseViewsOptions { + ExportedUseViewsOptions { /** * The selected value. * Used when the component is controlled. diff --git a/packages/x-date-pickers/src/DateCalendar/PickersFadeTransitionGroup.tsx b/packages/x-date-pickers/src/DateCalendar/PickersFadeTransitionGroup.tsx index 584a245ad0157..0ed043db403f2 100644 --- a/packages/x-date-pickers/src/DateCalendar/PickersFadeTransitionGroup.tsx +++ b/packages/x-date-pickers/src/DateCalendar/PickersFadeTransitionGroup.tsx @@ -20,8 +20,7 @@ export interface PickersFadeTransitionGroupProps { classes?: Partial; } -const useUtilityClasses = (ownerState: PickersFadeTransitionGroupProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], }; @@ -43,9 +42,10 @@ const PickersFadeTransitionGroupRoot = styled(TransitionGroup, { */ export function PickersFadeTransitionGroup(inProps: PickersFadeTransitionGroupProps) { const props = useThemeProps({ props: inProps, name: 'MuiPickersFadeTransitionGroup' }); - const { children, className, reduceAnimations, transKey } = props; - const classes = useUtilityClasses(props); + const { children, className, reduceAnimations, transKey, classes: classesProp } = props; + const classes = useUtilityClasses(classesProp); const theme = useTheme(); + if (reduceAnimations) { return children; } diff --git a/packages/x-date-pickers/src/DateCalendar/PickersSlideTransition.tsx b/packages/x-date-pickers/src/DateCalendar/PickersSlideTransition.tsx index e560306b50331..537edecb63f58 100644 --- a/packages/x-date-pickers/src/DateCalendar/PickersSlideTransition.tsx +++ b/packages/x-date-pickers/src/DateCalendar/PickersSlideTransition.tsx @@ -10,8 +10,15 @@ import { pickersSlideTransitionClasses, PickersSlideTransitionClasses, } from './pickersSlideTransitionClasses'; +import { PickerOwnerState } from '../models/pickers'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; export type SlideDirection = 'right' | 'left'; + +interface PickerSlideTransitionOwnerState extends PickerOwnerState { + slideDirection: SlideDirection; +} + export interface ExportedSlideTransitionProps { /** * Override or extend the styles applied to the component. @@ -28,8 +35,12 @@ export interface SlideTransitionProps transKey: React.Key; } -const useUtilityClasses = (ownerState: SlideTransitionProps) => { - const { classes, slideDirection } = ownerState; +const useUtilityClasses = ( + classes: Partial | undefined, + ownerState: PickerSlideTransitionOwnerState, +) => { + const { slideDirection } = ownerState; + const slots = { root: ['root'], exit: ['slideExit'], @@ -117,11 +128,13 @@ export function PickersSlideTransition(inProps: SlideTransitionProps) { reduceAnimations, slideDirection, transKey, - // extracting `classes` from `other` - classes: providedClasses, + classes: classesProp, ...other } = props; - const classes = useUtilityClasses(props); + + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const ownerState = { ...pickerOwnerState, slideDirection }; + const classes = useUtilityClasses(classesProp, ownerState); const theme = useTheme(); if (reduceAnimations) { return
{children}
; 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 10df9befa2faf..0993722c40b47 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 @@ -3,6 +3,7 @@ import { expect } from 'chai'; import { fireEvent, screen } 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 { PickerValue } from '@mui/x-date-pickers/internals'; import { adapterToUse, createPickerRenderer, @@ -30,7 +31,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants'], })); - describeValue(DateCalendar, () => ({ + describeValue(DateCalendar, () => ({ render, componentFamily: 'calendar', values: [adapterToUse.date('2018-01-01'), adapterToUse.date('2018-01-02')], 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 a8624667be44a..ab26ec9edab80 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 @@ -20,7 +20,7 @@ describe(' - Timezone', () => { fireEvent.click(screen.getByRole('gridcell', { name: '25' })); const expectedDate = adapter.setDate(adapter.date(undefined, 'default'), 25); - // Check the `onChange` value (uses default timezone, e.g: UTC, see TZ env variable) + // Check the `onChange` value (uses default timezone, for example: UTC, see TZ env variable) const actualDate = onChange.lastCall.firstArg; // On dayjs, we are not able to know if a date is UTC because it's the system timezone or because it was created as UTC. @@ -72,6 +72,12 @@ describe(' - Timezone', () => { ).to.equal(30); }); + // See https://github.com/mui/mui-x/issues/14730 + it('should not render duplicate days when leaving DST in America/Asuncion', () => { + render(); + expect(screen.getAllByRole('gridcell', { name: '5' })).to.have.length(1); + }); + TIMEZONE_TO_TEST.forEach((timezone) => { describe(`Timezone: ${timezone}`, () => { it('should use timezone prop for onChange when no value is provided', () => { diff --git a/packages/x-date-pickers/src/DateCalendar/useCalendarState.tsx b/packages/x-date-pickers/src/DateCalendar/useCalendarState.tsx index 0fca874dbcb0d..a22917a0ecebd 100644 --- a/packages/x-date-pickers/src/DateCalendar/useCalendarState.tsx +++ b/packages/x-date-pickers/src/DateCalendar/useCalendarState.tsx @@ -106,10 +106,9 @@ export const createCalendarStateReducer = } }; -interface UseCalendarStateParams +interface UseCalendarStateParameters extends Pick< DateCalendarDefaultizedProps, - | 'value' | 'referenceDate' | 'disableFuture' | 'disablePast' @@ -119,11 +118,27 @@ interface UseCalendarStateParams | 'reduceAnimations' | 'shouldDisableDate' > { + value: PickerValidDate | null; disableSwitchToMonthOnDayFocus?: boolean; timezone: PickersTimezone; } -export const useCalendarState = (params: UseCalendarStateParams) => { +interface UseCalendarStateReturnValue { + referenceDate: PickerValidDate; + calendarState: CalendarState; + changeMonth: (newDate: PickerValidDate) => void; + changeFocusedDay: ( + newFocusedDate: PickerValidDate | null, + withoutMonthSwitchingAnimation?: boolean, + ) => void; + isDateDisabled: (day: PickerValidDate | null) => boolean; + onMonthSwitchingAnimationEnd: () => void; + handleChangeMonth: (payload: ChangeMonthPayload) => void; +} + +export const useCalendarState = ( + params: UseCalendarStateParameters, +): UseCalendarStateReturnValue => { const { value, referenceDate: referenceDateProp, @@ -144,7 +159,7 @@ export const useCalendarState = (params: UseCalendarStateParams) => { createCalendarStateReducer(Boolean(reduceAnimations), disableSwitchToMonthOnDayFocus, utils), ).current; - const referenceDate = React.useMemo( + const referenceDate = React.useMemo( () => { return singleItemValueManager.getInitialReferenceValue({ value, diff --git a/packages/x-date-pickers/src/DateField/DateField.tsx b/packages/x-date-pickers/src/DateField/DateField.tsx index 0a79fa946a2f9..2d8704ab33107 100644 --- a/packages/x-date-pickers/src/DateField/DateField.tsx +++ b/packages/x-date-pickers/src/DateField/DateField.tsx @@ -10,6 +10,7 @@ import { useDateField } from './useDateField'; import { useClearableField } from '../hooks'; import { PickersTextField } from '../PickersTextField'; import { convertFieldResponseIntoMuiTextFieldProps } from '../internals/utils/convertFieldResponseIntoMuiTextFieldProps'; +import { useFieldOwnerState } from '../internals/hooks/useFieldOwnerState'; type DateFieldComponent = (( props: DateFieldProps & React.RefAttributes, @@ -35,7 +36,7 @@ const DateField = React.forwardRef(function DateField< const { slots, slotProps, InputProps, inputProps, ...other } = themeProps; - const ownerState = themeProps; + const ownerState = useFieldOwnerState(themeProps); const TextField = slots?.textField ?? @@ -290,10 +291,10 @@ DateField.propTypes = { */ shouldDisableYear: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers/src/DateField/DateField.types.ts b/packages/x-date-pickers/src/DateField/DateField.types.ts index 3a7c21470f5b8..7226c4ac65791 100644 --- a/packages/x-date-pickers/src/DateField/DateField.types.ts +++ b/packages/x-date-pickers/src/DateField/DateField.types.ts @@ -1,29 +1,20 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import { MakeOptional } from '@mui/x-internals/types'; -import TextField from '@mui/material/TextField'; +import type { TextFieldProps } from '@mui/material/TextField'; +import { MakeOptional, SlotComponentPropsFromProps } from '@mui/x-internals/types'; import { ExportedUseClearableFieldProps, UseClearableFieldSlots, UseClearableFieldSlotProps, } from '../hooks/useClearableField'; -import { - DateValidationError, - FieldSection, - PickerValidDate, - BuiltInFieldTextFieldProps, -} from '../models'; +import { DateValidationError, BuiltInFieldTextFieldProps, FieldOwnerState } from '../models'; import { UseFieldInternalProps } from '../internals/hooks/useField'; import { ExportedValidateDateProps } from '../validation/validateDate'; +import { PickersTextFieldProps } from '../PickersTextField'; +import { PickerValue } from '../internals/models'; export interface UseDateFieldProps extends MakeOptional< - UseFieldInternalProps< - PickerValidDate | null, - FieldSection, - TEnableAccessibleFieldDOMStructure, - DateValidationError - >, + UseFieldInternalProps, 'format' >, ExportedValidateDateProps, @@ -46,7 +37,7 @@ export type DateFieldProps; + slotProps?: DateFieldSlotProps; }; export type DateFieldOwnerState = @@ -55,16 +46,15 @@ export type DateFieldOwnerState, or from '@mui/material' if `enableAccessibleFieldDOMStructure` is `false`. */ textField?: React.ElementType; } -export interface DateFieldSlotProps - extends UseClearableFieldSlotProps { - textField?: SlotComponentProps< - typeof TextField, +export interface DateFieldSlotProps extends UseClearableFieldSlotProps { + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - DateFieldOwnerState + FieldOwnerState >; } diff --git a/packages/x-date-pickers/src/DateField/tests/describes.DateField.test.tsx b/packages/x-date-pickers/src/DateField/tests/describes.DateField.test.tsx index 6f7090a606a61..c1441c9e3f0ea 100644 --- a/packages/x-date-pickers/src/DateField/tests/describes.DateField.test.tsx +++ b/packages/x-date-pickers/src/DateField/tests/describes.DateField.test.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { DateField } from '@mui/x-date-pickers/DateField'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { createPickerRenderer, expectFieldValueV7, @@ -30,7 +31,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants', 'themeStyleOverrides'], })); - describeValue(DateField, () => ({ + describeValue(DateField, () => ({ render, componentFamily: 'field', values: [adapterToUse.date('2018-01-01'), adapterToUse.date('2018-01-02')], diff --git a/packages/x-date-pickers/src/DateField/useDateField.ts b/packages/x-date-pickers/src/DateField/useDateField.ts index c5f7e8da62100..42d7b01fe3a82 100644 --- a/packages/x-date-pickers/src/DateField/useDateField.ts +++ b/packages/x-date-pickers/src/DateField/useDateField.ts @@ -7,8 +7,8 @@ import { useField } from '../internals/hooks/useField'; import { UseDateFieldProps } from './DateField.types'; import { validateDate } from '../validation'; import { useSplitFieldProps } from '../hooks'; -import { FieldSection, PickerValidDate } from '../models'; import { useDefaultizedDateField } from '../internals/hooks/defaultizedFieldProps'; +import { PickerValue } from '../internals/models'; export const useDateField = < TEnableAccessibleFieldDOMStructure extends boolean, @@ -24,8 +24,7 @@ export const useDateField = < const { forwardedProps, internalProps } = useSplitFieldProps(props, 'date'); return useField< - PickerValidDate | null, - FieldSection, + PickerValue, TEnableAccessibleFieldDOMStructure, typeof forwardedProps, typeof internalProps diff --git a/packages/x-date-pickers/src/DatePicker/DatePicker.types.ts b/packages/x-date-pickers/src/DatePicker/DatePicker.types.ts index 6ea627c4a5ebc..bbccb00651e43 100644 --- a/packages/x-date-pickers/src/DatePicker/DatePicker.types.ts +++ b/packages/x-date-pickers/src/DatePicker/DatePicker.types.ts @@ -3,13 +3,13 @@ import { DesktopDatePickerSlots, DesktopDatePickerSlotProps, } from '../DesktopDatePicker'; -import { BaseSingleInputFieldProps } from '../internals/models'; +import { BaseSingleInputFieldProps, PickerValue } from '../internals/models'; import { MobileDatePickerProps, MobileDatePickerSlots, MobileDatePickerSlotProps, } from '../MobileDatePicker'; -import { DateValidationError, FieldSection, PickerValidDate } from '../models'; +import { DateValidationError } from '../models'; import { ValidateDateProps } from '../validation/validateDate'; export interface DatePickerSlots extends DesktopDatePickerSlots, MobileDatePickerSlots {} @@ -49,9 +49,4 @@ export interface DatePickerProps = ValidateDateProps & - BaseSingleInputFieldProps< - PickerValidDate | null, - FieldSection, - TEnableAccessibleFieldDOMStructure, - DateValidationError - >; + BaseSingleInputFieldProps; diff --git a/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx b/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx index 3da4d4fbec578..bfcde2a512468 100644 --- a/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx +++ b/packages/x-date-pickers/src/DatePicker/DatePickerToolbar.tsx @@ -9,15 +9,20 @@ import { PickersToolbar } from '../internals/components/PickersToolbar'; import { usePickerTranslations } from '../hooks/usePickerTranslations'; import { useUtils } from '../internals/hooks/useUtils'; import { BaseToolbarProps, ExportedBaseToolbarProps } from '../internals/models/props/toolbar'; -import { DateView, PickerValidDate } from '../models'; +import { DateView } from '../models'; import { DatePickerToolbarClasses, getDatePickerToolbarUtilityClass, } from './datePickerToolbarClasses'; import { resolveDateFormat } from '../internals/utils/date-utils'; +import { PickerValue } from '../internals/models'; +import { + PickerToolbarOwnerState, + useToolbarOwnerState, +} from '../internals/hooks/useToolbarOwnerState'; export interface DatePickerToolbarProps - extends BaseToolbarProps, + extends BaseToolbarProps, ExportedDatePickerToolbarProps {} export interface ExportedDatePickerToolbarProps extends ExportedBaseToolbarProps { @@ -27,8 +32,7 @@ export interface ExportedDatePickerToolbarProps extends ExportedBaseToolbarProps classes?: Partial; } -const useUtilityClasses = (ownerState: DatePickerToolbarProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], title: ['title'], @@ -47,10 +51,10 @@ const DatePickerToolbarTitle = styled(Typography, { name: 'MuiDatePickerToolbar', slot: 'Title', overridesResolver: (_, styles) => styles.title, -})<{ ownerState: DatePickerToolbarProps }>({ +})<{ ownerState: PickerToolbarOwnerState }>({ variants: [ { - props: { isLandscape: true }, + props: { pickerOrientation: 'landscape' }, style: { margin: 'auto 16px auto auto', }, @@ -85,13 +89,15 @@ export const DatePickerToolbar = React.forwardRef(function DatePickerToolbar( toolbarPlaceholder = '––', views, className, + classes: classesProp, onViewChange, view, ...other } = props; const utils = useUtils(); const translations = usePickerTranslations(); - const classes = useUtilityClasses(props); + const ownerState = useToolbarOwnerState(); + const classes = useUtilityClasses(classesProp); const dateText = React.useMemo(() => { if (!value) { @@ -103,8 +109,6 @@ export const DatePickerToolbar = React.forwardRef(function DatePickerToolbar( return utils.formatByString(value, formatFromViews); }, [value, toolbarFormat, toolbarPlaceholder, utils, views]); - const ownerState = props; - return ( = PickerViewRendererLookup< - PickerValidDate | null, - TView, - DateViewRendererProps, - TAdditionalProps ->; +> = PickerViewRendererLookup, TAdditionalProps>; export interface BaseDatePickerProps - extends BasePickerInputProps, + extends BasePickerInputProps, ExportedDateCalendarProps { /** * Overridable component slots. diff --git a/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx b/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx index 20002236886fe..876e25f77ed4c 100644 --- a/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx +++ b/packages/x-date-pickers/src/DateTimeField/DateTimeField.tsx @@ -10,6 +10,7 @@ import { useDateTimeField } from './useDateTimeField'; import { useClearableField } from '../hooks'; import { PickersTextField } from '../PickersTextField'; import { convertFieldResponseIntoMuiTextFieldProps } from '../internals/utils/convertFieldResponseIntoMuiTextFieldProps'; +import { useFieldOwnerState } from '../internals/hooks/useFieldOwnerState'; type DateTimeFieldComponent = (( props: DateTimeFieldProps & @@ -39,7 +40,7 @@ const DateTimeField = React.forwardRef(function DateTimeField< const { slots, slotProps, InputProps, inputProps, ...other } = themeProps; - const ownerState = themeProps; + const ownerState = useFieldOwnerState(themeProps); const TextField = slots?.textField ?? @@ -334,10 +335,10 @@ DateTimeField.propTypes = { */ shouldDisableYear: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers/src/DateTimeField/DateTimeField.types.ts b/packages/x-date-pickers/src/DateTimeField/DateTimeField.types.ts index b306ed6dbd2b9..2c3964472c396 100644 --- a/packages/x-date-pickers/src/DateTimeField/DateTimeField.types.ts +++ b/packages/x-date-pickers/src/DateTimeField/DateTimeField.types.ts @@ -1,13 +1,7 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import { MakeOptional } from '@mui/x-internals/types'; -import TextField from '@mui/material/TextField'; -import { - DateTimeValidationError, - FieldSection, - PickerValidDate, - BuiltInFieldTextFieldProps, -} from '../models'; +import { MakeOptional, SlotComponentPropsFromProps } from '@mui/x-internals/types'; +import { TextFieldProps } from '@mui/material/TextField'; +import { DateTimeValidationError, BuiltInFieldTextFieldProps, FieldOwnerState } from '../models'; import { UseFieldInternalProps } from '../internals/hooks/useField'; import { ExportedUseClearableFieldProps, @@ -16,12 +10,13 @@ import { } from '../hooks/useClearableField'; import { ExportedValidateDateTimeProps } from '../validation/validateDateTime'; import { AmPmProps } from '../internals/models/props/time'; +import { PickerValue } from '../internals/models'; +import { PickersTextFieldProps } from '../PickersTextField'; export interface UseDateTimeFieldProps extends MakeOptional< UseFieldInternalProps< - PickerValidDate | null, - FieldSection, + PickerValue, TEnableAccessibleFieldDOMStructure, DateTimeValidationError >, @@ -48,25 +43,21 @@ export type DateTimeFieldProps; + slotProps?: DateTimeFieldSlotProps; }; -export type DateTimeFieldOwnerState = - DateTimeFieldProps; - export interface DateTimeFieldSlots extends UseClearableFieldSlots { /** * Form control with an input to render the value. - * @default TextField from '@mui/material' or PickersTextField if `enableAccessibleFieldDOMStructure` is `true`. + * @default , or from '@mui/material' if `enableAccessibleFieldDOMStructure` is `false`. */ textField?: React.ElementType; } -export interface DateTimeFieldSlotProps - extends UseClearableFieldSlotProps { - textField?: SlotComponentProps< - typeof TextField, +export interface DateTimeFieldSlotProps extends UseClearableFieldSlotProps { + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - DateTimeFieldOwnerState + FieldOwnerState >; } diff --git a/packages/x-date-pickers/src/DateTimeField/tests/describes.DateTimeField.test.tsx b/packages/x-date-pickers/src/DateTimeField/tests/describes.DateTimeField.test.tsx index f18c33dd44b23..a4de539e0e8e1 100644 --- a/packages/x-date-pickers/src/DateTimeField/tests/describes.DateTimeField.test.tsx +++ b/packages/x-date-pickers/src/DateTimeField/tests/describes.DateTimeField.test.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { DateTimeField } from '@mui/x-date-pickers/DateTimeField'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { adapterToUse, createPickerRenderer, @@ -30,7 +31,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants', 'themeStyleOverrides'], })); - describeValue(DateTimeField, () => ({ + describeValue(DateTimeField, () => ({ render, componentFamily: 'field', values: [adapterToUse.date('2018-01-01'), adapterToUse.date('2018-01-02')], 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 e746a264a4433..ad50563ba3d84 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 @@ -55,10 +55,10 @@ describe(' - Timezone', () => { const expectedDate = fillEmptyValue(view, 'default'); - // Check the rendered value (uses default timezone, e.g: UTC, see TZ env variable) + // Check the rendered value (uses default timezone, for example: UTC, see TZ env variable) expectFieldValueV7(view.getSectionsContainer(), '12/31/2022 23'); - // Check the `onChange` value (uses default timezone, e.g: UTC, see TZ env variable) + // Check the `onChange` value (uses default timezone, for example: UTC, see TZ env variable) const actualDate = onChange.lastCall.firstArg; // On dayjs, we are not able to know if a date is UTC because it's the system timezone or because it was created as UTC. diff --git a/packages/x-date-pickers/src/DateTimeField/useDateTimeField.ts b/packages/x-date-pickers/src/DateTimeField/useDateTimeField.ts index 33e215fd4c7db..bd3b0b585352b 100644 --- a/packages/x-date-pickers/src/DateTimeField/useDateTimeField.ts +++ b/packages/x-date-pickers/src/DateTimeField/useDateTimeField.ts @@ -7,8 +7,8 @@ import { useField } from '../internals/hooks/useField'; import { UseDateTimeFieldProps } from './DateTimeField.types'; import { validateDateTime } from '../validation'; import { useSplitFieldProps } from '../hooks'; -import { FieldSection, PickerValidDate } from '../models'; import { useDefaultizedDateTimeField } from '../internals/hooks/defaultizedFieldProps'; +import { PickerValue } from '../internals/models'; export const useDateTimeField = < TEnableAccessibleFieldDOMStructure extends boolean, @@ -24,8 +24,7 @@ export const useDateTimeField = < const { forwardedProps, internalProps } = useSplitFieldProps(props, 'date-time'); return useField< - PickerValidDate | null, - FieldSection, + PickerValue, TEnableAccessibleFieldDOMStructure, typeof forwardedProps, typeof internalProps diff --git a/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.types.ts b/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.types.ts index a461ac290f658..1013150e535b1 100644 --- a/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.types.ts +++ b/packages/x-date-pickers/src/DateTimePicker/DateTimePicker.types.ts @@ -3,13 +3,17 @@ import { DesktopDateTimePickerSlots, DesktopDateTimePickerSlotProps, } from '../DesktopDateTimePicker'; -import { BaseSingleInputFieldProps, DateOrTimeViewWithMeridiem } from '../internals/models'; +import { + BaseSingleInputFieldProps, + DateOrTimeViewWithMeridiem, + PickerValue, +} from '../internals/models'; import { MobileDateTimePickerProps, MobileDateTimePickerSlots, MobileDateTimePickerSlotProps, } from '../MobileDateTimePicker'; -import { DateTimeValidationError, FieldSection, PickerValidDate } from '../models'; +import { DateTimeValidationError } from '../models'; import { ValidateDateTimeProps } from '../validation'; import { ExportedYearCalendarProps } from '../YearCalendar/YearCalendar.types'; @@ -55,4 +59,4 @@ export interface DateTimePickerProps, or component). */ export type DateTimePickerFieldProps = ValidateDateTimeProps & - BaseSingleInputFieldProps; + BaseSingleInputFieldProps; diff --git a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx index ea833fccc8777..480365be10cfb 100644 --- a/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx +++ b/packages/x-date-pickers/src/DateTimePicker/DateTimePickerTabs.tsx @@ -15,6 +15,8 @@ import { } from './dateTimePickerTabsClasses'; import { BaseTabsProps, ExportedBaseTabsProps } from '../internals/models/props/tabs'; import { isDatePickerView } from '../internals/utils/date-utils'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; +import { PickerOwnerState } from '../models/pickers'; type TabValue = 'date' | 'time'; @@ -60,8 +62,7 @@ export interface DateTimePickerTabsProps extends ExportedDateTimePickerTabsProps, BaseTabsProps {} -const useUtilityClasses = (ownerState: DateTimePickerTabsProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], }; @@ -73,7 +74,7 @@ const DateTimePickerTabsRoot = styled(Tabs, { name: 'MuiDateTimePickerTabs', slot: 'Root', overridesResolver: (_, styles) => styles.root, -})<{ ownerState: DateTimePickerTabsProps }>(({ theme }) => ({ +})<{ ownerState: PickerOwnerState }>(({ theme }) => ({ boxShadow: `0 -1px 0 0 inset ${(theme.vars || theme).palette.divider}`, '&:last-child': { boxShadow: `0 1px 0 0 inset ${(theme.vars || theme).palette.divider}`, @@ -103,11 +104,13 @@ const DateTimePickerTabs = function DateTimePickerTabs(inProps: DateTimePickerTa view, hidden = typeof window === 'undefined' || window.innerHeight < 667, className, + classes: classesProp, sx, } = props; const translations = usePickerTranslations(); - const classes = useUtilityClasses(props); + const { ownerState } = usePickerPrivateContext(); + const classes = useUtilityClasses(classesProp); const handleChange = (event: React.SyntheticEvent, value: TabValue) => { onViewChange(tabToView(value)); @@ -119,7 +122,7 @@ const DateTimePickerTabs = function DateTimePickerTabs(inProps: DateTimePickerTa return ( , 'view'> { - toolbarVariant?: PickerVariant; + MakeOptional, 'view'> { /** * If provided, it will be used instead of `dateTimePickerToolbarTitle` from localization. */ @@ -45,20 +48,19 @@ export interface DateTimePickerToolbarProps ampmInClock?: boolean; } -interface DateTimePickerToolbarOwnerState extends DateTimePickerToolbarProps { - isRtl: boolean; -} - -const useUtilityClasses = (ownerState: DateTimePickerToolbarOwnerState) => { - const { classes, isLandscape, isRtl } = ownerState; +const useUtilityClasses = ( + classes: Partial | undefined, + ownerState: PickerToolbarOwnerState, +) => { + const { pickerOrientation, toolbarDirection } = ownerState; const slots = { root: ['root'], dateContainer: ['dateContainer'], - timeContainer: ['timeContainer', isRtl && 'timeLabelReverse'], - timeDigitsContainer: ['timeDigitsContainer', isRtl && 'timeLabelReverse'], + timeContainer: ['timeContainer', toolbarDirection === 'rtl' && 'timeLabelReverse'], + timeDigitsContainer: ['timeDigitsContainer', toolbarDirection === 'rtl' && 'timeLabelReverse'], separator: ['separator'], - ampmSelection: ['ampmSelection', isLandscape && 'ampmLandscape'], + ampmSelection: ['ampmSelection', pickerOrientation === 'landscape' && 'ampmLandscape'], ampmLabel: ['ampmLabel'], }; @@ -69,7 +71,8 @@ const DateTimePickerToolbarRoot = styled(PickersToolbar, { name: 'MuiDateTimePickerToolbar', slot: 'Root', overridesResolver: (props, styles) => styles.root, -})<{ ownerState: DateTimePickerToolbarOwnerState }>(({ theme }) => ({ + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'toolbarVariant', +})<{ ownerState: PickerToolbarOwnerState; toolbarVariant: PickerVariant }>(({ theme }) => ({ paddingLeft: 16, paddingRight: 16, justifyContent: 'space-around', @@ -86,13 +89,13 @@ const DateTimePickerToolbarRoot = styled(PickersToolbar, { }, }, { - props: { toolbarVariant: 'desktop', isLandscape: true }, + props: { toolbarVariant: 'desktop', pickerOrientation: 'landscape' }, style: { borderRight: `1px solid ${(theme.vars || theme).palette.divider}`, }, }, { - props: { toolbarVariant: 'desktop', isLandscape: false }, + props: { toolbarVariant: 'desktop', pickerOrientation: 'portrait' }, style: { paddingLeft: 24, paddingRight: 0, @@ -105,7 +108,7 @@ const DateTimePickerToolbarDateContainer = styled('div', { name: 'MuiDateTimePickerToolbar', slot: 'DateContainer', overridesResolver: (props, styles) => styles.dateContainer, -})<{ ownerState: DateTimePickerToolbarOwnerState }>({ +})<{ ownerState: PickerToolbarOwnerState }>({ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', @@ -115,18 +118,19 @@ const DateTimePickerToolbarTimeContainer = styled('div', { name: 'MuiDateTimePickerToolbar', slot: 'TimeContainer', overridesResolver: (props, styles) => styles.timeContainer, -})<{ ownerState: DateTimePickerToolbarOwnerState }>({ + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'toolbarVariant', +})<{ ownerState: PickerToolbarOwnerState; toolbarVariant: PickerVariant }>({ display: 'flex', flexDirection: 'row', variants: [ { - props: { isRtl: true }, + props: { toolbarDirection: 'rtl' }, style: { flexDirection: 'row-reverse', }, }, { - props: { toolbarVariant: 'desktop', isLandscape: false }, + props: { toolbarVariant: 'desktop', pickerOrientation: 'portrait' }, style: { gap: 9, marginRight: 4, @@ -134,15 +138,24 @@ const DateTimePickerToolbarTimeContainer = styled('div', { }, }, { - props: ({ isLandscape, toolbarVariant }: DateTimePickerToolbarOwnerState) => - isLandscape && toolbarVariant !== 'desktop', + props: ({ + pickerOrientation, + toolbarVariant, + }: PickerToolbarOwnerState & { toolbarVariant: PickerVariant }) => + pickerOrientation === 'landscape' && toolbarVariant !== 'desktop', style: { flexDirection: 'column', }, }, { - props: ({ isLandscape, toolbarVariant, isRtl }: DateTimePickerToolbarOwnerState) => - isLandscape && toolbarVariant !== 'desktop' && isRtl, + props: ({ + pickerOrientation, + toolbarVariant, + toolbarDirection, + }: PickerToolbarOwnerState & { toolbarVariant: PickerVariant }) => + pickerOrientation === 'landscape' && + toolbarVariant !== 'desktop' && + toolbarDirection === 'rtl', style: { flexDirection: 'column-reverse', }, @@ -154,11 +167,12 @@ const DateTimePickerToolbarTimeDigitsContainer = styled('div', { name: 'MuiDateTimePickerToolbar', slot: 'TimeDigitsContainer', overridesResolver: (props, styles) => styles.timeDigitsContainer, -})<{ ownerState: DateTimePickerToolbarOwnerState }>({ + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'toolbarVariant', +})<{ ownerState: PickerToolbarOwnerState; toolbarVariant: PickerVariant }>({ display: 'flex', variants: [ { - props: { isRtl: true }, + props: { toolbarDirection: 'rtl' }, style: { flexDirection: 'row-reverse', }, @@ -174,9 +188,8 @@ const DateTimePickerToolbarSeparator = styled(PickersToolbarText, { name: 'MuiDateTimePickerToolbar', slot: 'Separator', overridesResolver: (props, styles) => styles.separator, -})<{ - ownerState: DateTimePickerToolbarOwnerState; -}>({ + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'toolbarVariant', +})<{ ownerState: PickerToolbarOwnerState; toolbarVariant: PickerVariant }>({ margin: '0 4px 0 2px', cursor: 'default', variants: [ @@ -199,7 +212,7 @@ const DateTimePickerToolbarAmPmSelection = styled('div', { styles.ampmSelection, ], })<{ - ownerState: DateTimePickerToolbarProps; + ownerState: PickerToolbarOwnerState; }>({ display: 'flex', flexDirection: 'column', @@ -210,7 +223,7 @@ const DateTimePickerToolbarAmPmSelection = styled('div', { }, variants: [ { - props: { isLandscape: true }, + props: { pickerOrientation: 'landscape' }, style: { margin: '4px 0 auto', flexDirection: 'row', @@ -221,6 +234,12 @@ const DateTimePickerToolbarAmPmSelection = styled('div', { ], }); +/** + * If this context value is set to true, the toolbar will always be rendered in the desktop mode. + * This is used by the Date Time Range Picker Toolbar. + */ +export const DateTimePickerToolbarForceDesktopVariant = React.createContext(false); + /** * Demos: * @@ -244,23 +263,23 @@ function DateTimePickerToolbar(inProps: DateTimePickerToolbarProps) { toolbarFormat, toolbarPlaceholder = '––', views, - toolbarVariant = 'mobile', toolbarTitle: inToolbarTitle, className, + classes: classesProp, ...other } = props; - const isRtl = useRtl(); - const { disabled, readOnly } = usePickerContext(); - const ownerState: DateTimePickerToolbarOwnerState = { ...props, isRtl }; + const { disabled, readOnly, variant } = usePickerContext(); + const ownerState = useToolbarOwnerState(); + const classes = useUtilityClasses(classesProp, ownerState); const utils = useUtils(); const { meridiemMode, handleMeridiemChange } = useMeridiemMode(value, ampm, onChange); + const translations = usePickerTranslations(); + const forceDesktopVariant = React.useContext(DateTimePickerToolbarForceDesktopVariant); - const showAmPmControl = Boolean(ampm && !ampmInClock); + const toolbarVariant = forceDesktopVariant ? 'desktop' : variant; const isDesktop = toolbarVariant === 'desktop'; - - const translations = usePickerTranslations(); - const classes = useUtilityClasses(ownerState); + const showAmPmControl = Boolean(ampm && !ampmInClock); const toolbarTitle = inToolbarTitle ?? translations.dateTimePickerToolbarTitle; const formatHours = (time: PickerValidDate) => @@ -283,6 +302,7 @@ function DateTimePickerToolbar(inProps: DateTimePickerToolbarProps) { isLandscape={isLandscape} className={clsx(classes.root, className)} toolbarTitle={toolbarTitle} + toolbarVariant={toolbarVariant} {...other} ownerState={ownerState} > @@ -309,10 +329,15 @@ function DateTimePickerToolbar(inProps: DateTimePickerToolbarProps) { /> )} - + {views.includes('hours') && ( @@ -329,6 +354,7 @@ function DateTimePickerToolbar(inProps: DateTimePickerToolbarProps) { value=":" className={classes.separator} ownerState={ownerState} + toolbarVariant={toolbarVariant} /> = PickerViewRendererLookup< - PickerValidDate | null, + PickerValue, TView, Omit, 'slots' | 'slotProps'> & Omit< @@ -72,7 +72,7 @@ export type DateTimePickerViewRenderers< >; export interface BaseDateTimePickerProps - extends BasePickerInputProps, + extends BasePickerInputProps, Omit, ExportedBaseClockProps, ExportedValidateDateTimeProps { diff --git a/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx b/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx index 60ff3c131f085..43e847ab4348d 100644 --- a/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx +++ b/packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx @@ -26,8 +26,7 @@ export interface DayCalendarSkeletonProps extends HTMLDivProps { ref?: React.Ref; } -const useUtilityClasses = (ownerState: DayCalendarSkeletonProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], week: ['week'], @@ -59,14 +58,11 @@ const DayCalendarSkeletonDay = styled(Skeleton, { name: 'MuiDayCalendarSkeleton', slot: 'DaySkeleton', overridesResolver: (props, styles) => styles.daySkeleton, -})<{ ownerState: { day: number } }>({ +})({ margin: `0 ${DAY_MARGIN}px`, - variants: [ - { - props: { day: 0 }, - style: { visibility: 'hidden' }, - }, - ], + '&[data-day-in-month="0"]': { + visibility: 'hidden', + }, }); const monthMap = [ @@ -92,22 +88,22 @@ function DayCalendarSkeleton(inProps: DayCalendarSkeletonProps) { name: 'MuiDayCalendarSkeleton', }); - const { className, ...other } = props; + const { className, classes: classesProp, ...other } = props; - const classes = useUtilityClasses(other); + const classes = useUtilityClasses(classesProp); return ( {monthMap.map((week, index) => ( - {week.map((day, index2) => ( + {week.map((dayInMonth, index2) => ( ))} 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 3f8d4cabb0754..1c79140c48074 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 @@ -10,6 +10,7 @@ import { getFieldInputRoot, } from 'test/utils/pickers'; import { DesktopDatePicker } from '@mui/x-date-pickers/DesktopDatePicker'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -41,7 +42,7 @@ describe(' - Describes', () => { ], })); - describeValue(DesktopDatePicker, () => ({ + describeValue(DesktopDatePicker, () => ({ render, componentFamily: 'picker', type: 'date', diff --git a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx index a53946a0c3101..4f14a97c0548b 100644 --- a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx +++ b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePicker.tsx @@ -16,7 +16,7 @@ import { renderDateViewCalendar } from '../dateViewRenderers/dateViewRenderers'; import { usePickerTranslations } from '../hooks/usePickerTranslations'; import { useUtils } from '../internals/hooks/useUtils'; import { validateDateTime, extractValidationProps } from '../validation'; -import { DateOrTimeViewWithMeridiem } from '../internals/models'; +import { DateOrTimeViewWithMeridiem, PickerValue } from '../internals/models'; import { CalendarIcon } from '../icons'; import { UseDesktopPickerProps, useDesktopPicker } from '../internals/hooks/useDesktopPicker'; import { PickerViewsRendererProps } from '../internals/hooks/usePicker'; @@ -25,7 +25,7 @@ import { resolveTimeViewsResponse, } from '../internals/utils/date-time-utils'; import { PickersActionBarAction } from '../PickersActionBar'; -import { PickerOwnerState, PickerValidDate } from '../models'; +import { PickerOwnerState } from '../models'; import { renderDigitalClockTimeView, renderMultiSectionDigitalClockTimeView, @@ -51,14 +51,14 @@ const rendererInterceptor = function rendererInterceptor< inViewRenderers: DateTimePickerViewRenderers, popperView: TView, rendererProps: PickerViewsRendererProps< - PickerValidDate | null, + PickerValue, TView, DefaultizedProps< UseDesktopPickerProps< TView, TEnableAccessibleFieldDOMStructure, any, - UsePickerViewsProps + UsePickerViewsProps >, 'openTo' >, @@ -198,7 +198,6 @@ const DesktopDateTimePicker = React.forwardRef(function DesktopDateTimePicker< toolbar: { hidden: true, ampmInClock, - toolbarVariant: 'desktop', ...defaultizedProps.slotProps?.toolbar, }, tabs: { diff --git a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx index 6f4b75e7ecb88..27522e004e008 100644 --- a/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx +++ b/packages/x-date-pickers/src/DesktopDateTimePicker/DesktopDateTimePickerLayout.tsx @@ -11,8 +11,12 @@ import { } from '../PickersLayout'; import { DateOrTimeViewWithMeridiem } from '../internals/models/common'; import { usePickerContext } from '../hooks/usePickerContext'; +import { PickerValidValue } from '../internals/models'; -type DesktopDateTimePickerLayoutComponent = (( +type DesktopDateTimePickerLayoutComponent = (< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +>( props: PickersLayoutProps & React.RefAttributes, ) => React.JSX.Element) & { propTypes?: any }; @@ -20,7 +24,7 @@ type DesktopDateTimePickerLayoutComponent = ((props: PickersLayoutProps, ref: React.Ref) { const { toolbar, tabs, content, actionBar, shortcuts, ownerState } = usePickerLayout(props); @@ -97,7 +101,7 @@ DesktopDateTimePickerLayout.propTypes = { PropTypes.func, PropTypes.object, ]), - value: PropTypes.any, + value: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]), view: PropTypes.oneOf(['day', 'hours', 'meridiem', 'minutes', 'month', 'seconds', 'year']), views: PropTypes.arrayOf( PropTypes.oneOf(['day', 'hours', 'meridiem', 'minutes', 'month', 'seconds', 'year']).isRequired, 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 65f18f9d8090d..5d6ab646c7b95 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,3 +1,5 @@ +import * as React from 'react'; +import { expect } from 'chai'; import { fireEvent, screen } from '@mui/internal-test-utils'; import { createPickerRenderer, @@ -9,8 +11,7 @@ import { getFieldInputRoot, } from 'test/utils/pickers'; import { DesktopDateTimePicker } from '@mui/x-date-pickers/DesktopDateTimePicker'; -import { expect } from 'chai'; -import * as React from 'react'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -54,7 +55,7 @@ describe(' - Describes', () => { ], })); - describeValue(DesktopDateTimePicker, () => ({ + describeValue(DesktopDateTimePicker, () => ({ render, componentFamily: 'picker', type: 'date-time', 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 48d8a67aa0d27..700a92a4156ff 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 @@ -11,6 +11,7 @@ import { getFieldInputRoot, } from 'test/utils/pickers'; import { DesktopTimePicker } from '@mui/x-date-pickers/DesktopTimePicker'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -46,7 +47,7 @@ describe(' - Describes', () => { ], })); - describeValue(DesktopTimePicker, () => ({ + describeValue(DesktopTimePicker, () => ({ render, componentFamily: 'picker', type: 'time', diff --git a/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx b/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx index ed52313e052d6..2c84ac52c38af 100644 --- a/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx +++ b/packages/x-date-pickers/src/DigitalClock/DigitalClock.tsx @@ -13,18 +13,18 @@ import { usePickerTranslations } from '../hooks/usePickerTranslations'; import { useUtils, useNow } from '../internals/hooks/useUtils'; import { createIsAfterIgnoreDatePart } from '../internals/utils/time-utils'; import { PickerViewRoot } from '../internals/components/PickerViewRoot'; -import { getDigitalClockUtilityClass } from './digitalClockClasses'; -import { DigitalClockProps } from './DigitalClock.types'; +import { DigitalClockClasses, getDigitalClockUtilityClass } from './digitalClockClasses'; +import { DigitalClockOwnerState, DigitalClockProps } from './DigitalClock.types'; import { useViews } from '../internals/hooks/useViews'; -import { PickerValidDate, TimeView } from '../models'; +import { PickerValidDate } from '../models'; import { DIGITAL_CLOCK_VIEW_HEIGHT } from '../internals/constants/dimensions'; import { useControlledValueWithTimezone } from '../internals/hooks/useValueWithTimezone'; import { singleItemValueManager } from '../internals/utils/valueManagers'; import { useClockReferenceDate } from '../internals/hooks/useClockReferenceDate'; import { getFocusedListItemIndex } from '../internals/utils/utils'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; -const useUtilityClasses = (ownerState: DigitalClockProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], list: ['list'], @@ -38,7 +38,7 @@ const DigitalClockRoot = styled(PickerViewRoot, { name: 'MuiDigitalClock', slot: 'Root', overridesResolver: (props, styles) => styles.root, -})<{ ownerState: DigitalClockProps & { alreadyRendered: boolean } }>({ +})<{ ownerState: DigitalClockOwnerState }>({ overflowY: 'auto', width: '100%', '@media (prefers-reduced-motion: no-preference)': { @@ -47,7 +47,7 @@ const DigitalClockRoot = styled(PickerViewRoot, { maxHeight: DIGITAL_CLOCK_VIEW_HEIGHT, variants: [ { - props: { alreadyRendered: true }, + props: { hasDigitalClockAlreadyBeenRendered: true }, style: { '@media (prefers-reduced-motion: no-preference)': { scrollBehavior: 'smooth', @@ -146,6 +146,7 @@ export const DigitalClock = React.forwardRef(function DigitalClock( focusedView, onFocusedViewChange, className, + classes: classesProp, disabled, readOnly, views = ['hours'], @@ -171,18 +172,19 @@ export const DigitalClock = React.forwardRef(function DigitalClock( const translations = usePickerTranslations(); const now = useNow(timezone); - const ownerState = React.useMemo( - () => ({ ...props, alreadyRendered: !!containerRef.current }), - [props], - ); + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const ownerState: DigitalClockOwnerState = { + ...pickerOwnerState, + hasDigitalClockAlreadyBeenRendered: !!containerRef.current, + }; - const classes = useUtilityClasses(ownerState); + const classes = useUtilityClasses(classesProp); const ClockItem = slots?.digitalClockItem ?? DigitalClockItem; const clockItemProps = useSlotProps({ elementType: ClockItem, externalSlotProps: slotProps?.digitalClockItem, - ownerState: {}, + ownerState, className: classes.item, }); @@ -198,7 +200,7 @@ export const DigitalClock = React.forwardRef(function DigitalClock( handleRawValueChange(newValue, 'finish', 'hours'), ); - const { setValueAndGoToNextView } = useViews>({ + const { setValueAndGoToNextView } = useViews({ view: inView, views, openTo, diff --git a/packages/x-date-pickers/src/DigitalClock/DigitalClock.types.ts b/packages/x-date-pickers/src/DigitalClock/DigitalClock.types.ts index 926d926c3cf85..2e9768dc22a16 100644 --- a/packages/x-date-pickers/src/DigitalClock/DigitalClock.types.ts +++ b/packages/x-date-pickers/src/DigitalClock/DigitalClock.types.ts @@ -7,7 +7,7 @@ import { DigitalClockOnlyProps, ExportedBaseClockProps, } from '../internals/models/props/time'; -import { TimeView } from '../models'; +import { PickerOwnerState, TimeView } from '../models'; export interface ExportedDigitalClockProps extends ExportedBaseClockProps, DigitalClockOnlyProps {} @@ -20,7 +20,7 @@ export interface DigitalClockSlots { } export interface DigitalClockSlotProps { - digitalClockItem?: SlotComponentProps>; + digitalClockItem?: SlotComponentProps; } export interface DigitalClockProps @@ -46,3 +46,10 @@ export interface DigitalClockProps */ slotProps?: DigitalClockSlotProps; } + +export interface DigitalClockOwnerState extends PickerOwnerState { + /** + * `true` if this is not the initial render of the digital clock. + */ + hasDigitalClockAlreadyBeenRendered: boolean; +} 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 e5c35a2387efd..c4f5013abc991 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 @@ -10,6 +10,7 @@ import { formatFullTimeValue, } from 'test/utils/pickers'; import { DigitalClock, digitalClockClasses as classes } from '@mui/x-date-pickers/DigitalClock'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -32,7 +33,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants'], })); - describeValue(DigitalClock, () => ({ + describeValue(DigitalClock, () => ({ render, componentFamily: 'digital-clock', type: 'time', 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 88e23555c6337..c5c97cebbe818 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 @@ -29,7 +29,7 @@ describe(' - Timezone', () => { const expectedDate = adapter.setHours(adapter.date(), 8); - // Check the `onChange` value (uses default timezone, e.g: UTC, see TZ env variable) + // Check the `onChange` value (uses default timezone, for example: UTC, see TZ env variable) const actualDate = onChange.lastCall.firstArg; // On dayjs, we are not able to know if a date is UTC because it's the system timezone or because it was created as UTC. 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 4423b3276797e..2a75c950b93df 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 @@ -11,6 +11,7 @@ import { getFieldInputRoot, } from 'test/utils/pickers'; import { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -41,7 +42,7 @@ describe(' - Describes', () => { ], })); - describeValue(MobileDatePicker, () => ({ + describeValue(MobileDatePicker, () => ({ render, componentFamily: 'picker', type: 'date', 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 d504885dad82d..30ae63e192e42 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 @@ -12,6 +12,7 @@ import { getFieldInputRoot, } from 'test/utils/pickers'; import { MobileDateTimePicker } from '@mui/x-date-pickers/MobileDateTimePicker'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -46,7 +47,7 @@ describe(' - Describes', () => { ], })); - describeValue(MobileDateTimePicker, () => ({ + describeValue(MobileDateTimePicker, () => ({ render, componentFamily: 'picker', type: 'date-time', 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 34f8c027a14fb..5cff45ba0c9ce 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 @@ -13,6 +13,7 @@ import { getFieldInputRoot, } from 'test/utils/pickers'; import { MobileTimePicker } from '@mui/x-date-pickers/MobileTimePicker'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -47,7 +48,7 @@ describe(' - Describes', () => { ], })); - describeValue(MobileTimePicker, () => ({ + describeValue(MobileTimePicker, () => ({ render, componentFamily: 'picker', type: 'time', 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 6b13c8e125e9e..9f9a3a8d903bc 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 @@ -8,6 +8,7 @@ import { describeValue, } from 'test/utils/pickers'; import { MonthCalendar, monthCalendarClasses as classes } from '@mui/x-date-pickers/MonthCalendar'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -29,7 +30,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants'], })); - describeValue(MonthCalendar, () => ({ + describeValue(MonthCalendar, () => ({ render, componentFamily: 'calendar', values: [adapterToUse.date('2018-01-01'), adapterToUse.date('2018-02-01')], diff --git a/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx b/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx index 0ecf6f91c1aa1..4aec5fcfdda91 100644 --- a/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx +++ b/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClock.tsx @@ -13,22 +13,25 @@ import { useViews } from '../internals/hooks/useViews'; import type { PickerSelectionState } from '../internals/hooks/usePicker'; import { useMeridiemMode } from '../internals/hooks/date-helpers-hooks'; import { PickerViewRoot } from '../internals/components/PickerViewRoot'; -import { getMultiSectionDigitalClockUtilityClass } from './multiSectionDigitalClockClasses'; +import { + getMultiSectionDigitalClockUtilityClass, + MultiSectionDigitalClockClasses, +} from './multiSectionDigitalClockClasses'; import { MultiSectionDigitalClockSection } from './MultiSectionDigitalClockSection'; import { MultiSectionDigitalClockProps, MultiSectionDigitalClockViewProps, } from './MultiSectionDigitalClock.types'; import { getHourSectionOptions, getTimeSectionOptions } from './MultiSectionDigitalClock.utils'; -import { PickerValidDate, TimeStepOptions, TimeView } from '../models'; +import { PickerOwnerState, PickerValidDate, TimeStepOptions, TimeView } from '../models'; import { TimeViewWithMeridiem } from '../internals/models'; import { useControlledValueWithTimezone } from '../internals/hooks/useValueWithTimezone'; import { singleItemValueManager } from '../internals/utils/valueManagers'; import { useClockReferenceDate } from '../internals/hooks/useClockReferenceDate'; import { formatMeridiem } from '../internals/utils/date-utils'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; -const useUtilityClasses = (ownerState: MultiSectionDigitalClockProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], }; @@ -40,7 +43,7 @@ const MultiSectionDigitalClockRoot = styled(PickerViewRoot, { name: 'MuiMultiSectionDigitalClock', slot: 'Root', overridesResolver: (_, styles) => styles.root, -})<{ ownerState: MultiSectionDigitalClockProps }>(({ theme }) => ({ +})<{ ownerState: PickerOwnerState }>(({ theme }) => ({ display: 'flex', flexDirection: 'row', width: '100%', @@ -97,6 +100,7 @@ export const MultiSectionDigitalClock = React.forwardRef(function MultiSectionDi focusedView: inFocusedView, onFocusedViewChange, className, + classes: classesProp, disabled, readOnly, skipDisabled = false, @@ -154,10 +158,7 @@ export const MultiSectionDigitalClock = React.forwardRef(function MultiSectionDi return inViews.includes('meridiem') ? inViews : [...inViews, 'meridiem']; }, [ampm, inViews]); - const { view, setValueAndGoToNextView, focusedView } = useViews< - PickerValidDate | null, - TimeViewWithMeridiem - >({ + const { view, setValueAndGoToNextView, focusedView } = useViews({ view: inView, views, openTo, @@ -422,8 +423,8 @@ export const MultiSectionDigitalClock = React.forwardRef(function MultiSectionDi ); }, [views, buildViewProps]); - const ownerState = props; - const classes = useUtilityClasses(ownerState); + const { ownerState } = usePickerPrivateContext(); + const classes = useUtilityClasses(classesProp); return ( { - isDisabled?: (value: TValue) => boolean; - isSelected: (value: TValue) => boolean; - isFocused: (value: TValue) => boolean; +export interface MultiSectionDigitalClockOption { + isDisabled?: (value: TSectionValue) => boolean; + isSelected: (value: TSectionValue) => boolean; + isFocused: (value: TSectionValue) => boolean; label: string; - value: TValue; + value: TSectionValue; ariaLabel: string; } @@ -23,8 +23,8 @@ export interface ExportedMultiSectionDigitalClockProps extends ExportedBaseClockProps, MultiSectionDigitalClockOnlyProps {} -export interface MultiSectionDigitalClockViewProps - extends Pick, 'onChange' | 'items'> {} +export interface MultiSectionDigitalClockViewProps + extends Pick, 'onChange' | 'items'> {} export interface MultiSectionDigitalClockSlots { /** diff --git a/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClockSection.tsx b/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClockSection.tsx index 6f4861979f06a..e0dcf258b370e 100644 --- a/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClockSection.tsx +++ b/packages/x-date-pickers/src/MultiSectionDigitalClock/MultiSectionDigitalClockSection.tsx @@ -20,6 +20,9 @@ import { } from '../internals/constants/dimensions'; import { getFocusedListItemIndex } from '../internals/utils/utils'; import { FormProps } from '../internals/models/formProps'; +import { PickerOwnerState } from '../models/pickers'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; +import { MultiSectionDigitalClockClasses } from './multiSectionDigitalClockClasses'; export interface ExportedMultiSectionDigitalClockSectionProps { className?: string; @@ -28,19 +31,25 @@ export interface ExportedMultiSectionDigitalClockSectionProps { slotProps?: MultiSectionDigitalClockSlotProps; } -export interface MultiSectionDigitalClockSectionProps +export interface MultiSectionDigitalClockSectionProps extends FormProps, ExportedMultiSectionDigitalClockSectionProps { autoFocus?: boolean; - items: MultiSectionDigitalClockOption[]; - onChange: (value: TValue) => void; + items: MultiSectionDigitalClockOption[]; + onChange: (value: TSectionValue) => void; active?: boolean; skipDisabled?: boolean; role?: string; } -const useUtilityClasses = (ownerState: MultiSectionDigitalClockSectionProps) => { - const { classes } = ownerState; +interface MultiSectionDigitalClockSectionOwnerState extends PickerOwnerState { + /** + * `true` if this is not the initial render of the digital clock. + */ + hasDigitalClockAlreadyBeenRendered: boolean; +} + +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], item: ['item'], @@ -53,44 +62,42 @@ const MultiSectionDigitalClockSectionRoot = styled(MenuList, { name: 'MuiMultiSectionDigitalClockSection', slot: 'Root', overridesResolver: (_, styles) => styles.root, -})<{ ownerState: MultiSectionDigitalClockSectionProps & { alreadyRendered: boolean } }>( - ({ theme }) => ({ - maxHeight: DIGITAL_CLOCK_VIEW_HEIGHT, - width: 56, - padding: 0, - overflow: 'hidden', - '@media (prefers-reduced-motion: no-preference)': { - scrollBehavior: 'auto', - }, - '@media (pointer: fine)': { - '&:hover': { - overflowY: 'auto', - }, - }, - '@media (pointer: none), (pointer: coarse)': { +})<{ ownerState: MultiSectionDigitalClockSectionOwnerState }>(({ theme }) => ({ + maxHeight: DIGITAL_CLOCK_VIEW_HEIGHT, + width: 56, + padding: 0, + overflow: 'hidden', + '@media (prefers-reduced-motion: no-preference)': { + scrollBehavior: 'auto', + }, + '@media (pointer: fine)': { + '&:hover': { overflowY: 'auto', }, - '&:not(:first-of-type)': { - borderLeft: `1px solid ${(theme.vars || theme).palette.divider}`, - }, - '&::after': { - display: 'block', - content: '""', - // subtracting the height of one item, extra margin and borders to make sure the max height is correct - height: 'calc(100% - 40px - 6px)', - }, - variants: [ - { - props: { alreadyRendered: true }, - style: { - '@media (prefers-reduced-motion: no-preference)': { - scrollBehavior: 'smooth', - }, + }, + '@media (pointer: none), (pointer: coarse)': { + overflowY: 'auto', + }, + '&:not(:first-of-type)': { + borderLeft: `1px solid ${(theme.vars || theme).palette.divider}`, + }, + '&::after': { + display: 'block', + content: '""', + // subtracting the height of one item, extra margin and borders to make sure the max height is correct + height: 'calc(100% - 40px - 6px)', + }, + variants: [ + { + props: { hasDigitalClockAlreadyBeenRendered: true }, + style: { + '@media (prefers-reduced-motion: no-preference)': { + scrollBehavior: 'smooth', }, }, - ], - }), -); + }, + ], +})); const MultiSectionDigitalClockSectionItem = styled(MenuItem, { name: 'MuiMultiSectionDigitalClockSection', @@ -123,16 +130,17 @@ const MultiSectionDigitalClockSectionItem = styled(MenuItem, { }, })); -type MultiSectionDigitalClockSectionComponent = ( - props: MultiSectionDigitalClockSectionProps & React.RefAttributes, +type MultiSectionDigitalClockSectionComponent = ( + props: MultiSectionDigitalClockSectionProps & + React.RefAttributes, ) => React.JSX.Element & { propTypes?: any }; /** * @ignore - internal component. */ export const MultiSectionDigitalClockSection = React.forwardRef( - function MultiSectionDigitalClockSection( - inProps: MultiSectionDigitalClockSectionProps, + function MultiSectionDigitalClockSection( + inProps: MultiSectionDigitalClockSectionProps, ref: React.Ref, ) { const containerRef = React.useRef(null); @@ -148,6 +156,7 @@ export const MultiSectionDigitalClockSection = React.forwardRef( autoFocus, onChange, className, + classes: classesProp, disabled, readOnly, items, @@ -158,11 +167,13 @@ export const MultiSectionDigitalClockSection = React.forwardRef( ...other } = props; - const ownerState = React.useMemo( - () => ({ ...props, alreadyRendered: !!containerRef.current }), - [props], - ); - const classes = useUtilityClasses(ownerState); + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const ownerState: MultiSectionDigitalClockSectionOwnerState = { + ...pickerOwnerState, + hasDigitalClockAlreadyBeenRendered: !!containerRef.current, + }; + + const classes = useUtilityClasses(classesProp); const DigitalClockSectionItem = slots?.digitalClockSectionItem ?? MultiSectionDigitalClockSectionItem; 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 06c7858b913ed..3ab127d6bafa6 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 @@ -12,7 +12,7 @@ import { MultiSectionDigitalClock, multiSectionDigitalClockClasses as classes, } from '@mui/x-date-pickers/MultiSectionDigitalClock'; -import { formatMeridiem } from '@mui/x-date-pickers/internals'; +import { formatMeridiem, PickerValue } from '@mui/x-date-pickers/internals'; import { describeConformance } from 'test/utils/describeConformance'; describe(' - Describes', () => { @@ -35,7 +35,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants'], })); - describeValue(MultiSectionDigitalClock, () => ({ + describeValue(MultiSectionDigitalClock, () => ({ render, componentFamily: 'multi-section-digital-clock', type: 'time', diff --git a/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx b/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx index fc234d531ee84..54bd78c6dea02 100644 --- a/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx +++ b/packages/x-date-pickers/src/PickersActionBar/PickersActionBar.tsx @@ -1,6 +1,7 @@ 'use client'; import * as React from 'react'; import PropTypes from 'prop-types'; +import { styled } from '@mui/material/styles'; import Button from '@mui/material/Button'; import DialogActions, { DialogActionsProps } from '@mui/material/DialogActions'; import { usePickerTranslations } from '../hooks/usePickerTranslations'; @@ -20,6 +21,12 @@ export interface PickersActionBarProps extends DialogActionsProps { onSetToday: () => void; } +const PickersActionBarRoot = styled(DialogActions, { + name: 'MuiPickersLayout', + slot: 'ActionBar', + overridesResolver: (_, styles) => styles.actionBar, +})({}); + /** * Demos: * @@ -74,7 +81,7 @@ function PickersActionBar(props: PickersActionBarProps) { } }); - return {buttons}; + return {buttons}; } PickersActionBar.propTypes = { diff --git a/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx b/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx index a3e90e38d7b9f..f588e56a189ce 100644 --- a/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx +++ b/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx @@ -18,15 +18,14 @@ import { } from '../internals/hooks/date-helpers-hooks'; import { getPickersCalendarHeaderUtilityClass, + PickersCalendarHeaderClasses, pickersCalendarHeaderClasses, } from './pickersCalendarHeaderClasses'; -import { - PickersCalendarHeaderOwnerState, - PickersCalendarHeaderProps, -} from './PickersCalendarHeader.types'; +import { PickersCalendarHeaderProps } from './PickersCalendarHeader.types'; +import { PickerOwnerState } from '../models/pickers'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; -const useUtilityClasses = (ownerState: PickersCalendarHeaderOwnerState) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], labelContainer: ['labelContainer'], @@ -43,7 +42,7 @@ const PickersCalendarHeaderRoot = styled('div', { slot: 'Root', overridesResolver: (_, styles) => styles.root, })<{ - ownerState: PickersCalendarHeaderOwnerState; + ownerState: PickerOwnerState; }>({ display: 'flex', alignItems: 'center', @@ -61,7 +60,7 @@ const PickersCalendarHeaderLabelContainer = styled('div', { slot: 'LabelContainer', overridesResolver: (_, styles) => styles.labelContainer, })<{ - ownerState: PickersCalendarHeaderOwnerState; + ownerState: PickerOwnerState; }>(({ theme }) => ({ display: 'flex', overflow: 'hidden', @@ -77,7 +76,7 @@ const PickersCalendarHeaderLabel = styled('div', { slot: 'Label', overridesResolver: (_, styles) => styles.label, })<{ - ownerState: PickersCalendarHeaderOwnerState; + ownerState: PickerOwnerState; }>({ marginRight: 6, }); @@ -87,7 +86,7 @@ const PickersCalendarHeaderSwitchViewButton = styled(IconButton, { slot: 'SwitchViewButton', overridesResolver: (_, styles) => styles.switchViewButton, })<{ - ownerState: PickersCalendarHeaderOwnerState; + ownerState: PickerOwnerState; }>({ marginRight: 'auto', variants: [ @@ -107,7 +106,7 @@ const PickersCalendarHeaderSwitchViewIcon = styled(ArrowDropDownIcon, { slot: 'SwitchViewIcon', overridesResolver: (_, styles) => styles.switchViewIcon, })<{ - ownerState: PickersCalendarHeaderOwnerState; + ownerState: PickerOwnerState; }>(({ theme }) => ({ willChange: 'transform', transition: theme.transitions.create('transform'), @@ -154,14 +153,14 @@ const PickersCalendarHeader = React.forwardRef(function PickersCalendarHeader( views, labelId, className, + classes: classesProp, timezone, format = `${utils.formats.month} ${utils.formats.year}`, ...other } = props; - const ownerState = props; - - const classes = useUtilityClasses(props); + const { ownerState } = usePickerPrivateContext(); + const classes = useUtilityClasses(classesProp); const SwitchViewButton = slots?.switchViewButton ?? PickersCalendarHeaderSwitchViewButton; const switchViewButtonProps = useSlotProps({ diff --git a/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.types.ts b/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.types.ts index 0e058fe60e8db..ca35a59c5ce7f 100644 --- a/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.types.ts +++ b/packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.types.ts @@ -9,7 +9,7 @@ import { PickersArrowSwitcherSlotProps, } from '../internals/components/PickersArrowSwitcher'; import { MonthValidationOptions } from '../internals/hooks/date-helpers-hooks'; -import { PickerValidDate, DateView } from '../models'; +import { PickerValidDate, DateView, PickerOwnerState } from '../models'; import { SlideDirection } from '../DateCalendar/PickersSlideTransition'; import { PickersCalendarHeaderClasses } from './pickersCalendarHeaderClasses'; @@ -29,19 +29,17 @@ export interface PickersCalendarHeaderSlots extends PickersArrowSwitcherSlots { // We keep the interface to allow module augmentation export interface PickersCalendarHeaderSlotPropsOverrides {} -export type PickersCalendarHeaderOwnerState = PickersCalendarHeaderProps; - export interface PickersCalendarHeaderSlotProps extends PickersArrowSwitcherSlotProps { switchViewButton?: SlotComponentProps< typeof IconButton, PickersCalendarHeaderSlotPropsOverrides, - PickersCalendarHeaderOwnerState + PickerOwnerState >; switchViewIcon?: SlotComponentProps< typeof SvgIcon, PickersCalendarHeaderSlotPropsOverrides, - PickersCalendarHeaderOwnerState + PickerOwnerState >; } diff --git a/packages/x-date-pickers/src/PickersCalendarHeader/describes.PickersCalendarHeader.test.tsx b/packages/x-date-pickers/src/PickersCalendarHeader/describes.PickersCalendarHeader.test.tsx index 62aa5310d0e7e..fa4e02f6f325d 100644 --- a/packages/x-date-pickers/src/PickersCalendarHeader/describes.PickersCalendarHeader.test.tsx +++ b/packages/x-date-pickers/src/PickersCalendarHeader/describes.PickersCalendarHeader.test.tsx @@ -24,7 +24,12 @@ describe(' - Describes', () => { render, muiName: 'MuiPickersCalendarHeader', refInstanceof: window.HTMLDivElement, - skip: ['componentProp', 'componentsProp', 'themeVariants'], + skip: [ + 'componentProp', + 'componentsProp', + 'themeVariants', + 'slotPropsCallbackWithPropsAsOwnerState', + ], slots: { switchViewButton: { expectedClassName: pickersCalendarHeaderClasses.switchViewButton, diff --git a/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx b/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx index dcb977d1b3ab8..db7d88b6f2a71 100644 --- a/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx +++ b/packages/x-date-pickers/src/PickersLayout/PickersLayout.tsx @@ -11,7 +11,7 @@ import { PickersLayoutClasses, } from './pickersLayoutClasses'; import usePickerLayout from './usePickerLayout'; -import { DateOrTimeViewWithMeridiem } from '../internals/models'; +import { DateOrTimeViewWithMeridiem, PickerValidValue } from '../internals/models'; import { usePickerContext } from '../hooks/usePickerContext'; const useUtilityClasses = ( @@ -48,7 +48,7 @@ export const PickersLayoutRoot = styled('div', { }, }, { - props: { pickerOrientation: 'landscape', isRtl: true }, + props: { pickerOrientation: 'landscape', layoutDirection: 'rtl' }, style: { [`& .${pickersLayoutClasses.toolbar}`]: { gridColumn: 3, @@ -66,7 +66,7 @@ export const PickersLayoutRoot = styled('div', { }, }, { - props: { pickerOrientation: 'portrait', isRtl: true }, + props: { pickerOrientation: 'portrait', layoutDirection: 'rtl' }, style: { [`& .${pickersLayoutClasses.shortcuts}`]: { gridColumn: 3, @@ -87,7 +87,10 @@ export const PickersLayoutContentWrapper = styled('div', { flexDirection: 'column', }); -type PickersLayoutComponent = (( +type PickersLayoutComponent = (< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +>( props: PickersLayoutProps & React.RefAttributes, ) => React.JSX.Element) & { propTypes?: any }; @@ -101,7 +104,7 @@ type PickersLayoutComponent = ((inProps: PickersLayoutProps, ref: React.Ref) { const props = useThemeProps({ props: inProps, name: 'MuiPickersLayout' }); @@ -179,7 +182,7 @@ PickersLayout.propTypes = { PropTypes.func, PropTypes.object, ]), - value: PropTypes.any, + value: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]), view: PropTypes.oneOf(['day', 'hours', 'meridiem', 'minutes', 'month', 'seconds', 'year']), views: PropTypes.arrayOf( PropTypes.oneOf(['day', 'hours', 'meridiem', 'minutes', 'month', 'seconds', 'year']).isRequired, diff --git a/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts b/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts index bb2b12ba329b0..b6382d370840c 100644 --- a/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts +++ b/packages/x-date-pickers/src/PickersLayout/PickersLayout.types.ts @@ -12,10 +12,14 @@ import { PickersShortcuts, } from '../PickersShortcuts/PickersShortcuts'; import { PickerOwnerState } from '../models'; +import { PickerValidValue } from '../internals/models'; import { UsePickerViewsLayoutResponse } from '../internals/hooks/usePicker/usePickerViews'; import { UsePickerValueLayoutResponse } from '../internals/hooks/usePicker/usePickerValue.types'; -export interface ExportedPickersLayoutSlots { +export interface ExportedPickersLayoutSlots< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> { /** * Custom component for the action bar, it is placed below the picker views. * @default PickersActionBar @@ -36,14 +40,19 @@ export interface ExportedPickersLayoutSlots { +export interface ExportedPickersLayoutSlotProps< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> { /** * Props passed down to the action bar component. */ @@ -58,8 +67,10 @@ export interface ExportedPickersLayoutSlotProps>; } -export interface PickersLayoutSlots - extends ExportedPickersLayoutSlots { +export interface PickersLayoutSlots< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> extends ExportedPickersLayoutSlots { /** * Tabs enabling toggling between views. */ @@ -71,8 +82,10 @@ export interface PickersLayoutSlots>; } -export interface PickersLayoutSlotProps - extends ExportedPickersLayoutSlotProps { +export interface PickersLayoutSlotProps< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> extends ExportedPickersLayoutSlotProps { /** * Props passed down to the tabs component. */ @@ -83,10 +96,11 @@ export interface PickersLayoutSlotProps - extends UsePickerViewsLayoutResponse, - Omit, 'value'> { - value?: TValue; +export interface PickersLayoutProps< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> extends UsePickerViewsLayoutResponse, + UsePickerValueLayoutResponse { className?: string; children?: React.ReactNode; /** @@ -109,7 +123,7 @@ export interface PickersLayoutProps; } -export interface SubComponents { +export interface SubComponents { toolbar: React.ReactElement | null; content: React.ReactNode; tabs: React.ReactElement | null; diff --git a/packages/x-date-pickers/src/PickersLayout/usePickerLayout.tsx b/packages/x-date-pickers/src/PickersLayout/usePickerLayout.tsx index ae978ffe1a0ea..be4f6e3b5e95d 100644 --- a/packages/x-date-pickers/src/PickersLayout/usePickerLayout.tsx +++ b/packages/x-date-pickers/src/PickersLayout/usePickerLayout.tsx @@ -8,11 +8,11 @@ import { PickerLayoutOwnerState, PickersLayoutProps, SubComponents } from './Pic import { getPickersLayoutUtilityClass, PickersLayoutClasses } from './pickersLayoutClasses'; import { PickersShortcuts } from '../PickersShortcuts'; import { BaseToolbarProps } from '../internals/models/props/toolbar'; -import { DateOrTimeViewWithMeridiem } from '../internals/models'; +import { DateOrTimeViewWithMeridiem, PickerValidValue } from '../internals/models'; import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; import { usePickerContext } from '../hooks'; -function toolbarHasView( +function toolbarHasView( toolbarProps: BaseToolbarProps | any, ): toolbarProps is BaseToolbarProps { return toolbarProps.view !== null; @@ -36,16 +36,11 @@ const useUtilityClasses = ( return composeClasses(slots, getPickersLayoutUtilityClass, classes); }; -interface PickersLayoutPropsWithValueRequired - extends PickersLayoutProps { - value: TValue; -} - -interface UsePickerLayoutResponse extends SubComponents { +interface UsePickerLayoutResponse extends SubComponents { ownerState: PickerLayoutOwnerState; } -const usePickerLayout = ( +const usePickerLayout = ( props: PickersLayoutProps, ): UsePickerLayoutResponse => { const { ownerState: pickerOwnerState } = usePickerPrivateContext(); @@ -72,9 +67,12 @@ const usePickerLayout = ( // The true type should be // - For pickers value: PickerValidDate | null // - For range pickers value: [PickerValidDate | null, PickerValidDate | null] - } = props as PickersLayoutPropsWithValueRequired; + } = props; - const ownerState: PickerLayoutOwnerState = { ...pickerOwnerState, isRtl }; + const ownerState = React.useMemo( + () => ({ ...pickerOwnerState, layoutDirection: isRtl ? 'rtl' : 'ltr' }), + [pickerOwnerState, isRtl], + ); const classes = useUtilityClasses(classesProp, ownerState); // Action bar diff --git a/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx b/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx index b164341349a33..3f31edfc3ca64 100644 --- a/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx +++ b/packages/x-date-pickers/src/PickersShortcuts/PickersShortcuts.tsx @@ -1,16 +1,18 @@ 'use client'; import * as React from 'react'; +import { styled } from '@mui/material/styles'; import PropTypes from 'prop-types'; import List, { ListProps } from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import Chip from '@mui/material/Chip'; import { VIEW_HEIGHT } from '../internals/constants/dimensions'; +import { PickerValidValue } from '../internals/models'; -interface PickersShortcutsItemGetValueParams { +interface PickersShortcutsItemGetValueParams { isValid: (value: TValue) => boolean; } -export interface PickersShortcutsItem { +export interface PickersShortcutsItem { label: string; getValue: (params: PickersShortcutsItemGetValueParams) => TValue; /** @@ -20,11 +22,12 @@ export interface PickersShortcutsItem { id?: string; } -export type PickersShortcutsItemContext = Omit, 'getValue'>; +export type PickersShortcutsItemContext = Omit, 'getValue'>; export type PickerShortcutChangeImportance = 'set' | 'accept'; -export interface ExportedPickersShortcutProps extends Omit { +export interface ExportedPickersShortcutProps + extends Omit { /** * Ordered array of shortcuts to display. * If empty, does not display the shortcuts. @@ -40,7 +43,8 @@ export interface ExportedPickersShortcutProps extends Omit extends ExportedPickersShortcutProps { +export interface PickersShortcutsProps + extends ExportedPickersShortcutProps { isLandscape: boolean; onChange: ( newValue: TValue, @@ -50,6 +54,12 @@ export interface PickersShortcutsProps extends ExportedPickersShortcutPr isValid: (value: TValue) => boolean; } +const PickersShortcutsRoot = styled(List, { + name: 'MuiPickersLayout', + slot: 'Shortcuts', + overridesResolver: (_, styles) => styles.shortcuts, +})({}); + /** * Demos: * @@ -59,7 +69,7 @@ export interface PickersShortcutsProps extends ExportedPickersShortcutPr * * - [PickersShortcuts API](https://mui.com/x/api/date-pickers/pickers-shortcuts/) */ -function PickersShortcuts(props: PickersShortcutsProps) { +function PickersShortcuts(props: PickersShortcutsProps) { const { items, changeImportance = 'accept', isLandscape, onChange, isValid, ...other } = props; if (items == null || items.length === 0) { @@ -80,7 +90,7 @@ function PickersShortcuts(props: PickersShortcutsProps) { }); return ( - (props: PickersShortcutsProps) { ); })} - + ); } diff --git a/packages/x-date-pickers/src/TimeClock/Clock.tsx b/packages/x-date-pickers/src/TimeClock/Clock.tsx index 541a3b240c4d9..205fedacd5419 100644 --- a/packages/x-date-pickers/src/TimeClock/Clock.tsx +++ b/packages/x-date-pickers/src/TimeClock/Clock.tsx @@ -13,11 +13,12 @@ import { useUtils } from '../internals/hooks/useUtils'; import type { PickerSelectionState } from '../internals/hooks/usePicker'; import { useMeridiemMode } from '../internals/hooks/date-helpers-hooks'; import { CLOCK_HOUR_WIDTH, getHours, getMinutes } from './shared'; -import { PickerValidDate, TimeView } from '../models'; +import { PickerOwnerState, PickerValidDate, TimeView } from '../models'; import { ClockClasses, getClockUtilityClass } from './clockClasses'; import { formatMeridiem } from '../internals/utils/date-utils'; import { Meridiem } from '../internals/utils/time-utils'; import { FormProps } from '../internals/models/formProps'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; export interface ClockProps extends ReturnType, FormProps { ampm: boolean; @@ -45,16 +46,29 @@ export interface ClockProps extends ReturnType, FormProp classes?: Partial; } -const useUtilityClasses = (ownerState: ClockProps) => { - const { classes, meridiemMode } = ownerState; +interface ClockOwnerState extends PickerOwnerState { + /** + * `true` if the clock is disabled, `false` otherwise. + */ + isClockDisabled: boolean; + /** + * The current meridiem mode of the clock. + */ + clockMeridiemMode: Meridiem | null; +} + +const useUtilityClasses = ( + classes: Partial | undefined, + ownerState: ClockOwnerState, +) => { const slots = { root: ['root'], clock: ['clock'], wrapper: ['wrapper'], squareMask: ['squareMask'], pin: ['pin'], - amButton: ['amButton', meridiemMode === 'am' && 'selected'], - pmButton: ['pmButton', meridiemMode === 'pm' && 'selected'], + amButton: ['amButton', ownerState.clockMeridiemMode === 'am' && 'selected'], + pmButton: ['pmButton', ownerState.clockMeridiemMode === 'pm' && 'selected'], meridiemText: ['meridiemText'], }; @@ -96,15 +110,11 @@ const ClockWrapper = styled('div', { }, }); -type ClockSquareMaskOwnerState = { - disabled?: ClockProps['disabled']; -}; - const ClockSquareMask = styled('div', { name: 'MuiClock', slot: 'SquareMask', overridesResolver: (_, styles) => styles.squareMask, -})<{ ownerState: ClockSquareMaskOwnerState }>({ +})<{ ownerState: ClockOwnerState }>({ width: '100%', height: '100%', position: 'absolute', @@ -115,7 +125,7 @@ const ClockSquareMask = styled('div', { userSelect: 'none', variants: [ { - props: { disabled: false }, + props: { isClockDisabled: false }, style: { '@media (pointer: fine)': { cursor: 'pointer', @@ -168,7 +178,7 @@ const ClockAmButton = styled(IconButton, { name: 'MuiClock', slot: 'AmButton', overridesResolver: (_, styles) => styles.amButton, -})<{ ownerState: ClockProps }>(({ theme }) => ({ +})<{ ownerState: ClockOwnerState }>(({ theme }) => ({ ...meridiemButtonCommonStyles(theme, 'am'), // keeping it here to make TS happy position: 'absolute', @@ -179,7 +189,7 @@ const ClockPmButton = styled(IconButton, { name: 'MuiClock', slot: 'PmButton', overridesResolver: (_, styles) => styles.pmButton, -})<{ ownerState: ClockProps }>(({ theme }) => ({ +})<{ ownerState: ClockOwnerState }>(({ theme }) => ({ ...meridiemButtonCommonStyles(theme, 'pm'), // keeping it here to make TS happy position: 'absolute', @@ -218,14 +228,19 @@ export function Clock(inProps: ClockProps) { disabled = false, readOnly, className, + classes: classesProp, } = props; - const ownerState = props; - const utils = useUtils(); const translations = usePickerTranslations(); + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const ownerState: ClockOwnerState = { + ...pickerOwnerState, + isClockDisabled: disabled, + clockMeridiemMode: meridiemMode, + }; const isMoving = React.useRef(false); - const classes = useUtilityClasses(ownerState); + const classes = useUtilityClasses(classesProp, ownerState); const isSelectedTimeDisabled = isTimeDisabled(viewValue, type); const isPointerInner = !ampm && type === 'hours' && (viewValue < 1 || viewValue > 12); @@ -287,13 +302,7 @@ export function Clock(inProps: ClockProps) { setTime(event.nativeEvent, 'finish'); }; - const hasSelected = React.useMemo(() => { - if (type === 'hours') { - return true; - } - - return viewValue % 5 === 0; - }, [type, viewValue]); + const isPointerBetweenTwoClockValues = type === 'hours' ? false : viewValue % 5 !== 0; const keyboardControlStep = type === 'minutes' ? minutesStep : 1; @@ -359,7 +368,7 @@ export function Clock(inProps: ClockProps) { onTouchEnd={handleTouchEnd} onMouseUp={handleMouseUp} onMouseMove={handleMouseMove} - ownerState={{ disabled }} + ownerState={ownerState} className={classes.squareMask} /> {!isSelectedTimeDisabled && ( @@ -370,7 +379,7 @@ export function Clock(inProps: ClockProps) { type={type} viewValue={viewValue} isInner={isPointerInner} - hasSelected={hasSelected} + isBetweenTwoClockValues={isPointerBetweenTwoClockValues} /> )} diff --git a/packages/x-date-pickers/src/TimeClock/ClockNumber.tsx b/packages/x-date-pickers/src/TimeClock/ClockNumber.tsx index 0a85289d61cba..09fce50c23035 100644 --- a/packages/x-date-pickers/src/TimeClock/ClockNumber.tsx +++ b/packages/x-date-pickers/src/TimeClock/ClockNumber.tsx @@ -8,6 +8,8 @@ import { getClockNumberUtilityClass, clockNumberClasses, } from './clockNumberClasses'; +import { PickerOwnerState } from '../models/pickers'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; export interface ClockNumberProps extends React.HTMLAttributes { 'aria-label': string; @@ -23,10 +25,34 @@ export interface ClockNumberProps extends React.HTMLAttributes classes?: Partial; } -const useUtilityClasses = (ownerState: ClockNumberProps) => { - const { classes, selected, disabled } = ownerState; +interface ClockNumberOwnerState extends PickerOwnerState { + /** + * `true` if the clock number is in the inner clock ring. + * When used with meridiem, all the hours are in the outer ring. + * When used without meridiem, the hours from 1 to 12 are in the outer ring and the hours from 13 to 24 are in the inner ring. + * The minutes are always in the outer ring. + */ + isClockNumberInInnerRing: boolean; + /** + * `true` if the clock number is selected. + */ + isClockNumberSelected: boolean; + /** + * `true` if the clock number is disabled. + */ + isClockNumberDisabled: boolean; +} + +const useUtilityClasses = ( + classes: Partial | undefined, + ownerState: ClockNumberOwnerState, +) => { const slots = { - root: ['root', selected && 'selected', disabled && 'disabled'], + root: [ + 'root', + ownerState.isClockNumberSelected && 'selected', + ownerState.isClockNumberDisabled && 'disabled', + ], }; return composeClasses(slots, getClockNumberUtilityClass, classes); @@ -40,7 +66,7 @@ const ClockNumberRoot = styled('span', { { [`&.${clockNumberClasses.disabled}`]: styles.disabled }, { [`&.${clockNumberClasses.selected}`]: styles.selected }, ], -})<{ ownerState: ClockNumberProps }>(({ theme }) => ({ +})<{ ownerState: ClockNumberOwnerState }>(({ theme }) => ({ height: CLOCK_HOUR_WIDTH, width: CLOCK_HOUR_WIDTH, position: 'absolute', @@ -63,7 +89,7 @@ const ClockNumberRoot = styled('span', { }, variants: [ { - props: { inner: true }, + props: { isClockNumberInInnerRing: true }, style: { ...theme.typography.body2, color: (theme.vars || theme).palette.text.secondary, @@ -77,9 +103,25 @@ const ClockNumberRoot = styled('span', { */ export function ClockNumber(inProps: ClockNumberProps) { const props = useThemeProps({ props: inProps, name: 'MuiClockNumber' }); - const { className, disabled, index, inner, label, selected, ...other } = props; - const ownerState = props; - const classes = useUtilityClasses(ownerState); + const { + className, + classes: classesProp, + disabled, + index, + inner, + label, + selected, + ...other + } = props; + + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const ownerState: ClockNumberOwnerState = { + ...pickerOwnerState, + isClockNumberInInnerRing: inner, + isClockNumberSelected: selected, + isClockNumberDisabled: disabled, + }; + const classes = useUtilityClasses(classesProp, ownerState); const angle = ((index % 12) / 12) * Math.PI * 2 - Math.PI / 2; const length = ((CLOCK_WIDTH - CLOCK_HOUR_WIDTH - 2) / 2) * (inner ? 0.65 : 1); diff --git a/packages/x-date-pickers/src/TimeClock/ClockPointer.tsx b/packages/x-date-pickers/src/TimeClock/ClockPointer.tsx index 7ae3e024d2984..04b1278bbabc7 100644 --- a/packages/x-date-pickers/src/TimeClock/ClockPointer.tsx +++ b/packages/x-date-pickers/src/TimeClock/ClockPointer.tsx @@ -3,23 +3,37 @@ import clsx from 'clsx'; import { styled, useThemeProps } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; import { CLOCK_WIDTH, CLOCK_HOUR_WIDTH } from './shared'; -import { TimeView } from '../models'; +import { PickerOwnerState, TimeView } from '../models'; import { ClockPointerClasses, getClockPointerUtilityClass } from './clockPointerClasses'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; export interface ClockPointerProps extends React.HTMLAttributes { - hasSelected: boolean; + /** + * `true` if the pointer is between two clock values. + * On the `hours` view, it is always false. + * On the `minutes` view, it is true if the pointer is on a value that is not a multiple of 5. + */ + isBetweenTwoClockValues: boolean; isInner: boolean; type: TimeView; viewValue: number; classes?: Partial; } -interface ClockPointerState { - shouldAnimate: boolean; +interface ClockPointerOwnerState extends PickerOwnerState { + /** + * `true` if the clock pointer should animate. + */ + isClockPointerAnimated: boolean; + /** + * `true` if the pointer is between two clock values. + * On the `hours` view, it is always false. + * On the `minutes` view, it is true if the pointer is on a value that is not a multiple of 5. + */ + isClockPointerBetweenTwoValues: boolean; } -const useUtilityClasses = (ownerState: ClockPointerProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], thumb: ['thumb'], @@ -33,7 +47,7 @@ const ClockPointerRoot = styled('div', { slot: 'Root', overridesResolver: (_, styles) => styles.root, })<{ - ownerState: ClockPointerProps & ClockPointerState; + ownerState: ClockPointerOwnerState; }>(({ theme }) => ({ width: 2, backgroundColor: (theme.vars || theme).palette.primary.main, @@ -43,7 +57,7 @@ const ClockPointerRoot = styled('div', { transformOrigin: 'center bottom 0px', variants: [ { - props: { shouldAnimate: true }, + props: { isClockPointerAnimated: true }, style: { transition: theme.transitions.create(['transform', 'height']), }, @@ -56,7 +70,7 @@ const ClockPointerThumb = styled('div', { slot: 'Thumb', overridesResolver: (_, styles) => styles.thumb, })<{ - ownerState: ClockPointerProps & ClockPointerState; + ownerState: ClockPointerOwnerState; }>(({ theme }) => ({ width: 4, height: 4, @@ -69,7 +83,7 @@ const ClockPointerThumb = styled('div', { boxSizing: 'content-box', variants: [ { - props: { hasSelected: true }, + props: { isBetweenTwoClockValues: false }, style: { backgroundColor: (theme.vars || theme).palette.primary.main, }, @@ -82,14 +96,27 @@ const ClockPointerThumb = styled('div', { */ export function ClockPointer(inProps: ClockPointerProps) { const props = useThemeProps({ props: inProps, name: 'MuiClockPointer' }); - const { className, hasSelected, isInner, type, viewValue, ...other } = props; + const { + className, + classes: classesProp, + isBetweenTwoClockValues, + isInner, + type, + viewValue, + ...other + } = props; const previousType = React.useRef(type); React.useEffect(() => { previousType.current = type; }, [type]); - const ownerState = { ...props, shouldAnimate: previousType.current !== type }; - const classes = useUtilityClasses(ownerState); + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const ownerState: ClockPointerOwnerState = { + ...pickerOwnerState, + isClockPointerAnimated: previousType.current !== type, + isClockPointerBetweenTwoValues: isBetweenTwoClockValues, + }; + const classes = useUtilityClasses(classesProp); const getAngleStyle = () => { const max = type === 'hours' ? 12 : 60; diff --git a/packages/x-date-pickers/src/TimeClock/TimeClock.tsx b/packages/x-date-pickers/src/TimeClock/TimeClock.tsx index 71207b92481bc..2ebc6e677461d 100644 --- a/packages/x-date-pickers/src/TimeClock/TimeClock.tsx +++ b/packages/x-date-pickers/src/TimeClock/TimeClock.tsx @@ -11,18 +11,18 @@ import { convertValueToMeridiem, createIsAfterIgnoreDatePart } from '../internal import { useViews } from '../internals/hooks/useViews'; import type { PickerSelectionState } from '../internals/hooks/usePicker'; import { useMeridiemMode } from '../internals/hooks/date-helpers-hooks'; -import { PickerValidDate, TimeView } from '../models'; +import { PickerOwnerState, PickerValidDate, TimeView } from '../models'; import { PickerViewRoot } from '../internals/components/PickerViewRoot'; -import { getTimeClockUtilityClass } from './timeClockClasses'; +import { getTimeClockUtilityClass, TimeClockClasses } from './timeClockClasses'; import { Clock, ClockProps } from './Clock'; import { TimeClockProps } from './TimeClock.types'; import { getHourNumbers, getMinutesNumbers } from './ClockNumbers'; import { useControlledValueWithTimezone } from '../internals/hooks/useValueWithTimezone'; import { singleItemValueManager } from '../internals/utils/valueManagers'; import { useClockReferenceDate } from '../internals/hooks/useClockReferenceDate'; +import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext'; -const useUtilityClasses = (ownerState: TimeClockProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], arrowSwitcher: ['arrowSwitcher'], @@ -35,7 +35,7 @@ const TimeClockRoot = styled(PickerViewRoot, { name: 'MuiTimeClock', slot: 'Root', overridesResolver: (props, styles) => styles.root, -})<{ ownerState: TimeClockProps }>({ +})<{ ownerState: PickerOwnerState }>({ display: 'flex', flexDirection: 'column', position: 'relative', @@ -45,7 +45,7 @@ const TimeClockArrowSwitcher = styled(PickersArrowSwitcher, { name: 'MuiTimeClock', slot: 'ArrowSwitcher', overridesResolver: (props, styles) => styles.arrowSwitcher, -})<{ ownerState: TimeClockProps }>({ +})<{ ownerState: PickerOwnerState }>({ position: 'absolute', right: 12, top: 15, @@ -55,7 +55,7 @@ type TimeClockComponent = (( props: TimeClockProps & React.RefAttributes, ) => React.JSX.Element) & { propTypes?: any }; -const TIME_CLOCK_DEFAULT_VIEWS: TimeView[] = ['hours', 'minutes']; +const TIME_CLOCK_DEFAULT_VIEWS: readonly TimeView[] = ['hours', 'minutes']; /** * Demos: @@ -68,7 +68,7 @@ const TIME_CLOCK_DEFAULT_VIEWS: TimeView[] = ['hours', 'minutes']; * - [TimeClock API](https://mui.com/x/api/date-pickers/time-clock/) */ export const TimeClock = React.forwardRef(function TimeClock( - inProps: TimeClockProps, + inProps: TimeClockProps, ref: React.Ref, ) { const utils = useUtils(); @@ -103,6 +103,7 @@ export const TimeClock = React.forwardRef(function TimeClock( focusedView, onFocusedViewChange, className, + classes: classesProp, disabled, readOnly, timezone: timezoneProp, @@ -129,6 +130,8 @@ export const TimeClock = React.forwardRef(function TimeClock( const translations = usePickerTranslations(); const now = useNow(timezone); + const selectedId = useId(); + const { ownerState } = usePickerPrivateContext(); const { view, setView, previousView, nextView, setValueAndGoToNextView } = useViews({ view: inView, @@ -252,8 +255,6 @@ export const TimeClock = React.forwardRef(function TimeClock( ], ); - const selectedId = useId(); - const viewProps = React.useMemo>(() => { switch (view) { case 'hours': { @@ -348,8 +349,7 @@ export const TimeClock = React.forwardRef(function TimeClock( disabled, ]); - const ownerState = props; - const classes = useUtilityClasses(ownerState); + const classes = useUtilityClasses(classesProp); return ( - Describes', () => { const { render, clock } = createPickerRenderer(); @@ -26,7 +27,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants'], })); - describeValue(TimeClock, () => ({ + describeValue(TimeClock, () => ({ render, componentFamily: 'clock', values: [adapterToUse.date('2018-01-01T12:30:00'), adapterToUse.date('2018-01-01T13:35:00')], 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 a154d3f3a2b69..d135cd767dad1 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 @@ -28,7 +28,7 @@ describe(' - Timezone', () => { const expectedDate = adapter.setHours(adapter.date(), 8); - // Check the `onChange` value (uses default timezone, e.g: UTC, see TZ env variable) + // Check the `onChange` value (uses default timezone, for example: UTC, see TZ env variable) const actualDate = onChange.lastCall.firstArg; // On dayjs, we are not able to know if a date is UTC because it's the system timezone or because it was created as UTC. diff --git a/packages/x-date-pickers/src/TimeField/TimeField.tsx b/packages/x-date-pickers/src/TimeField/TimeField.tsx index b84ff450fa901..571fd5c6b7239 100644 --- a/packages/x-date-pickers/src/TimeField/TimeField.tsx +++ b/packages/x-date-pickers/src/TimeField/TimeField.tsx @@ -10,6 +10,7 @@ import { useTimeField } from './useTimeField'; import { useClearableField } from '../hooks'; import { PickersTextField } from '../PickersTextField'; import { convertFieldResponseIntoMuiTextFieldProps } from '../internals/utils/convertFieldResponseIntoMuiTextFieldProps'; +import { useFieldOwnerState } from '../internals/hooks/useFieldOwnerState'; type TimeFieldComponent = (( props: TimeFieldProps & React.RefAttributes, @@ -35,7 +36,7 @@ const TimeField = React.forwardRef(function TimeField< const { slots, slotProps, InputProps, inputProps, ...other } = themeProps; - const ownerState = themeProps; + const ownerState = useFieldOwnerState(themeProps); const TextField = slots?.textField ?? @@ -291,10 +292,10 @@ TimeField.propTypes = { */ shouldDisableTime: PropTypes.func, /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. diff --git a/packages/x-date-pickers/src/TimeField/TimeField.types.ts b/packages/x-date-pickers/src/TimeField/TimeField.types.ts index af41f53ee6231..819535baa8fb5 100644 --- a/packages/x-date-pickers/src/TimeField/TimeField.types.ts +++ b/packages/x-date-pickers/src/TimeField/TimeField.types.ts @@ -1,14 +1,8 @@ import * as React from 'react'; -import { SlotComponentProps } from '@mui/utils'; -import { MakeOptional } from '@mui/x-internals/types'; -import TextField from '@mui/material/TextField'; +import type { TextFieldProps } from '@mui/material/TextField'; +import { MakeOptional, SlotComponentPropsFromProps } from '@mui/x-internals/types'; import { UseFieldInternalProps } from '../internals/hooks/useField'; -import { - FieldSection, - PickerValidDate, - TimeValidationError, - BuiltInFieldTextFieldProps, -} from '../models'; +import { TimeValidationError, BuiltInFieldTextFieldProps, FieldOwnerState } from '../models'; import { ExportedUseClearableFieldProps, UseClearableFieldSlots, @@ -16,15 +10,12 @@ import { } from '../hooks/useClearableField'; import { ExportedValidateTimeProps } from '../validation/validateTime'; import { AmPmProps } from '../internals/models/props/time'; +import { PickerValue } from '../internals/models'; +import { PickersTextFieldProps } from '../PickersTextField'; export interface UseTimeFieldProps extends MakeOptional< - UseFieldInternalProps< - PickerValidDate | null, - FieldSection, - TEnableAccessibleFieldDOMStructure, - TimeValidationError - >, + UseFieldInternalProps, 'format' >, ExportedValidateTimeProps, @@ -48,25 +39,21 @@ export type TimeFieldProps; + slotProps?: TimeFieldSlotProps; }; -export type TimeFieldOwnerState = - TimeFieldProps; - export interface TimeFieldSlots extends UseClearableFieldSlots { /** * Form control with an input to render the value. - * @default TextField from '@mui/material' or PickersTextField if `enableAccessibleFieldDOMStructure` is `true`. + * @default , or from '@mui/material' if `enableAccessibleFieldDOMStructure` is `false`. */ textField?: React.ElementType; } -export interface TimeFieldSlotProps - extends UseClearableFieldSlotProps { - textField?: SlotComponentProps< - typeof TextField, +export interface TimeFieldSlotProps extends UseClearableFieldSlotProps { + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, {}, - TimeFieldOwnerState + FieldOwnerState >; } diff --git a/packages/x-date-pickers/src/TimeField/tests/describes.TimeField.test.tsx b/packages/x-date-pickers/src/TimeField/tests/describes.TimeField.test.tsx index 35b9339620ac5..515cbd0b2639c 100644 --- a/packages/x-date-pickers/src/TimeField/tests/describes.TimeField.test.tsx +++ b/packages/x-date-pickers/src/TimeField/tests/describes.TimeField.test.tsx @@ -11,6 +11,7 @@ import { import { TimeField } from '@mui/x-date-pickers/TimeField'; import { PickersTextField } from '@mui/x-date-pickers/PickersTextField'; import { describeConformance } from 'test/utils/describeConformance'; +import { PickerValue } from '@mui/x-date-pickers/internals'; describe(' - Describes', () => { const { render, clock } = createPickerRenderer({ clock: 'fake' }); @@ -31,7 +32,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants', 'themeStyleOverrides'], })); - describeValue(TimeField, () => ({ + describeValue(TimeField, () => ({ render, componentFamily: 'field', values: [adapterToUse.date('2018-01-01'), adapterToUse.date('2018-01-02')], diff --git a/packages/x-date-pickers/src/TimeField/useTimeField.ts b/packages/x-date-pickers/src/TimeField/useTimeField.ts index 5ec3eba335b5a..51a88016a8dc3 100644 --- a/packages/x-date-pickers/src/TimeField/useTimeField.ts +++ b/packages/x-date-pickers/src/TimeField/useTimeField.ts @@ -7,8 +7,8 @@ import { useField } from '../internals/hooks/useField'; import { UseTimeFieldProps } from './TimeField.types'; import { validateTime } from '../validation'; import { useSplitFieldProps } from '../hooks'; -import { PickerValidDate, FieldSection } from '../models'; import { useDefaultizedTimeField } from '../internals/hooks/defaultizedFieldProps'; +import { PickerValue } from '../internals/models'; export const useTimeField = < TEnableAccessibleFieldDOMStructure extends boolean, @@ -24,8 +24,7 @@ export const useTimeField = < const { forwardedProps, internalProps } = useSplitFieldProps(props, 'time'); return useField< - PickerValidDate | null, - FieldSection, + PickerValue, TEnableAccessibleFieldDOMStructure, typeof forwardedProps, typeof internalProps diff --git a/packages/x-date-pickers/src/TimePicker/TimePicker.types.ts b/packages/x-date-pickers/src/TimePicker/TimePicker.types.ts index 787f4c68fba4f..03ce715b6e850 100644 --- a/packages/x-date-pickers/src/TimePicker/TimePicker.types.ts +++ b/packages/x-date-pickers/src/TimePicker/TimePicker.types.ts @@ -3,13 +3,13 @@ import { DesktopTimePickerSlots, DesktopTimePickerSlotProps, } from '../DesktopTimePicker'; -import { BaseSingleInputFieldProps, TimeViewWithMeridiem } from '../internals/models'; +import { BaseSingleInputFieldProps, PickerValue, TimeViewWithMeridiem } from '../internals/models'; import { MobileTimePickerProps, MobileTimePickerSlots, MobileTimePickerSlotProps, } from '../MobileTimePicker'; -import { FieldSection, PickerValidDate, TimeValidationError } from '../models'; +import { TimeValidationError } from '../models'; import { ValidateTimeProps } from '../validation/validateTime'; export interface TimePickerSlots @@ -46,9 +46,4 @@ export interface TimePickerProps = ValidateTimeProps & - BaseSingleInputFieldProps< - PickerValidDate | null, - FieldSection, - TEnableAccessibleFieldDOMStructure, - TimeValidationError - >; + BaseSingleInputFieldProps; diff --git a/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx b/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx index 7624ad4271fa5..f7e3130bdb76b 100644 --- a/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx +++ b/packages/x-date-pickers/src/TimePicker/TimePickerToolbar.tsx @@ -2,7 +2,6 @@ import * as React from 'react'; import clsx from 'clsx'; import PropTypes from 'prop-types'; -import { useRtl } from '@mui/system/RtlProvider'; import { styled, useThemeProps } from '@mui/material/styles'; import composeClasses from '@mui/utils/composeClasses'; import { PickersToolbarText } from '../internals/components/PickersToolbarText'; @@ -18,22 +17,22 @@ import { timePickerToolbarClasses, TimePickerToolbarClasses, } from './timePickerToolbarClasses'; -import { TimeViewWithMeridiem } from '../internals/models'; +import { PickerValue, TimeViewWithMeridiem } from '../internals/models'; import { formatMeridiem } from '../internals/utils/date-utils'; import { PickerValidDate } from '../models'; import { usePickerContext } from '../hooks'; +import { + PickerToolbarOwnerState, + useToolbarOwnerState, +} from '../internals/hooks/useToolbarOwnerState'; export interface TimePickerToolbarProps - extends BaseToolbarProps, + extends BaseToolbarProps, ExportedTimePickerToolbarProps { ampm?: boolean; ampmInClock?: boolean; } -interface TimePickerToolbarOwnerState extends TimePickerToolbarProps { - isRtl: boolean; -} - export interface ExportedTimePickerToolbarProps extends ExportedBaseToolbarProps { /** * Override or extend the styles applied to the component. @@ -41,18 +40,21 @@ export interface ExportedTimePickerToolbarProps extends ExportedBaseToolbarProps classes?: Partial; } -const useUtilityClasses = (ownerState: TimePickerToolbarOwnerState) => { - const { isLandscape, classes, isRtl } = ownerState; +const useUtilityClasses = ( + classes: Partial | undefined, + ownerState: PickerToolbarOwnerState, +) => { + const { pickerOrientation, toolbarDirection } = ownerState; const slots = { root: ['root'], separator: ['separator'], hourMinuteLabel: [ 'hourMinuteLabel', - isLandscape && 'hourMinuteLabelLandscape', - isRtl && 'hourMinuteLabelReverse', + pickerOrientation === 'landscape' && 'hourMinuteLabelLandscape', + toolbarDirection === 'rtl' && 'hourMinuteLabelReverse', ], - ampmSelection: ['ampmSelection', isLandscape && 'ampmLandscape'], + ampmSelection: ['ampmSelection', pickerOrientation === 'landscape' && 'ampmLandscape'], ampmLabel: ['ampmLabel'], }; @@ -64,7 +66,7 @@ const TimePickerToolbarRoot = styled(PickersToolbar, { slot: 'Root', overridesResolver: (props, styles) => styles.root, })<{ - ownerState: TimePickerToolbarProps; + ownerState: PickerToolbarOwnerState; }>({}); const TimePickerToolbarSeparator = styled(PickersToolbarText, { @@ -88,20 +90,20 @@ const TimePickerToolbarHourMinuteLabel = styled('div', { styles.hourMinuteLabel, ], })<{ - ownerState: TimePickerToolbarOwnerState; + ownerState: PickerToolbarOwnerState; }>({ display: 'flex', justifyContent: 'flex-end', alignItems: 'flex-end', variants: [ { - props: { isRtl: true }, + props: { toolbarDirection: 'rtl' }, style: { flexDirection: 'row-reverse', }, }, { - props: { isLandscape: true }, + props: { pickerOrientation: 'landscape' }, style: { marginTop: 'auto', }, @@ -118,7 +120,7 @@ const TimePickerToolbarAmPmSelection = styled('div', { styles.ampmSelection, ], })<{ - ownerState: TimePickerToolbarProps; + ownerState: PickerToolbarOwnerState; }>({ display: 'flex', flexDirection: 'column', @@ -129,7 +131,7 @@ const TimePickerToolbarAmPmSelection = styled('div', { }, variants: [ { - props: { isLandscape: true }, + props: { pickerOrientation: 'landscape' }, style: { margin: '4px 0 auto', flexDirection: 'row', @@ -162,11 +164,13 @@ function TimePickerToolbar(inProps: TimePickerToolbarProps) { onViewChange, views, className, + classes: classesProp, ...other } = props; const utils = useUtils(); const translations = usePickerTranslations(); - const isRtl = useRtl(); + const ownerState = useToolbarOwnerState(); + const classes = useUtilityClasses(classesProp, ownerState); const { disabled, readOnly } = usePickerContext(); const showAmPmControl = Boolean(ampm && !ampmInClock && views.includes('hours')); @@ -175,9 +179,6 @@ function TimePickerToolbar(inProps: TimePickerToolbarProps) { const formatHours = (time: PickerValidDate) => ampm ? utils.format(time, 'hours12h') : utils.format(time, 'hours24h'); - const ownerState: TimePickerToolbarOwnerState = { ...props, isRtl }; - const classes = useUtilityClasses(ownerState); - const separator = ( = PickerViewRendererLookup< - PickerValidDate | null, + PickerValue, TView, TimeViewRendererProps>, TAdditionalProps >; export interface BaseTimePickerProps - extends BasePickerInputProps, + extends BasePickerInputProps, ExportedBaseClockProps { /** * Display ampm controls under the clock (instead of in the toolbar). 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 a779c25c2194a..448cbb8fe5996 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 @@ -9,6 +9,7 @@ import { describeValue, } from 'test/utils/pickers'; import { describeConformance } from 'test/utils/describeConformance'; +import { PickerValue } from '@mui/x-date-pickers/internals'; describe(' - Describes', () => { const { render, clock } = createPickerRenderer({ @@ -31,7 +32,7 @@ describe(' - Describes', () => { skip: ['componentProp', 'componentsProp', 'themeVariants'], })); - describeValue(YearCalendar, () => ({ + describeValue(YearCalendar, () => ({ render, componentFamily: 'calendar', values: [adapterToUse.date('2018-01-01'), adapterToUse.date('2018-01-01')], diff --git a/packages/x-date-pickers/src/hooks/useClearableField.tsx b/packages/x-date-pickers/src/hooks/useClearableField.tsx index 11dafcc2b3a4b..950c9c117655a 100644 --- a/packages/x-date-pickers/src/hooks/useClearableField.tsx +++ b/packages/x-date-pickers/src/hooks/useClearableField.tsx @@ -7,6 +7,9 @@ import InputAdornment from '@mui/material/InputAdornment'; import { SxProps } from '@mui/system'; import { ClearIcon } from '../icons'; import { usePickerTranslations } from './usePickerTranslations'; +import { FieldOwnerState } from '../models/fields'; +import { useFieldOwnerState } from '../internals/hooks/useFieldOwnerState'; +import { FormProps } from '../internals/models'; export interface ExportedUseClearableFieldProps { /** @@ -34,11 +37,11 @@ export interface UseClearableFieldSlots { } export interface UseClearableFieldSlotProps { - clearIcon?: SlotComponentProps; - clearButton?: SlotComponentProps; + clearIcon?: SlotComponentProps; + clearButton?: SlotComponentProps; } -interface UseClearableFieldProps extends ExportedUseClearableFieldProps { +interface UseClearableFieldProps extends ExportedUseClearableFieldProps, FormProps { InputProps?: { endAdornment?: React.ReactNode }; sx?: SxProps; slots?: UseClearableFieldSlots; @@ -54,15 +57,16 @@ export const useClearableField = ( props: TFieldProps, ): UseClearableFieldResponse => { const translations = usePickerTranslations(); + const ownerState = useFieldOwnerState(props); const { clearable, onClear, InputProps, sx, slots, slotProps, ...other } = props; const IconButton = slots?.clearButton ?? MuiIconButton; // The spread is here to avoid this bug mui/material-ui#34056 - const { ownerState, ...iconButtonProps } = useSlotProps({ + const { ownerState: iconButtonOwnerState, ...iconButtonProps } = useSlotProps({ elementType: IconButton, externalSlotProps: slotProps?.clearButton, - ownerState: {}, + ownerState, className: 'clearButton', additionalProps: { title: translations.fieldClearLabel, @@ -73,7 +77,7 @@ export const useClearableField = ( const endClearIconProps = useSlotProps({ elementType: EndClearIcon, externalSlotProps: slotProps?.clearIcon, - ownerState: {}, + ownerState, }); return { diff --git a/packages/x-date-pickers/src/hooks/useParsedFormat.ts b/packages/x-date-pickers/src/hooks/useParsedFormat.ts index f32b345fccb9a..8e777dd0731fd 100644 --- a/packages/x-date-pickers/src/hooks/useParsedFormat.ts +++ b/packages/x-date-pickers/src/hooks/useParsedFormat.ts @@ -9,13 +9,13 @@ import type { UseFieldInternalProps } from '../internals/hooks/useField'; interface UseParsedFormatParameters extends Pick< - UseFieldInternalProps, + UseFieldInternalProps, 'format' | 'formatDensity' | 'shouldRespectLeadingZeros' > {} /** * Returns the parsed format to be rendered in the field when there is no value or in other parts of the Picker. - * This format is localized (e.g: `AAAA` for the year with the French locale) and cannot be parsed by your date library. + * This format is localized (for example `AAAA` for the year with the French locale) and cannot be parsed by your date library. * @param {object} The parameters needed to build the placeholder. * @param {string} params.format Format of the date to use. * @param {'dense' | 'spacious'} params.formatDensity Density of the format (setting `formatDensity` to `"spacious"` will add a space before and after each `/`, `-` and `.` character). diff --git a/packages/x-date-pickers/src/internals/components/PickerProvider.tsx b/packages/x-date-pickers/src/internals/components/PickerProvider.tsx index 85eeaf1f04d89..0f558077d4fc3 100644 --- a/packages/x-date-pickers/src/internals/components/PickerProvider.tsx +++ b/packages/x-date-pickers/src/internals/components/PickerProvider.tsx @@ -3,6 +3,7 @@ import { PickerOwnerState } from '../../models'; import { PickersInputLocaleText } from '../../locales'; import { LocalizationProvider } from '../../LocalizationProvider'; import { PickerOrientation, PickerVariant } from '../models'; +import type { UsePickerValueContextValue } from '../hooks/usePicker/usePickerValue.types'; export const PickerContext = React.createContext(null); @@ -43,21 +44,7 @@ export interface PickerProviderProps { children: React.ReactNode; } -export interface PickerContextValue { - /** - * Open the picker. - * @param {React.UIEvent} event The DOM event that triggered the change. - */ - onOpen: (event: React.UIEvent) => void; - /** - * Close the picker. - * @param {React.UIEvent} event The DOM event that triggered the change. - */ - onClose: (event: React.UIEvent) => void; - /** - * `true` if the picker is open, `false` otherwise. - */ - open: boolean; +export interface PickerContextValue extends UsePickerValueContextValue { /** * `true` if the picker is disabled, `false` otherwise. */ 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 a5dd5873308f4..65bea5a6bb716 100644 --- a/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.tsx +++ b/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.tsx @@ -7,18 +7,20 @@ import composeClasses from '@mui/utils/composeClasses'; import useSlotProps from '@mui/utils/useSlotProps'; import IconButton from '@mui/material/IconButton'; import { ArrowLeftIcon, ArrowRightIcon } from '../../../icons'; +import { PickersArrowSwitcherProps } from './PickersArrowSwitcher.types'; import { - PickersArrowSwitcherOwnerState, - PickersArrowSwitcherProps, -} from './PickersArrowSwitcher.types'; -import { getPickersArrowSwitcherUtilityClass } from './pickersArrowSwitcherClasses'; + getPickersArrowSwitcherUtilityClass, + PickersArrowSwitcherClasses, +} from './pickersArrowSwitcherClasses'; +import { usePickerPrivateContext } from '../../hooks/usePickerPrivateContext'; +import { PickerOwnerState } from '../../../models'; const PickersArrowSwitcherRoot = styled('div', { name: 'MuiPickersArrowSwitcher', slot: 'Root', overridesResolver: (props, styles) => styles.root, })<{ - ownerState: PickersArrowSwitcherProps; + ownerState: PickerOwnerState; }>({ display: 'flex', }); @@ -28,7 +30,7 @@ const PickersArrowSwitcherSpacer = styled('div', { slot: 'Spacer', overridesResolver: (props, styles) => styles.spacer, })<{ - ownerState: PickersArrowSwitcherProps; + ownerState: PickerOwnerState; }>(({ theme }) => ({ width: theme.spacing(3), })); @@ -38,7 +40,7 @@ const PickersArrowSwitcherButton = styled(IconButton, { slot: 'Button', overridesResolver: (props, styles) => styles.button, })<{ - ownerState: PickersArrowSwitcherProps; + ownerState: PickerOwnerState; }>({ variants: [ { @@ -48,8 +50,7 @@ const PickersArrowSwitcherButton = styled(IconButton, { ], }); -const useUtilityClasses = (ownerState: PickersArrowSwitcherOwnerState) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], spacer: ['spacer'], @@ -84,12 +85,13 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch onGoToPrevious, previousLabel, labelId, + classes: classesProp, ...other } = props; - const ownerState = props; + const { ownerState } = usePickerPrivateContext(); - const classes = useUtilityClasses(ownerState); + const classes = useUtilityClasses(classesProp); const nextProps = { isDisabled: isNextDisabled, @@ -117,7 +119,7 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch edge: 'end', onClick: previousProps.goTo, }, - ownerState: { ...ownerState, hidden: previousProps.isHidden }, + ownerState: { ...ownerState, hidden: previousProps.isHidden ?? false }, className: clsx(classes.button, classes.previousIconButton), }); @@ -133,7 +135,7 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch edge: 'start', onClick: nextProps.goTo, }, - ownerState: { ...ownerState, hidden: nextProps.isHidden }, + ownerState: { ...ownerState, hidden: nextProps.isHidden ?? false }, className: clsx(classes.button, classes.nextIconButton), }); diff --git a/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.types.tsx b/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.types.tsx index f32e1745edf74..725f070b17504 100644 --- a/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.types.tsx +++ b/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.types.tsx @@ -3,6 +3,7 @@ import { SlotComponentProps } from '@mui/utils'; import IconButton from '@mui/material/IconButton'; import SvgIcon from '@mui/material/SvgIcon'; import { PickersArrowSwitcherClasses } from './pickersArrowSwitcherClasses'; +import { PickerOwnerState } from '../../../models'; export interface ExportedPickersArrowSwitcherProps { /** @@ -41,7 +42,12 @@ export interface PickersArrowSwitcherProps labelId?: string; } -export type PickersArrowSwitcherOwnerState = PickersArrowSwitcherProps; +export interface PickersArrowSwitcherOwnerState extends PickerOwnerState { + /** + * If `true`, this button should be hidden. + */ + hidden: boolean; +} export interface PickersArrowSwitcherSlotPropsOverrides {} @@ -68,29 +74,25 @@ export interface PickersArrowSwitcherSlots { rightArrowIcon?: React.ElementType; } -export interface PickersArrowSwitcherButtonSlotOwnerState extends PickersArrowSwitcherOwnerState { - hidden?: boolean; -} - export interface PickersArrowSwitcherSlotProps { previousIconButton?: SlotComponentProps< typeof IconButton, PickersArrowSwitcherSlotPropsOverrides, - PickersArrowSwitcherButtonSlotOwnerState + PickersArrowSwitcherOwnerState >; nextIconButton?: SlotComponentProps< typeof IconButton, PickersArrowSwitcherSlotPropsOverrides, - PickersArrowSwitcherButtonSlotOwnerState + PickersArrowSwitcherOwnerState >; leftArrowIcon?: SlotComponentProps< typeof SvgIcon, PickersArrowSwitcherSlotPropsOverrides, - PickersArrowSwitcherButtonSlotOwnerState + PickerOwnerState >; rightArrowIcon?: SlotComponentProps< typeof SvgIcon, PickersArrowSwitcherSlotPropsOverrides, - PickersArrowSwitcherButtonSlotOwnerState + PickerOwnerState >; } diff --git a/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/describes.PickersArrowSwitcher.test.tsx b/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/describes.PickersArrowSwitcher.test.tsx index 6a0adc31c722a..8db3f5a49a469 100644 --- a/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/describes.PickersArrowSwitcher.test.tsx +++ b/packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/describes.PickersArrowSwitcher.test.tsx @@ -22,7 +22,12 @@ describe(' - Describes', () => { render, muiName: 'MuiPickersArrowSwitcher', refInstanceof: window.HTMLDivElement, - skip: ['componentProp', 'componentsProp', 'themeVariants'], + skip: [ + 'componentProp', + 'componentsProp', + 'themeVariants', + 'slotPropsCallbackWithPropsAsOwnerState', + ], slots: { previousIconButton: { expectedClassName: pickersArrowSwitcherClasses.previousIconButton, diff --git a/packages/x-date-pickers/src/internals/components/PickersPopper.tsx b/packages/x-date-pickers/src/internals/components/PickersPopper.tsx index 81d3d1d5b4480..b536f4c7f7331 100644 --- a/packages/x-date-pickers/src/internals/components/PickersPopper.tsx +++ b/packages/x-date-pickers/src/internals/components/PickersPopper.tsx @@ -2,16 +2,16 @@ import * as React from 'react'; import useSlotProps from '@mui/utils/useSlotProps'; import Grow from '@mui/material/Grow'; import Fade from '@mui/material/Fade'; -import MuiPaper, { PaperProps as MuiPaperProps } from '@mui/material/Paper'; +import MuiPaper, { PaperProps as MuiPaperProps, PaperProps } from '@mui/material/Paper'; import MuiPopper, { PopperProps as MuiPopperProps, PopperPlacementType, + PopperProps, } from '@mui/material/Popper'; import BaseFocusTrap, { TrapFocusProps as MuiTrapFocusProps, } from '@mui/material/Unstable_TrapFocus'; import { - SlotComponentProps, unstable_useForkRef as useForkRef, unstable_useEventCallback as useEventCallback, unstable_ownerDocument as ownerDocument, @@ -19,13 +19,16 @@ import { } from '@mui/utils'; import { styled, useThemeProps } from '@mui/material/styles'; import { TransitionProps as MuiTransitionProps } from '@mui/material/transitions'; +import { SlotComponentPropsFromProps } from '@mui/x-internals/types'; import { getPickersPopperUtilityClass, PickersPopperClasses } from './pickersPopperClasses'; import { getActiveElement } from '../utils/utils'; import { UsePickerValueActions } from '../hooks/usePicker/usePickerValue.types'; import { useDefaultReduceAnimations } from '../hooks/useDefaultReduceAnimations'; +import { usePickerPrivateContext } from '../hooks/usePickerPrivateContext'; +import { PickerOwnerState } from '../../models'; -interface PickersPopperOwnerState extends PickerPopperProps { - placement: PopperPlacementType; +interface PickerPopperOwnerState extends PickerOwnerState { + popperPlacement: PopperPlacementType; } export interface PickersPopperSlots { @@ -55,7 +58,7 @@ export interface PickersPopperSlotProps { /** * Props passed down to the desktop [Paper](https://mui.com/material-ui/api/paper/) component. */ - desktopPaper?: SlotComponentProps; + desktopPaper?: SlotComponentPropsFromProps; /** * Props passed down to the desktop [Transition](https://mui.com/material-ui/transitions/) component. */ @@ -67,13 +70,16 @@ export interface PickersPopperSlotProps { /** * Props passed down to [Popper](https://mui.com/material-ui/api/popper/) component. */ - popper?: SlotComponentProps; + popper?: SlotComponentPropsFromProps; } export interface PickerPopperProps extends UsePickerValueActions { role: 'tooltip' | 'dialog'; anchorEl: MuiPopperProps['anchorEl']; open: MuiPopperProps['open']; + /** + * @default "bottom" + */ placement?: MuiPopperProps['placement']; containerRef?: React.Ref; children?: React.ReactNode; @@ -88,9 +94,7 @@ export interface PickerPopperProps extends UsePickerValueActions { reduceAnimations?: boolean; } -const useUtilityClasses = (ownerState: PickerPopperProps) => { - const { classes } = ownerState; - +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], paper: ['paper'], @@ -112,14 +116,14 @@ const PickersPopperPaper = styled(MuiPaper, { slot: 'Paper', overridesResolver: (_, styles) => styles.paper, })<{ - ownerState: PickersPopperOwnerState; + ownerState: PickerPopperOwnerState; }>({ outline: 0, transformOrigin: 'top center', variants: [ { - props: ({ placement }: PickersPopperOwnerState) => - ['top', 'top-start', 'top-end'].includes(placement), + props: ({ popperPlacement }: PickerPopperOwnerState) => + ['top', 'top-start', 'top-end'].includes(popperPlacement), style: { transformOrigin: 'bottom center', }, @@ -274,8 +278,7 @@ function useClickAwayListener( interface PickersPopperPaperProps { PaperComponent: React.ElementType; children: React.ReactNode; - ownerState: PickerPopperProps; - popperPlacement: PopperPlacementType; + ownerState: PickerPopperOwnerState; paperClasses: string; onPaperClick: React.MouseEventHandler; onPaperTouchStart: React.TouchEventHandler; @@ -286,8 +289,7 @@ const PickersPopperPaperWrapper = React.forwardRef( (props: PickersPopperPaperProps, ref: React.Ref) => { const { PaperComponent, - popperPlacement, - ownerState: inOwnerState, + ownerState, children, paperSlotProps, paperClasses, @@ -297,7 +299,7 @@ const PickersPopperPaperWrapper = React.forwardRef( // https://mui.com/material-ui/transitions/#child-requirement ...other } = props; - const ownerState = { ...inOwnerState, placement: popperPlacement }; + const paperProps: MuiPaperProps = useSlotProps({ elementType: PaperComponent, externalSlotProps: paperSlotProps, @@ -340,10 +342,11 @@ export function PickersPopper(inProps: PickerPopperProps) { onDismiss, open, role, - placement, + placement = 'bottom', slots, slotProps, reduceAnimations: inReduceAnimations, + classes: classesProp, } = props; React.useEffect(() => { @@ -390,10 +393,11 @@ export function PickersPopper(inProps: PickerPopperProps) { const handleRef = useForkRef(paperRef, containerRef); const handlePaperRef = useForkRef(handleRef, clickAwayRef as React.Ref); - const ownerState = props; - const classes = useUtilityClasses(ownerState); + const classes = useUtilityClasses(classesProp); const defaultReduceAnimations = useDefaultReduceAnimations(); const reduceAnimations = inReduceAnimations ?? defaultReduceAnimations; + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const ownerState: PickerPopperOwnerState = { ...pickerOwnerState, popperPlacement: placement }; const handleKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Escape') { @@ -420,12 +424,12 @@ export function PickersPopper(inProps: PickerPopperProps) { onKeyDown: handleKeyDown, }, className: classes.root, - ownerState: props, + ownerState, }); return ( - {({ TransitionProps, placement: popperPlacement }) => ( + {({ TransitionProps }) => ( - extends Pick, 'isLandscape' | 'hidden' | 'titleId'> { +export interface PickersToolbarProps< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> extends Pick, 'isLandscape' | 'hidden' | 'titleId'> { className?: string; landscapeDirection?: 'row' | 'column'; toolbarTitle: React.ReactNode; classes?: Partial; } -const useUtilityClasses = (ownerState: PickersToolbarProps) => { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], content: ['content'], @@ -29,9 +32,7 @@ const PickersToolbarRoot = styled('div', { name: 'MuiPickersToolbar', slot: 'Root', overridesResolver: (props, styles) => styles.root, -})<{ - ownerState: PickersToolbarProps; -}>(({ theme }) => ({ +})<{ ownerState: PickerToolbarOwnerState }>(({ theme }) => ({ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', @@ -39,7 +40,7 @@ const PickersToolbarRoot = styled('div', { padding: theme.spacing(2, 3), variants: [ { - props: { isLandscape: true }, + props: { pickerOrientation: 'landscape' }, style: { height: 'auto', maxWidth: 160, @@ -55,8 +56,10 @@ const PickersToolbarContent = styled('div', { name: 'MuiPickersToolbar', slot: 'Content', overridesResolver: (props, styles) => styles.content, + shouldForwardProp: (prop) => shouldForwardProp(prop) && prop !== 'landscapeDirection', })<{ - ownerState: PickersToolbarProps; + ownerState: PickerToolbarOwnerState; + landscapeDirection: 'row' | 'column' | undefined; }>({ display: 'flex', flexWrap: 'wrap', @@ -67,7 +70,7 @@ const PickersToolbarContent = styled('div', { flexDirection: 'row', variants: [ { - props: { isLandscape: true }, + props: { pickerOrientation: 'landscape' }, style: { justifyContent: 'flex-start', alignItems: 'flex-start', @@ -75,7 +78,7 @@ const PickersToolbarContent = styled('div', { }, }, { - props: { isLandscape: true, landscapeDirection: 'row' }, + props: { pickerOrientation: 'landscape', landscapeDirection: 'row' }, style: { flexDirection: 'row', }, @@ -83,13 +86,16 @@ const PickersToolbarContent = styled('div', { ], }); -type PickersToolbarComponent = (( +type PickersToolbarComponent = (< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +>( props: React.PropsWithChildren> & React.RefAttributes, ) => React.JSX.Element) & { propTypes?: any }; export const PickersToolbar = React.forwardRef(function PickersToolbar< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, >( inProps: React.PropsWithChildren>, @@ -99,6 +105,7 @@ export const PickersToolbar = React.forwardRef(function PickersToolbar< const { children, className, + classes: classesProp, toolbarTitle, hidden, titleId, @@ -108,8 +115,8 @@ export const PickersToolbar = React.forwardRef(function PickersToolbar< ...other } = props; - const ownerState = props; - const classes = useUtilityClasses(ownerState); + const ownerState = useToolbarOwnerState(); + const classes = useUtilityClasses(classesProp); if (hidden) { return null; @@ -131,7 +138,11 @@ export const PickersToolbar = React.forwardRef(function PickersToolbar< > {toolbarTitle} - + {children} diff --git a/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx b/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx index 0d777e3726613..5cd25185bd47f 100644 --- a/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx +++ b/packages/x-date-pickers/src/internals/components/PickersToolbarButton.tsx @@ -19,8 +19,7 @@ export interface PickersToolbarButtonProps extends ExtendMui { - const { classes } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { root: ['root'], }; @@ -43,10 +42,19 @@ export const PickersToolbarButton = React.forwardRef(function PickersToolbarButt ref: React.Ref, ) { const props = useThemeProps({ props: inProps, name: 'MuiPickersToolbarButton' }); - const { align, className, selected, typographyClassName, value, variant, width, ...other } = - props; + const { + align, + className, + classes: classesProp, + selected, + typographyClassName, + value, + variant, + width, + ...other + } = props; - const classes = useUtilityClasses(props); + const classes = useUtilityClasses(classesProp); return ( { - const { classes, selected } = ownerState; +const useUtilityClasses = (classes: Partial | undefined) => { const slots = { - root: ['root', selected && 'selected'], + root: ['root'], }; return composeClasses(slots, getPickersToolbarTextUtilityClass, classes); @@ -33,16 +31,13 @@ const useUtilityClasses = (ownerState: PickersToolbarTextProps) => { const PickersToolbarTextRoot = styled(Typography, { name: 'MuiPickersToolbarText', slot: 'Root', - overridesResolver: (_, styles) => [ - styles.root, - { [`&.${pickersToolbarTextClasses.selected}`]: styles.selected }, - ], + overridesResolver: (_, styles) => [styles.root], })<{ component?: React.ElementType; }>(({ theme }) => ({ transition: theme.transitions.create('color'), color: (theme.vars || theme).palette.text.secondary, - [`&.${pickersToolbarTextClasses.selected}`]: { + [`&[data-selected]`]: { color: (theme.vars || theme).palette.text.primary, }, })); @@ -50,14 +45,15 @@ const PickersToolbarTextRoot = styled(Typography, { export const PickersToolbarText = React.forwardRef( function PickersToolbarText(inProps, ref) { const props = useThemeProps({ props: inProps, name: 'MuiPickersToolbarText' }); - const { className, selected, value, ...other } = props; - const classes = useUtilityClasses(props); + const { className, classes: classesProp, selected, value, ...other } = props; + const classes = useUtilityClasses(classesProp); return ( {value} diff --git a/packages/x-date-pickers/src/internals/hooks/useClockReferenceDate.ts b/packages/x-date-pickers/src/internals/hooks/useClockReferenceDate.ts index cef4af0213711..f7de8e4de11d4 100644 --- a/packages/x-date-pickers/src/internals/hooks/useClockReferenceDate.ts +++ b/packages/x-date-pickers/src/internals/hooks/useClockReferenceDate.ts @@ -3,6 +3,7 @@ import { MuiPickersAdapter, PickersTimezone, PickerValidDate } from '../../model import { singleItemValueManager } from '../utils/valueManagers'; import { getTodayDate } from '../utils/date-utils'; import { SECTION_TYPE_GRANULARITY } from '../utils/getDefaultReferenceDate'; +import { PickerValue } from '../models'; export const useClockReferenceDate = ({ value, @@ -11,7 +12,7 @@ export const useClockReferenceDate = ({ props, timezone, }: { - value: PickerValidDate; + value: PickerValue; referenceDate: PickerValidDate | undefined; utils: MuiPickersAdapter; props: TProps; 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 4d0ae7f7051c5..3ac24e4b6227e 100644 --- a/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.tsx +++ b/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.tsx @@ -8,8 +8,8 @@ import { PickersPopper } from '../../components/PickersPopper'; import { UseDesktopPickerParams, UseDesktopPickerProps } from './useDesktopPicker.types'; import { usePicker } from '../usePicker'; import { PickersLayout } from '../../../PickersLayout'; -import { FieldSection, PickerValidDate, FieldRef, InferError } from '../../../models'; -import { BaseSingleInputFieldProps, DateOrTimeViewWithMeridiem } from '../../models'; +import { FieldRef, InferError } from '../../../models'; +import { DateOrTimeViewWithMeridiem, BaseSingleInputFieldProps, PickerValue } from '../../models'; import { PickerProvider } from '../../components/PickerProvider'; /** @@ -54,7 +54,7 @@ export const useDesktopPicker = < } = props; const containerRef = React.useRef(null); - const fieldRef = React.useRef>(null); + const fieldRef = React.useRef>(null); const labelId = useId(); const isToolbarHidden = innerSlotProps?.toolbar?.hidden ?? false; @@ -69,7 +69,7 @@ export const useDesktopPicker = < shouldRestoreFocus, fieldProps: pickerFieldProps, ownerState, - } = usePicker({ + } = usePicker({ ...pickerParams, props, fieldRef, @@ -111,8 +111,7 @@ export const useDesktopPicker = < const Field = slots.field; const fieldProps: BaseSingleInputFieldProps< - PickerValidDate | null, - FieldSection, + PickerValue, TEnableAccessibleFieldDOMStructure, InferError > = useSlotProps({ diff --git a/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.types.ts b/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.types.ts index 8aead242e00d4..114e346a36e14 100644 --- a/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.types.ts +++ b/packages/x-date-pickers/src/internals/hooks/useDesktopPicker/useDesktopPicker.types.ts @@ -1,8 +1,7 @@ import * as React from 'react'; -import IconButton, { IconButtonProps } from '@mui/material/IconButton'; -import { InputAdornmentProps } from '@mui/material/InputAdornment'; -import TextField from '@mui/material/TextField'; -import { SlotComponentProps } from '@mui/utils'; +import type { IconButtonProps } from '@mui/material/IconButton'; +import type { InputAdornmentProps } from '@mui/material/InputAdornment'; +import type { TextFieldProps } from '@mui/material/TextField'; import { MakeRequired, SlotComponentPropsFromProps } from '@mui/x-internals/types'; import { BaseNonStaticPickerProps, @@ -12,7 +11,7 @@ import { import { PickersPopperSlots, PickersPopperSlotProps } from '../../components/PickersPopper'; import { UsePickerParams } from '../usePicker'; import { - FieldSection, + FieldOwnerState, PickerFieldSlotProps, PickerOwnerState, PickerValidDate, @@ -23,19 +22,21 @@ import { PickersLayoutSlotProps, } from '../../../PickersLayout/PickersLayout.types'; import { UsePickerValueNonStaticProps } from '../usePicker/usePickerValue.types'; -import { UsePickerViewsNonStaticProps, UsePickerViewsProps } from '../usePicker/usePickerViews'; -import { DateOrTimeViewWithMeridiem } from '../../models'; +import { UsePickerViewsProps } from '../usePicker/usePickerViews'; +import { DateOrTimeViewWithMeridiem, PickerValue } from '../../models'; import { UseClearableFieldSlots, UseClearableFieldSlotProps, } from '../../../hooks/useClearableField'; +import { PickersTextFieldProps } from '../../../PickersTextField'; +import { UsePickerProviderNonStaticProps } from '../usePicker/usePickerProvider'; export interface UseDesktopPickerSlots extends Pick< PickersPopperSlots, 'desktopPaper' | 'desktopTransition' | 'desktopTrapFocus' | 'popper' >, - ExportedPickersLayoutSlots, + ExportedPickersLayoutSlots, UseClearableFieldSlots { /** * Component used to enter the date with the keyboard. @@ -66,22 +67,26 @@ export interface UseDesktopPickerSlotProps< TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, > extends ExportedUseDesktopPickerSlotProps, - Pick, 'toolbar'> {} + Pick, 'toolbar'> {} export interface ExportedUseDesktopPickerSlotProps< TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, > extends PickersPopperSlotProps, - ExportedPickersLayoutSlotProps, + ExportedPickersLayoutSlotProps, UseClearableFieldSlotProps { field?: SlotComponentPropsFromProps< - PickerFieldSlotProps, + PickerFieldSlotProps, {}, PickerOwnerState >; - textField?: SlotComponentProps>; + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, + {}, + FieldOwnerState + >; inputAdornment?: SlotComponentPropsFromProps; - openPickerButton?: SlotComponentProps; + openPickerButton?: SlotComponentPropsFromProps; openPickerIcon?: SlotComponentPropsFromProps, {}, PickerOwnerState>; } @@ -89,7 +94,7 @@ export interface DesktopOnlyPickerProps extends BaseNonStaticPickerProps, BaseNonRangeNonStaticPickerProps, UsePickerValueNonStaticProps, - UsePickerViewsNonStaticProps { + UsePickerProviderNonStaticProps { /** * If `true`, the `input` element is focused during the first mount. * @default false @@ -101,8 +106,8 @@ export interface UseDesktopPickerProps< TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, TError, - TExternalProps extends UsePickerViewsProps, -> extends BasePickerProps, + TExternalProps extends UsePickerViewsProps, +> extends BasePickerProps, MakeRequired { /** * Overridable component slots. @@ -126,7 +131,7 @@ export interface UseDesktopPickerParams< TExternalProps >, > extends Pick< - UsePickerParams, + UsePickerParams, 'valueManager' | 'valueType' | 'validator' | 'rendererInterceptor' > { props: TExternalProps; 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 d12d5263f6b0b..8bec0c4e9afa6 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useField.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useField.ts @@ -17,28 +17,21 @@ import { import { adjustSectionValue, getSectionOrder } from './useField.utils'; import { useFieldState } from './useFieldState'; import { useFieldCharacterEditing } from './useFieldCharacterEditing'; -import { FieldSection } from '../../../models'; import { useFieldV7TextField } from './useFieldV7TextField'; import { useFieldV6TextField } from './useFieldV6TextField'; +import { PickerValidValue } from '../../models'; export const useField = < - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TEnableAccessibleFieldDOMStructure extends boolean, TForwardedProps extends UseFieldCommonForwardedProps & UseFieldForwardedProps, - TInternalProps extends UseFieldInternalProps< - any, - any, - TEnableAccessibleFieldDOMStructure, - any - > & { + TInternalProps extends UseFieldInternalProps & { minutesStep?: number; }, >( params: UseFieldParams< TValue, - TSection, TEnableAccessibleFieldDOMStructure, TForwardedProps, TInternalProps @@ -78,7 +71,7 @@ export const useField = < timezone, } = stateResponse; - const characterEditingResponse = useFieldCharacterEditing({ + const characterEditingResponse = useFieldCharacterEditing({ sections: state.sections, updateSectionValue, sectionsValueBoundaries, 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 288047da40aca..e286389178177 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 @@ -10,6 +10,7 @@ import { FieldRef, OnErrorProps, InferError, + InferFieldSection, PickerValueType, } from '../../../models'; import type { PickerValueManager } from '../usePicker'; @@ -18,27 +19,25 @@ import type { UseFieldStateResponse } from './useFieldState'; import type { UseFieldCharacterEditingResponse } from './useFieldCharacterEditing'; import { PickersSectionElement, PickersSectionListRef } from '../../../PickersSectionList'; import { ExportedUseClearableFieldProps } from '../../../hooks/useClearableField'; -import { FormProps } from '../../models'; +import { FormProps, InferNonNullablePickerValue, PickerValidValue } from '../../models'; export interface UseFieldParams< - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TEnableAccessibleFieldDOMStructure extends boolean, TForwardedProps extends UseFieldCommonForwardedProps & UseFieldForwardedProps, - TInternalProps extends UseFieldInternalProps, + TInternalProps extends UseFieldInternalProps, > { forwardedProps: TForwardedProps; internalProps: TInternalProps; valueManager: PickerValueManager>; - fieldValueManager: FieldValueManager; + fieldValueManager: FieldValueManager; validator: Validator, TInternalProps>; valueType: PickerValueType; } export interface UseFieldInternalProps< - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TEnableAccessibleFieldDOMStructure extends boolean, TError, > extends TimezoneProps, @@ -78,10 +77,10 @@ export interface UseFieldInternalProps< */ formatDensity?: 'dense' | 'spacious'; /** - * If `true`, the format will respect the leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `8/16/2018`) - * If `false`, the format will always add leading zeroes (e.g: on dayjs, the format `M/D/YYYY` will render `08/16/2018`) + * If `true`, the format will respect the leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `8/16/2018`) + * If `false`, the format will always add leading zeroes (for example on dayjs, the format `M/D/YYYY` will render `08/16/2018`) * - * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (e.g: "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. + * Warning n°1: Luxon is not able to respect the leading zeroes when using macro tokens (for example "DD"), so `shouldRespectLeadingZeros={true}` might lead to inconsistencies when using `AdapterLuxon`. * * Warning n°2: When `shouldRespectLeadingZeros={true}`, the field will add an invisible character on the sections containing a single digit to make sure `onChange` is fired. * If you need to get the clean value from the input, you can remove this character using `input.value.replace(/\u200e/g, '')`. @@ -110,7 +109,7 @@ export interface UseFieldInternalProps< /** * The ref object used to imperatively interact with the field. */ - unstableFieldRef?: React.Ref>; + unstableFieldRef?: React.Ref>; /** * @default true */ @@ -123,7 +122,7 @@ export interface UseFieldInternalProps< } export interface UseFieldCommonAdditionalProps - extends Required, 'disabled' | 'readOnly'>> {} + extends Required, 'disabled' | 'readOnly'>> {} export interface UseFieldCommonForwardedProps extends ExportedUseClearableFieldProps { onKeyDown?: React.KeyboardEventHandler; @@ -206,7 +205,7 @@ export type FieldSectionsBoundaries = { }; }; -export type FieldChangeHandler = ( +export type FieldChangeHandler = ( value: TValue, context: FieldChangeHandlerContext, ) => void; @@ -219,7 +218,7 @@ export interface FieldChangeHandlerContext { * Object used to access and update the active date (i.e: the date containing the active section). * Mainly useful in the range fields where we need to update the date containing the active section without impacting the other one. */ -interface FieldActiveDateManager { +interface FieldActiveDateManager { /** * Active date from `state.value`. */ @@ -229,79 +228,79 @@ interface FieldActiveDateManager { */ referenceDate: PickerValidDate; /** - * @template TSection - * @param {TSection[]} sections The sections of the full value. - * @returns {TSection[]} The sections of the active date. + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. + * @param {InferFieldSection[]} sections The sections of the full value. + * @returns {InferFieldSection[]} The sections of the active date. * Get the sections of the active date. */ - getSections: (sections: TSection[]) => TSection[]; + getSections: (sections: InferFieldSection[]) => InferFieldSection[]; /** * Creates the new value and reference value based on the new active date and the current state. - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {PickerValidDate | null} newActiveDate The new value of the date containing the active section. - * @returns {Pick, 'value' | 'referenceValue'>} The new value and reference value to publish and store in the state. + * @returns {Pick, 'value' | 'referenceValue'>} The new value and reference value to publish and store in the state. */ getNewValuesFromNewActiveDate: ( newActiveDate: PickerValidDate | null, - ) => Pick, 'value' | 'referenceValue'>; + ) => Pick, 'value' | 'referenceValue'>; } export type FieldParsedSelectedSections = number | 'all' | null; -export interface FieldValueManager { +export interface FieldValueManager { /** * Creates the section list from the current value. * The `prevSections` are used on the range fields to avoid losing the sections of a partially filled date when editing the other date. - * @template TValue, TSection + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {MuiPickersAdapter} utils The utils to manipulate the date. * @param {TValue} value The current value to generate sections from. - * @param {TSection[] | null} fallbackSections The sections to use as a fallback if a date is null or invalid. + * @param {InferFieldSection[] | null} fallbackSections The sections to use as a fallback if a date is null or invalid. * @param {(date: PickerValidDate) => FieldSection[]} getSectionsFromDate Returns the sections of the given date. - * @returns {TSection[]} The new section list. + * @returns {InferFieldSection[]} The new section list. */ getSectionsFromValue: ( utils: MuiPickersAdapter, value: TValue, - fallbackSections: TSection[] | null, + fallbackSections: InferFieldSection[] | null, getSectionsFromDate: (date: PickerValidDate) => FieldSection[], - ) => TSection[]; + ) => InferFieldSection[]; /** * Creates the string value to render in the input based on the current section list. - * @template TSection - * @param {TSection[]} sections The current section list. + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. + * @param {InferFieldSection[]} 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" * @returns {string} The string value to render in the input. */ getV6InputValueFromSections: ( - sections: TSection[], + sections: InferFieldSection[], localizedDigits: string[], isRtl: boolean, ) => string; /** * Creates the string value to render in the input based on the current section list. - * @template TSection - * @param {TSection[]} sections The current section list. + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. + * @param {InferFieldSection[]} sections The current section list. * @returns {string} The string value to render in the input. */ - getV7HiddenInputValueFromSections: (sections: TSection[]) => string; + getV7HiddenInputValueFromSections: (sections: InferFieldSection[]) => string; /** * Returns the manager of the active date. - * @template TValue, TSection + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {MuiPickersAdapter} utils The utils to manipulate the date. - * @param {UseFieldState} state The current state of the field. - * @param {TSection} activeSection The active section. - * @returns {FieldActiveDateManager} The manager of the active date. + * @param {UseFieldState} state The current state of the field. + * @param {InferFieldSection} activeSection The active section. + * @returns {FieldActiveDateManager} The manager of the active date. */ getActiveDateManager: ( utils: MuiPickersAdapter, - state: UseFieldState, - activeSection: TSection, - ) => FieldActiveDateManager; + state: UseFieldState, + activeSection: InferFieldSection, + ) => FieldActiveDateManager; /** * Parses a string version (most of the time coming from the input). * This method should only be used when the change does not come from a single section. - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {string} valueStr The string value to parse. * @param {TValue} referenceValue The reference value currently stored in state. * @param {(dateStr: string, referenceDate: PickerValidDate) => PickerValidDate | null} parseDate A method to convert a string date into a parsed one. @@ -309,13 +308,13 @@ export interface FieldValueManager { */ parseValueStr: ( valueStr: string, - referenceValue: TValue, + referenceValue: InferNonNullablePickerValue, parseDate: (dateStr: string, referenceDate: PickerValidDate) => PickerValidDate | null, ) => TValue; /** * Update the reference value with the new value. * This method must make sure that no date inside the returned `referenceValue` is invalid. - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {MuiPickersAdapter} utils The utils to manipulate the date. * @param {TValue} value The new value from which we want to take all valid dates in the `referenceValue` state. * @param {TValue} prevReferenceValue The previous reference value. It is used as a fallback for invalid dates in the new value. @@ -324,18 +323,18 @@ export interface FieldValueManager { updateReferenceValue: ( utils: MuiPickersAdapter, value: TValue, - prevReferenceValue: TValue, - ) => TValue; + prevReferenceValue: InferNonNullablePickerValue, + ) => InferNonNullablePickerValue; } -export interface UseFieldState { +export interface UseFieldState { value: TValue; /** * Non-nullable value used to keep trace of the timezone and the date parts not present in the format. * It is updated whenever we have a valid date (for the range picker we update only the portion of the range that is valid). */ - referenceValue: TValue; - sections: TSection[]; + referenceValue: InferNonNullablePickerValue; + sections: InferFieldSection[]; /** * Android `onChange` behavior when the input selection is not empty is quite different from a desktop behavior. * There are two `onChange` calls: @@ -414,23 +413,16 @@ export interface UseFieldTextFieldInteractions { } export type UseFieldTextField = < - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TForwardedProps extends TEnableAccessibleFieldDOMStructure extends false ? UseFieldV6ForwardedProps : UseFieldV7ForwardedProps, - TInternalProps extends UseFieldInternalProps< - any, - any, - TEnableAccessibleFieldDOMStructure, - any - > & { + TInternalProps extends UseFieldInternalProps & { minutesStep?: number; }, >( params: UseFieldTextFieldParams< TValue, - TSection, TEnableAccessibleFieldDOMStructure, TForwardedProps, TInternalProps @@ -443,21 +435,19 @@ export type UseFieldTextField, + TInternalProps extends UseFieldInternalProps, > extends UseFieldParams< TValue, - TSection, TEnableAccessibleFieldDOMStructure, TForwardedProps, TInternalProps >, - UseFieldStateResponse, + UseFieldStateResponse, UseFieldCharacterEditingResponse { areAllSectionsEmpty: boolean; sectionOrder: SectionOrdering; 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 cae26f41e08db..65324fa47abdc 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 @@ -15,8 +15,10 @@ import { PickerValidDate, FieldSelectedSections, PickerValueType, + InferFieldSection, } from '../../../models'; import { getMonthsInYear } from '../../utils/date-utils'; +import { PickerValidValue } from '../../models'; export const getDateSectionConfigFromFormatToken = ( utils: MuiPickersAdapter, @@ -230,10 +232,10 @@ export const cleanDigitSectionValue = ( return applyLocalizedDigits(valueStr, localizedDigits); }; -export const adjustSectionValue = ( +export const adjustSectionValue = ( utils: MuiPickersAdapter, timezone: PickersTimezone, - section: TSection, + section: InferFieldSection, keyCode: AvailableAdjustKeyCode, sectionsValueBoundaries: FieldSectionsValueBoundaries, localizedDigits: string[], @@ -614,8 +616,8 @@ export const getSectionsBoundaries = ( let warnedOnceInvalidSection = false; -export const validateSections = ( - sections: TSection[], +export const validateSections = ( + sections: InferFieldSection[], valueType: PickerValueType, ) => { if (process.env.NODE_ENV !== 'production') { diff --git a/packages/x-date-pickers/src/internals/hooks/useField/useFieldCharacterEditing.ts b/packages/x-date-pickers/src/internals/hooks/useField/useFieldCharacterEditing.ts index 7e3ff21ee74f3..a348d3a396b65 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useFieldCharacterEditing.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useFieldCharacterEditing.ts @@ -1,6 +1,11 @@ import * as React from 'react'; import useEventCallback from '@mui/utils/useEventCallback'; -import { FieldSectionType, FieldSection, PickersTimezone } from '../../../models'; +import { + FieldSectionType, + FieldSection, + PickersTimezone, + InferFieldSection, +} from '../../../models'; import { useUtils } from '../useUtils'; import { FieldSectionsValueBoundaries } from './useField.types'; import { @@ -15,6 +20,7 @@ import { isStringNumber, } from './useField.utils'; import { UpdateSectionValueParams } from './useFieldState'; +import { PickerValidValue } from '../../models'; interface CharacterEditingQuery { value: string; @@ -27,9 +33,9 @@ export interface ApplyCharacterEditingParams { sectionIndex: number; } -interface UseFieldCharacterEditingParams { - sections: TSection[]; - updateSectionValue: (params: UpdateSectionValueParams) => void; +interface UseFieldCharacterEditingParams { + sections: InferFieldSection[]; + updateSectionValue: (params: UpdateSectionValueParams) => void; sectionsValueBoundaries: FieldSectionsValueBoundaries; localizedDigits: string[]; setTempAndroidValueStr: (newValue: string | null) => void; @@ -65,15 +71,15 @@ type CharacterEditingApplier = ( * If it returns `{ saveQuery: false }, * Then we do nothing. */ -type QueryApplier = ( +type QueryApplier = ( queryValue: string, - activeSection: TSection, + activeSection: InferFieldSection, ) => { sectionValue: string; shouldGoToNextSection: boolean } | { saveQuery: boolean }; const QUERY_LIFE_DURATION_MS = 5000; -const isQueryResponseWithoutValue = ( - response: ReturnType>, +const isQueryResponseWithoutValue = ( + response: ReturnType>, ): response is { saveQuery: boolean } => (response as { saveQuery: boolean }).saveQuery != null; /** @@ -83,14 +89,14 @@ const isQueryResponseWithoutValue = ( * 1. The numeric editing when the user presses a digit * 2. The letter editing when the user presses another key */ -export const useFieldCharacterEditing = ({ +export const useFieldCharacterEditing = ({ sections, updateSectionValue, sectionsValueBoundaries, localizedDigits, setTempAndroidValueStr, timezone, -}: UseFieldCharacterEditingParams): UseFieldCharacterEditingResponse => { +}: UseFieldCharacterEditingParams): UseFieldCharacterEditingResponse => { const utils = useUtils(); const [query, setQuery] = React.useState(null); @@ -117,7 +123,7 @@ export const useFieldCharacterEditing = ({ const applyQuery = ( { keyPressed, sectionIndex }: ApplyCharacterEditingParams, - getFirstSectionValueMatchingWithQuery: QueryApplier, + getFirstSectionValueMatchingWithQuery: QueryApplier, isValidQueryValue?: (queryValue: string) => boolean, ): ReturnType => { const cleanKeyPressed = keyPressed.toLowerCase(); @@ -170,7 +176,7 @@ export const useFieldCharacterEditing = ({ format: string, options: string[], queryValue: string, - ): ReturnType> => { + ): ReturnType> => { const matchingValues = options.filter((option) => option.toLowerCase().startsWith(queryValue), ); @@ -187,7 +193,7 @@ export const useFieldCharacterEditing = ({ const testQueryOnFormatAndFallbackFormat = ( queryValue: string, - activeSection: TSection, + activeSection: InferFieldSection, fallbackFormat?: string, formatFallbackValue?: (fallbackValue: string, fallbackOptions: string[]) => string, ) => { @@ -225,7 +231,7 @@ export const useFieldCharacterEditing = ({ return { saveQuery: false }; }; - const getFirstSectionValueMatchingWithQuery: QueryApplier = ( + const getFirstSectionValueMatchingWithQuery: QueryApplier = ( queryValue, activeSection, ) => { @@ -284,7 +290,7 @@ export const useFieldCharacterEditing = ({ | 'hasLeadingZerosInInput' | 'maxLength' >, - ): ReturnType> => { + ): ReturnType> => { const cleanQueryValue = removeLocalizedDigits(queryValue, localizedDigits); const queryValueNumber = Number(cleanQueryValue); const sectionBoundaries = sectionsValueBoundaries[section.type]({ @@ -319,7 +325,7 @@ export const useFieldCharacterEditing = ({ return { sectionValue: newSectionValue, shouldGoToNextSection }; }; - const getFirstSectionValueMatchingWithQuery: QueryApplier = ( + const getFirstSectionValueMatchingWithQuery: QueryApplier = ( queryValue, activeSection, ) => { 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 d89b552637ef8..a1f3842884f4c 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useFieldState.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useFieldState.ts @@ -22,23 +22,24 @@ import { } from './useField.utils'; import { buildSectionsFromFormat } from './buildSectionsFromFormat'; import { - FieldSection, FieldSelectedSections, PickersTimezone, PickerValidDate, InferError, + InferFieldSection, } from '../../../models'; import { useValueWithTimezone } from '../useValueWithTimezone'; import { GetDefaultReferenceDateProps, getSectionTypeGranularity, } from '../../utils/getDefaultReferenceDate'; +import { PickerValidValue } from '../../models'; -export interface UpdateSectionValueParams { +export interface UpdateSectionValueParams { /** * The section on which we want to apply the new value. */ - activeSection: TSection; + activeSection: InferFieldSection; /** * Value to apply to the active section. */ @@ -49,37 +50,38 @@ export interface UpdateSectionValueParams { shouldGoToNextSection: boolean; } -export interface UseFieldStateResponse { - state: UseFieldState; +export interface UseFieldStateResponse { + state: UseFieldState; activeSectionIndex: number | null; parsedSelectedSections: FieldParsedSelectedSections; setSelectedSections: (sections: FieldSelectedSections) => void; clearValue: () => void; clearActiveSection: () => void; - updateSectionValue: (params: UpdateSectionValueParams) => void; + updateSectionValue: (params: UpdateSectionValueParams) => void; updateValueFromValueStr: (valueStr: string) => void; setTempAndroidValueStr: (tempAndroidValueStr: string | null) => void; sectionsValueBoundaries: FieldSectionsValueBoundaries; - getSectionsFromValue: (value: TValue, fallbackSections?: TSection[] | null) => TSection[]; + getSectionsFromValue: ( + value: TValue, + fallbackSections?: InferFieldSection[] | null, + ) => InferFieldSection[]; localizedDigits: string[]; timezone: PickersTimezone; } export const useFieldState = < - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TEnableAccessibleFieldDOMStructure extends boolean, TForwardedProps extends UseFieldForwardedProps, - TInternalProps extends UseFieldInternalProps, + TInternalProps extends UseFieldInternalProps, >( params: UseFieldParams< TValue, - TSection, TEnableAccessibleFieldDOMStructure, TForwardedProps, TInternalProps >, -): UseFieldStateResponse => { +): UseFieldStateResponse => { const utils = useUtils(); const translations = usePickerTranslations(); const adapter = useLocalizationContext(); @@ -127,7 +129,7 @@ export const useFieldState = < ); const getSectionsFromValue = React.useCallback( - (value: TValue, fallbackSections: TSection[] | null = null) => + (value: TValue, fallbackSections: InferFieldSection[] | null = null) => fieldValueManager.getSectionsFromValue(utils, value, fallbackSections, (date) => buildSectionsFromFormat({ utils, @@ -154,14 +156,13 @@ export const useFieldState = < ], ); - const [state, setState] = React.useState>(() => { + const [state, setState] = React.useState>(() => { const sections = getSectionsFromValue(valueFromTheOutside); validateSections(sections, valueType); - const stateWithoutReferenceDate: UseFieldState = { + const stateWithoutReferenceDate: Omit, 'referenceValue'> = { sections, value: valueFromTheOutside, - referenceValue: valueManager.emptyValue, tempValueStrAndroid: null, }; @@ -204,7 +205,7 @@ export const useFieldState = < value, referenceValue, sections, - }: Pick, 'value' | 'referenceValue' | 'sections'>) => { + }: Pick, 'value' | 'referenceValue' | 'sections'>) => { setState((prevState) => ({ ...prevState, sections, @@ -310,7 +311,7 @@ export const useFieldState = < activeSection, newSectionValue, shouldGoToNextSection, - }: UpdateSectionValueParams) => { + }: UpdateSectionValueParams) => { /** * 1. Decide which section should be focused */ @@ -326,7 +327,7 @@ export const useFieldState = < const newActiveDateSections = activeDateManager.getSections(newSections); const newActiveDate = getDateFromDateSections(utils, newActiveDateSections, localizedDigits); - let values: Pick, 'value' | 'referenceValue'>; + let values: Pick, 'value' | 'referenceValue'>; let shouldPublish: 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 288b0ee44de97..719a6561ca6a5 100644 --- a/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts +++ b/packages/x-date-pickers/src/internals/hooks/useField/useFieldV6TextField.ts @@ -3,11 +3,12 @@ import { useRtl } from '@mui/system/RtlProvider'; import useEventCallback from '@mui/utils/useEventCallback'; import useForkRef from '@mui/utils/useForkRef'; import { UseFieldTextFieldInteractions, UseFieldTextField } from './useField.types'; -import { FieldSection } from '../../../models'; +import { InferFieldSection } from '../../../models'; import { getActiveElement } from '../../utils/utils'; import { getSectionVisibleValue, isAndroid } from './useField.utils'; +import { PickerValidValue } from '../../models'; -type FieldSectionWithPositions = TSection & { +type FieldSectionWithPositions = InferFieldSection & { /** * Start index of the section in the format */ @@ -30,14 +31,14 @@ type FieldSectionWithPositions = TSection & { const cleanString = (dirtyString: string) => dirtyString.replace(/[\u2066\u2067\u2068\u2069]/g, ''); -export const addPositionPropertiesToSections = ( - sections: TSection[], +export const addPositionPropertiesToSections = ( + sections: InferFieldSection[], localizedDigits: string[], isRtl: boolean, -): FieldSectionWithPositions[] => { +): FieldSectionWithPositions[] => { let position = 0; let positionInInput = isRtl ? 1 : 0; - const newSections: FieldSectionWithPositions[] = []; + const newSections: FieldSectionWithPositions[] = []; for (let i = 0; i < sections.length; i += 1) { const section = sections[i]; diff --git a/packages/x-date-pickers/src/internals/hooks/useFieldOwnerState.ts b/packages/x-date-pickers/src/internals/hooks/useFieldOwnerState.ts new file mode 100644 index 0000000000000..bc1c326465dd5 --- /dev/null +++ b/packages/x-date-pickers/src/internals/hooks/useFieldOwnerState.ts @@ -0,0 +1,19 @@ +import * as React from 'react'; +import { FieldOwnerState } from '../../models'; +import { FormProps } from '../models'; +import { usePickerPrivateContext } from './usePickerPrivateContext'; + +export function useFieldOwnerState(parameters: UseFieldOwnerStateParameters) { + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + + return React.useMemo( + () => ({ + ...pickerOwnerState, + isFieldDisabled: parameters.disabled ?? false, + isFieldReadOnly: parameters.readOnly ?? false, + }), + [pickerOwnerState, parameters.disabled, parameters.readOnly], + ); +} + +interface UseFieldOwnerStateParameters extends FormProps {} diff --git a/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.tsx b/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.tsx index 4809144aa6ea4..fc1ef14d56bef 100644 --- a/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.tsx +++ b/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.tsx @@ -7,8 +7,8 @@ import { UseMobilePickerParams, UseMobilePickerProps } from './useMobilePicker.t import { usePicker } from '../usePicker'; import { onSpaceOrEnter } from '../../utils/utils'; import { PickersLayout } from '../../../PickersLayout'; -import { FieldSection, PickerValidDate, FieldRef, InferError } from '../../../models'; -import { BaseSingleInputFieldProps, DateOrTimeViewWithMeridiem } from '../../models'; +import { FieldRef, InferError } from '../../../models'; +import { BaseSingleInputFieldProps, DateOrTimeViewWithMeridiem, PickerValue } from '../../models'; import { PickerProvider } from '../../components/PickerProvider'; /** @@ -50,7 +50,7 @@ export const useMobilePicker = < localeText, } = props; - const fieldRef = React.useRef>(null); + const fieldRef = React.useRef>(null); const labelId = useId(); const isToolbarHidden = innerSlotProps?.toolbar?.hidden ?? false; @@ -63,7 +63,7 @@ export const useMobilePicker = < renderCurrentView, fieldProps: pickerFieldProps, ownerState, - } = usePicker({ + } = usePicker({ ...pickerParams, props, fieldRef, @@ -75,8 +75,7 @@ export const useMobilePicker = < const Field = slots.field; const fieldProps: BaseSingleInputFieldProps< - PickerValidDate | null, - FieldSection, + PickerValue, TEnableAccessibleFieldDOMStructure, InferError > = useSlotProps({ diff --git a/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.types.ts b/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.types.ts index a811500a7a67c..edbfeef65b9df 100644 --- a/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.types.ts +++ b/packages/x-date-pickers/src/internals/hooks/useMobilePicker/useMobilePicker.types.ts @@ -1,6 +1,5 @@ import * as React from 'react'; -import TextField from '@mui/material/TextField'; -import { SlotComponentProps } from '@mui/utils'; +import type { TextFieldProps } from '@mui/material/TextField'; import { MakeRequired, SlotComponentPropsFromProps } from '@mui/x-internals/types'; import { BaseNonStaticPickerProps, @@ -13,7 +12,7 @@ import { } from '../../components/PickersModalDialog'; import { UsePickerParams } from '../usePicker'; import { - FieldSection, + FieldOwnerState, PickerFieldSlotProps, PickerOwnerState, PickerValidDate, @@ -24,12 +23,14 @@ import { PickersLayoutSlotProps, } from '../../../PickersLayout/PickersLayout.types'; import { UsePickerValueNonStaticProps } from '../usePicker/usePickerValue.types'; -import { UsePickerViewsNonStaticProps, UsePickerViewsProps } from '../usePicker/usePickerViews'; -import { DateOrTimeViewWithMeridiem } from '../../models'; +import { UsePickerViewsProps } from '../usePicker/usePickerViews'; +import { DateOrTimeViewWithMeridiem, PickerValue } from '../../models'; +import { PickersTextFieldProps } from '../../../PickersTextField'; +import { UsePickerProviderNonStaticProps } from '../usePicker/usePickerProvider'; export interface UseMobilePickerSlots extends PickersModalDialogSlots, - ExportedPickersLayoutSlots { + ExportedPickersLayoutSlots { /** * Component used to enter the date with the keyboard. */ @@ -45,33 +46,37 @@ export interface ExportedUseMobilePickerSlotProps< TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, > extends PickersModalDialogSlotProps, - ExportedPickersLayoutSlotProps { + ExportedPickersLayoutSlotProps { field?: SlotComponentPropsFromProps< - PickerFieldSlotProps, + PickerFieldSlotProps, {}, PickerOwnerState >; - textField?: SlotComponentProps>; + textField?: SlotComponentPropsFromProps< + PickersTextFieldProps | TextFieldProps, + {}, + FieldOwnerState + >; } export interface UseMobilePickerSlotProps< TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, > extends ExportedUseMobilePickerSlotProps, - Pick, 'toolbar'> {} + Pick, 'toolbar'> {} export interface MobileOnlyPickerProps extends BaseNonStaticPickerProps, BaseNonRangeNonStaticPickerProps, UsePickerValueNonStaticProps, - UsePickerViewsNonStaticProps {} + UsePickerProviderNonStaticProps {} export interface UseMobilePickerProps< TView extends DateOrTimeViewWithMeridiem, TEnableAccessibleFieldDOMStructure extends boolean, TError, TExternalProps extends UsePickerViewsProps, -> extends BasePickerProps, +> extends BasePickerProps, MakeRequired { /** * Overridable component slots. @@ -95,7 +100,7 @@ export interface UseMobilePickerParams< TExternalProps >, > extends Pick< - UsePickerParams, + UsePickerParams, 'valueManager' | 'valueType' | 'validator' > { props: TExternalProps; diff --git a/packages/x-date-pickers/src/internals/hooks/useOpenState.ts b/packages/x-date-pickers/src/internals/hooks/useOpenState.ts index 558814e5be267..93c9d7f733bcc 100644 --- a/packages/x-date-pickers/src/internals/hooks/useOpenState.ts +++ b/packages/x-date-pickers/src/internals/hooks/useOpenState.ts @@ -8,7 +8,7 @@ export interface OpenStateProps { export const useOpenState = ({ open, onOpen, onClose }: OpenStateProps) => { const isControllingOpenProp = React.useRef(typeof open === 'boolean').current; - const [openState, setIsOpenState] = React.useState(false); + const [openState, setOpenState] = React.useState(false); // It is required to update inner state in useEffect in order to avoid situation when // Our component is not mounted yet, but `open` state is set to `true` (for example initially opened) @@ -18,26 +18,27 @@ export const useOpenState = ({ open, onOpen, onClose }: OpenStateProps) => { throw new Error('You must not mix controlling and uncontrolled mode for `open` prop'); } - setIsOpenState(open); + setOpenState(open); } }, [isControllingOpenProp, open]); - const setIsOpen = React.useCallback( - (newIsOpen: boolean) => { + const setOpen = React.useCallback( + (action: React.SetStateAction) => { + const newOpen = typeof action === 'function' ? action(openState) : action; if (!isControllingOpenProp) { - setIsOpenState(newIsOpen); + setOpenState(newOpen); } - if (newIsOpen && onOpen) { + if (newOpen && onOpen) { onOpen(); } - if (!newIsOpen && onClose) { + if (!newOpen && onClose) { onClose(); } }, - [isControllingOpenProp, onOpen, onClose], + [isControllingOpenProp, onOpen, onClose, openState], ); - return { isOpen: openState, setIsOpen }; + return { open: openState, setOpen }; }; diff --git a/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.ts b/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.ts index 441295d6a64c6..8fff61acb1c9e 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.ts @@ -2,14 +2,13 @@ import { warnOnce } from '@mui/x-internals/warning'; import { UsePickerParams, UsePickerProps, UsePickerResponse } from './usePicker.types'; import { usePickerValue } from './usePickerValue'; import { usePickerViews } from './usePickerViews'; -import { FieldSection, InferError } from '../../../models'; -import { DateOrTimeViewWithMeridiem } from '../../models'; +import { InferError } from '../../../models'; +import { DateOrTimeViewWithMeridiem, PickerValidValue } from '../../models'; import { usePickerProvider } from './usePickerProvider'; export const usePicker = < - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, - TSection extends FieldSection, TExternalProps extends UsePickerProps, TAdditionalProps extends {}, >({ @@ -23,10 +22,9 @@ export const usePicker = < rendererInterceptor, fieldRef, localeText, -}: UsePickerParams): UsePickerResponse< +}: UsePickerParams): UsePickerResponse< TValue, TView, - TSection, InferError > => { if (process.env.NODE_ENV !== 'production') { @@ -38,7 +36,7 @@ export const usePicker = < ]); } } - const pickerValueResponse = usePickerValue({ + const pickerValueResponse = usePickerValue({ props, valueManager, valueType, @@ -46,13 +44,7 @@ export const usePicker = < validator, }); - const pickerViewsResponse = usePickerViews< - TValue, - TView, - TSection, - TExternalProps, - TAdditionalProps - >({ + const pickerViewsResponse = usePickerViews({ props, additionalViewProps, autoFocusView, @@ -63,11 +55,11 @@ export const usePicker = < const providerProps = usePickerProvider({ props, - pickerValueResponse, localeText, valueManager, variant, - views: pickerViewsResponse.views, + paramsFromUsePickerValue: pickerValueResponse.provider, + paramsFromUsePickerViews: pickerViewsResponse.provider, }); return { @@ -78,7 +70,7 @@ export const usePicker = < // Picker views renderCurrentView: pickerViewsResponse.renderCurrentView, - hasUIView: pickerViewsResponse.hasUIView, + hasUIView: pickerViewsResponse.provider.hasUIView, shouldRestoreFocus: pickerViewsResponse.shouldRestoreFocus, // Picker layout diff --git a/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.types.ts b/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.types.ts index 176ba741efc1b..d77e131106eb4 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.types.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePicker.types.ts @@ -10,8 +10,8 @@ import { UsePickerViewsResponse, UsePickerViewsBaseProps, } from './usePickerViews'; -import { FieldSection, PickerOwnerState } from '../../../models'; -import { DateOrTimeViewWithMeridiem } from '../../models'; +import { PickerOwnerState } from '../../../models'; +import { DateOrTimeViewWithMeridiem, PickerValidValue } from '../../models'; import { UsePickerProviderParameters, UsePickerProviderProps, @@ -22,7 +22,7 @@ import { * Props common to all picker headless implementations. */ export interface UsePickerBaseProps< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TError, TExternalProps extends UsePickerViewsProps, @@ -32,7 +32,7 @@ export interface UsePickerBaseProps< UsePickerProviderProps {} export interface UsePickerProps< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TError, TExternalProps extends UsePickerViewsProps, @@ -42,9 +42,8 @@ export interface UsePickerProps< UsePickerProviderProps {} export interface UsePickerParams< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, - TSection extends FieldSection, TExternalProps extends UsePickerProps, TAdditionalProps extends {}, > extends Pick< @@ -52,22 +51,23 @@ export interface UsePickerParams< 'valueManager' | 'valueType' | 'variant' | 'validator' >, Pick< - UsePickerViewParams, + UsePickerViewParams, 'additionalViewProps' | 'autoFocusView' | 'rendererInterceptor' | 'fieldRef' >, - Pick, 'localeText'> { + Pick, 'localeText'> { props: TExternalProps; } export interface UsePickerResponse< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, - TSection extends FieldSection, TError, -> extends Omit, 'viewProps' | 'layoutProps'>, - Omit, 'layoutProps' | 'views'> { +> extends Pick, 'open' | 'actions' | 'fieldProps'>, + Pick, 'shouldRestoreFocus' | 'renderCurrentView'> { ownerState: PickerOwnerState; providerProps: UsePickerProviderReturnValue; - layoutProps: UsePickerValueResponse['layoutProps'] & + layoutProps: UsePickerValueResponse['layoutProps'] & UsePickerViewsResponse['layoutProps']; + // TODO v8: Remove in https://github.com/mui/mui-x/pull/15671 + hasUIView: boolean; } diff --git a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerProvider.ts b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerProvider.ts index 9933c91bb14d7..10a3f4f0a50af 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerProvider.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerProvider.ts @@ -1,7 +1,7 @@ import * as React from 'react'; import useEnhancedEffect from '@mui/utils/useEnhancedEffect'; -import { FieldSection, PickerOwnerState } from '../../../models'; -import { PickerValueManager, UsePickerValueResponse } from './usePickerValue.types'; +import { PickerOwnerState } from '../../../models'; +import { PickerValueManager, UsePickerValueProviderParams } from './usePickerValue.types'; import { PickerProviderProps, PickerContextValue, @@ -12,10 +12,12 @@ import { DateOrTimeViewWithMeridiem, FormProps, PickerOrientation, + PickerValidValue, PickerVariant, } from '../../models'; import { useUtils } from '../useUtils'; import { arrayIncludes } from '../../utils/utils'; +import { UsePickerViewsProviderParams } from './usePickerViews'; function getOrientation(): PickerOrientation { if (typeof window === 'undefined') { @@ -58,22 +60,30 @@ export const usePickerOrientation = ( return customOrientation ?? orientation; }; -export function usePickerProvider( - parameters: UsePickerProviderParameters, -): UsePickerProviderReturnValue { - const { props, pickerValueResponse, valueManager, localeText, variant, views } = parameters; +export function usePickerProvider< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +>(parameters: UsePickerProviderParameters): UsePickerProviderReturnValue { + const { + props, + valueManager, + localeText, + variant, + paramsFromUsePickerValue, + paramsFromUsePickerViews, + } = parameters; const utils = useUtils(); - const orientation = usePickerOrientation(views, props.orientation); + const orientation = usePickerOrientation(paramsFromUsePickerViews.views, props.orientation); const ownerState = React.useMemo( () => ({ isPickerValueEmpty: valueManager.areValuesEqual( utils, - pickerValueResponse.viewProps.value, + paramsFromUsePickerValue.value, valueManager.emptyValue, ), - isPickerOpen: pickerValueResponse.open, + isPickerOpen: paramsFromUsePickerValue.contextValue.open, isPickerDisabled: props.disabled ?? false, isPickerReadOnly: props.readOnly ?? false, pickerOrientation: orientation, @@ -82,8 +92,8 @@ export function usePickerProvider( [ utils, valueManager, - pickerValueResponse.viewProps.value, - pickerValueResponse.open, + paramsFromUsePickerValue.value, + paramsFromUsePickerValue.contextValue.open, orientation, variant, props.disabled, @@ -93,23 +103,13 @@ export function usePickerProvider( const contextValue = React.useMemo( () => ({ - onOpen: pickerValueResponse.actions.onOpen, - onClose: pickerValueResponse.actions.onClose, - open: pickerValueResponse.open, + ...paramsFromUsePickerValue.contextValue, disabled: props.disabled ?? false, readOnly: props.readOnly ?? false, variant, orientation, }), - [ - pickerValueResponse.actions.onOpen, - pickerValueResponse.actions.onClose, - pickerValueResponse.open, - variant, - orientation, - props.disabled, - props.readOnly, - ], + [paramsFromUsePickerValue.contextValue, variant, orientation, props.disabled, props.readOnly], ); const privateContextValue = React.useMemo( @@ -124,19 +124,21 @@ export function usePickerProvider( }; } -export interface UsePickerProviderParameters - extends Pick { +export interface UsePickerProviderParameters< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> extends Pick { props: UsePickerProps; - pickerValueResponse: UsePickerValueResponse; valueManager: PickerValueManager; variant: PickerVariant; - views: readonly DateOrTimeViewWithMeridiem[]; + paramsFromUsePickerValue: UsePickerValueProviderParams; + paramsFromUsePickerViews: UsePickerViewsProviderParams; } export interface UsePickerProviderReturnValue extends Omit {} /** - * Props used to create the private context. + * Props used to create the picker's contexts. * Those props are exposed on all the pickers. */ export interface UsePickerProviderProps extends FormProps { @@ -145,3 +147,14 @@ export interface UsePickerProviderProps extends FormProps { */ orientation?: PickerOrientation; } + +/** + * Props used to create the picker's contexts and that are not available on static pickers. + */ +export interface UsePickerProviderNonStaticProps { + /** + * If `true`, the open picker button will not be rendered (renders only the field). + * @default false + */ + disableOpenPicker?: boolean; +} diff --git a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.ts b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.ts index 9814fcf8cf748..e973b01eaba34 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.ts @@ -4,7 +4,7 @@ import { useOpenState } from '../useOpenState'; import { useLocalizationContext, useUtils } from '../useUtils'; import { FieldChangeHandlerContext } from '../useField'; import { useValidation } from '../../../validation'; -import { FieldSection, PickerChangeHandlerContext, InferError } from '../../../models'; +import { PickerChangeHandlerContext, InferError } from '../../../models'; import { PickerShortcutChangeImportance, PickersShortcutsItemContext, @@ -21,14 +21,17 @@ import { UsePickerValueActions, PickerSelectionState, PickerValueUpdaterParams, + UsePickerValueContextValue, + UsePickerValueProviderParams, } from './usePickerValue.types'; import { useValueWithTimezone } from '../useValueWithTimezone'; +import { PickerValidValue } from '../../models'; /** * Decide if the new value should be published * The published value will be passed to `onChange` if defined. */ -const shouldPublishValue = ( +const shouldPublishValue = ( params: PickerValueUpdaterParams, ): boolean => { const { action, hasChanged, dateState, isControlled } = params; @@ -81,7 +84,7 @@ const shouldPublishValue = ( * The committed value will be passed to `onAccept` if defined. * It will also be used as a reset target when calling the `cancel` picker action (when clicking on the "Cancel" button). */ -const shouldCommitValue = ( +const shouldCommitValue = ( params: PickerValueUpdaterParams, ): boolean => { const { action, hasChanged, dateState, isControlled, closeOnSelect } = params; @@ -121,7 +124,7 @@ const shouldCommitValue = ( /** * Decide if the picker should be closed after the value is updated. */ -const shouldClosePicker = ( +const shouldClosePicker = ( params: PickerValueUpdaterParams, ): boolean => { const { action, closeOnSelect } = params; @@ -145,8 +148,7 @@ const shouldClosePicker = ( * Manage the value lifecycle of all the pickers. */ export const usePickerValue = < - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TExternalProps extends UsePickerValueProps, >({ props, @@ -156,7 +158,6 @@ export const usePickerValue = < validator, }: UsePickerValueParams): UsePickerValueResponse< TValue, - TSection, InferError > => { type TError = InferError; @@ -209,7 +210,7 @@ export const usePickerValue = < const utils = useUtils(); const adapter = useLocalizationContext(); - const { isOpen, setIsOpen } = useOpenState(props); + const { open, setOpen } = useOpenState(props); const { timezone, @@ -313,7 +314,7 @@ export const usePickerValue = < } if (shouldClose) { - setIsOpen(false); + setOpen(false); } }); @@ -380,12 +381,12 @@ export const usePickerValue = < const handleOpen = useEventCallback((event: React.UIEvent) => { event.preventDefault(); - setIsOpen(true); + setOpen(true); }); const handleClose = useEventCallback((event?: React.UIEvent) => { event?.preventDefault(); - setIsOpen(false); + setOpen(false); }); const handleChange = useEventCallback( @@ -422,21 +423,21 @@ export const usePickerValue = < onClose: handleClose, }; - const fieldResponse: UsePickerValueFieldResponse = { + const fieldResponse: UsePickerValueFieldResponse = { value: dateState.draft, onChange: handleChangeFromField, }; - const viewValue = React.useMemo( + const valueWithoutError = React.useMemo( () => valueManager.cleanValue(utils, dateState.draft), [utils, valueManager, dateState.draft], ); const viewResponse: UsePickerValueViewsResponse = { - value: viewValue, + value: valueWithoutError, onChange: handleChange, onClose: handleClose, - open: isOpen, + open, }; const isValid = (testedValue: TValue) => { @@ -452,17 +453,30 @@ export const usePickerValue = < const layoutResponse: UsePickerValueLayoutResponse = { ...actions, - value: viewValue, + value: valueWithoutError, onChange: handleChange, onSelectShortcut: handleSelectShortcut, isValid, }; + const contextValue = React.useMemo(() => { + return { + open, + setOpen, + }; + }, [open, setOpen]); + + const providerParams: UsePickerValueProviderParams = { + value: valueWithoutError, + contextValue, + }; + return { - open: isOpen, + open, fieldProps: fieldResponse, viewProps: viewResponse, layoutProps: layoutResponse, actions, + provider: providerParams, }; }; diff --git a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.types.ts b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.types.ts index decce9645687d..d58af8940c43a 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.types.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerValue.types.ts @@ -1,8 +1,8 @@ +import * as React from 'react'; import { FieldChangeHandlerContext, UseFieldInternalProps } from '../useField'; import { Validator } from '../../../validation'; import { PickerVariant } from '../../models/common'; import { - FieldSection, TimezoneProps, MuiPickersAdapter, PickersTimezone, @@ -17,11 +17,12 @@ import { PickerShortcutChangeImportance, PickersShortcutsItemContext, } from '../../../PickersShortcuts'; +import { InferNonNullablePickerValue, PickerValidValue } from '../../models'; -export interface PickerValueManager { +export interface PickerValueManager { /** * Determines if two values are equal. - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {MuiPickersAdapter} utils The adapter. * @param {TValue} valueLeft The first value to compare. * @param {TValue} valueRight The second value to compare. @@ -34,7 +35,7 @@ export interface PickerValueManager { emptyValue: TValue; /** * Method returning the value to set when clicking the "Today" button - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {MuiPickersAdapter} utils The adapter. * @param {PickersTimezone} timezone The current timezone. * @param {PickerValueType} valueType The type of the value being edited. @@ -46,7 +47,7 @@ export interface PickerValueManager { valueType: PickerValueType, ) => TValue; /** - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * Method returning the reference value to use when mounting the component. * @param {object} params The params of the method. * @param {PickerValidDate | undefined} params.referenceDate The referenceDate provided by the user. @@ -66,10 +67,10 @@ export interface PickerValueManager { granularity: number; timezone: PickersTimezone; getTodayDate?: () => PickerValidDate; - }) => TValue; + }) => InferNonNullablePickerValue; /** * Method parsing the input value to replace all invalid dates by `null`. - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {MuiPickersAdapter} utils The adapter. * @param {TValue} value The value to parse. * @returns {TValue} The value without invalid date. @@ -77,7 +78,7 @@ export interface PickerValueManager { cleanValue: (utils: MuiPickersAdapter, value: TValue) => TValue; /** * Generates the new value, given the previous value and the new proposed value. - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {MuiPickersAdapter} utils The adapter. * @param {TValue} lastValidDateValue The last valid value. * @param {TValue} value The proposed value. @@ -106,7 +107,7 @@ export interface PickerValueManager { /** * Return the timezone of the date inside a value. * Throw an error on range picker if both values don't have the same timezone. - @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. @param {MuiPickersAdapter} utils The utils to manipulate the date. @param {TValue} value The current value. @returns {string | null} The timezone of the current value. @@ -114,7 +115,7 @@ export interface PickerValueManager { getTimezone: (utils: MuiPickersAdapter, value: TValue) => string | null; /** * Change the timezone of the dates inside a value. - @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. @param {MuiPickersAdapter} utils The utils to manipulate the date. @param {PickersTimezone} timezone The current timezone. @param {TValue} value The value to convert. @@ -125,19 +126,19 @@ export interface PickerValueManager { export type PickerSelectionState = 'partial' | 'shallow' | 'finish'; -export interface UsePickerValueState { +export interface UsePickerValueState { /** * Date displayed on the views and the field. * It is updated whenever the user modifies something. */ draft: TValue; /** - * Last value published (e.g: the last value for which `shouldPublishValue` returned `true`). + * Last value published (the last value for which `shouldPublishValue` returned `true`). * If `onChange` is defined, it's the value that was passed on the last call to this callback. */ lastPublishedValue: TValue; /** - * Last value committed (e.g: the last value for which `shouldCommitValue` returned `true`). + * Last value committed (the last value for which `shouldCommitValue` returned `true`). * If `onAccept` is defined, it's the value that was passed on the last call to this callback. */ lastCommittedValue: TValue; @@ -156,12 +157,12 @@ export interface UsePickerValueState { hasBeenModifiedSinceMount: boolean; } -export interface PickerValueUpdaterParams { +export interface PickerValueUpdaterParams { action: PickerValueUpdateAction; dateState: UsePickerValueState; /** * Check if the new draft value has changed compared to some given value. - * @template TValue + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {TValue} comparisonValue The value to compare the new draft value with. * @returns {boolean} `true` if the new draft value is equal to the comparison value. */ @@ -170,7 +171,7 @@ export interface PickerValueUpdaterParams { closeOnSelect: boolean; } -export type PickerValueUpdateAction = +export type PickerValueUpdateAction = | { name: 'setValueFromView'; value: TValue; @@ -196,7 +197,8 @@ export type PickerValueUpdateAction = /** * Props used to handle the value that are common to all pickers. */ -export interface UsePickerValueBaseProps extends OnErrorProps { +export interface UsePickerValueBaseProps + extends OnErrorProps { /** * The selected value. * Used when the component is controlled. @@ -254,7 +256,7 @@ export interface UsePickerValueNonStaticProps { /** * Props used to handle the value of the pickers. */ -export interface UsePickerValueProps +export interface UsePickerValueProps extends UsePickerValueBaseProps, UsePickerValueNonStaticProps, TimezoneProps { @@ -263,7 +265,7 @@ export interface UsePickerValueProps } export interface UsePickerValueParams< - TValue, + TValue extends PickerValidValue, TExternalProps extends UsePickerValueProps, > { props: TExternalProps; @@ -283,14 +285,14 @@ export interface UsePickerValueActions { onClose: (event?: React.UIEvent) => void; } -export type UsePickerValueFieldResponse = Required< - Pick, 'value' | 'onChange'> +export type UsePickerValueFieldResponse = Required< + Pick, 'value' | 'onChange'> >; /** * Props passed to `usePickerViews`. */ -export interface UsePickerValueViewsResponse { +export interface UsePickerValueViewsResponse { value: TValue; onChange: (value: TValue, selectionState?: PickerSelectionState) => void; open: boolean; @@ -300,7 +302,8 @@ export interface UsePickerValueViewsResponse { /** * Props passed to `usePickerLayoutProps`. */ -export interface UsePickerValueLayoutResponse extends UsePickerValueActions { +export interface UsePickerValueLayoutResponse + extends UsePickerValueActions { value: TValue; onChange: (newValue: TValue) => void; onSelectShortcut: ( @@ -311,10 +314,37 @@ export interface UsePickerValueLayoutResponse extends UsePickerValueActi isValid: (value: TValue) => boolean; } -export interface UsePickerValueResponse { +/** + * Params passed to `usePickerProvider`. + */ +export interface UsePickerValueProviderParams { + value: TValue; + contextValue: UsePickerValueContextValue; +} + +export interface UsePickerValueResponse { open: boolean; actions: UsePickerValueActions; viewProps: UsePickerValueViewsResponse; - fieldProps: UsePickerValueFieldResponse; + fieldProps: UsePickerValueFieldResponse; layoutProps: UsePickerValueLayoutResponse; + provider: UsePickerValueProviderParams; +} + +export interface UsePickerValueContextValue { + /** + * Sets the current open state of the Picker. + * ```ts + * setOpen(true); // Opens the picker. + * setOpen(false); // Closes the picker. + * setOpen((prevOpen) => !prevOpen); // Toggles the open state. + * ``` + * @param {React.SetStateAction} action The new open state of the Picker. + * It can be a function that will receive the current open state. + */ + setOpen: React.Dispatch>; + /** + * `true` if the picker is open, `false` otherwise. + */ + open: boolean; } 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 2e5c4abab94ec..cf782eadbb9c8 100644 --- a/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerViews.ts +++ b/packages/x-date-pickers/src/internals/hooks/usePicker/usePickerViews.ts @@ -6,14 +6,19 @@ import useEventCallback from '@mui/utils/useEventCallback'; import { useViews, UseViewsOptions } from '../useViews'; import type { UsePickerValueViewsResponse } from './usePickerValue.types'; import { isTimeView } from '../../utils/time-utils'; -import { DateOrTimeViewWithMeridiem } from '../../models'; -import { FieldRef, FieldSection, PickerValidDate, TimezoneProps } from '../../../models'; +import { + DateOrTimeViewWithMeridiem, + PickerRangeValue, + PickerValidValue, + PickerValue, +} from '../../models'; +import { FieldRef, PickerValidDate, TimezoneProps } from '../../../models'; interface PickerViewsRendererBaseExternalProps extends Omit, 'openTo' | 'viewRenderers'> {} export type PickerViewsRendererProps< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TExternalProps extends PickerViewsRendererBaseExternalProps, TAdditionalProps extends {}, @@ -29,7 +34,7 @@ export type PickerViewsRendererProps< }; export type PickerViewRenderer< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TExternalProps extends PickerViewsRendererBaseExternalProps, TAdditionalProps extends {}, @@ -38,7 +43,7 @@ export type PickerViewRenderer< ) => React.ReactNode; export type PickerViewRendererLookup< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TExternalProps extends PickerViewsRendererBaseExternalProps, TAdditionalProps extends {}, @@ -50,7 +55,7 @@ export type PickerViewRendererLookup< * Props used to handle the views that are common to all pickers. */ export interface UsePickerViewsBaseProps< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TExternalProps extends UsePickerViewsProps, TAdditionalProps extends {}, @@ -73,22 +78,11 @@ export interface UsePickerViewsBaseProps< referenceDate?: PickerValidDate; } -/** - * Props used to handle the views of the pickers. - */ -export interface UsePickerViewsNonStaticProps { - /** - * If `true`, the open picker button will not be rendered (renders only the field). - * @default false - */ - disableOpenPicker?: boolean; -} - /** * Props used to handle the value of the pickers. */ export interface UsePickerViewsProps< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TExternalProps extends UsePickerViewsProps, TAdditionalProps extends {}, @@ -98,9 +92,8 @@ export interface UsePickerViewsProps< } export interface UsePickerViewParams< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, - TSection extends FieldSection, TExternalProps extends UsePickerViewsProps, TAdditionalProps extends {}, > { @@ -108,7 +101,7 @@ export interface UsePickerViewParams< propsFromPickerValue: UsePickerValueViewsResponse; additionalViewProps: TAdditionalProps; autoFocusView: boolean; - fieldRef: React.RefObject> | undefined; + fieldRef: React.RefObject | FieldRef> | undefined; /** * A function that intercepts the regular picker rendering. * Can be used to consume the provided `viewRenderers` and render a custom component wrapping them. @@ -125,14 +118,10 @@ export interface UsePickerViewParams< } export interface UsePickerViewsResponse { - /** - * Indicates if the the picker has at least one view that should be rendered in UI. - */ - hasUIView: boolean; - views: readonly TView[]; renderCurrentView: () => React.ReactNode; shouldRestoreFocus: () => boolean; layoutProps: UsePickerViewsLayoutResponse; + provider: UsePickerViewsProviderParams; } export interface UsePickerViewsLayoutResponse { @@ -141,6 +130,11 @@ export interface UsePickerViewsLayoutResponse { + hasUIView: boolean; + views: readonly TView[]; +} + /** * Manage the views of all the pickers: * - Handles the view switch @@ -148,9 +142,8 @@ export interface UsePickerViewsLayoutResponse, TAdditionalProps extends {}, >({ @@ -163,7 +156,6 @@ export const usePickerViews = < }: UsePickerViewParams< TValue, TView, - TSection, TExternalProps, TAdditionalProps >): UsePickerViewsResponse => { @@ -271,11 +263,15 @@ export const usePickerViews = < onViewChange: setView, }; - return { + const providerParams: UsePickerViewsProviderParams = { hasUIView, views, + }; + + return { shouldRestoreFocus, layoutProps, + provider: providerParams, renderCurrentView: () => { if (popperView == null) { return null; diff --git a/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.tsx b/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.tsx index 1464a724d965d..0aee5be03535e 100644 --- a/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.tsx +++ b/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.tsx @@ -6,8 +6,7 @@ import { usePicker } from '../usePicker'; import { PickerProvider } from '../../components/PickerProvider'; import { PickersLayout } from '../../../PickersLayout'; import { DIALOG_WIDTH } from '../../constants/dimensions'; -import { FieldSection, PickerValidDate } from '../../../models'; -import { DateOrTimeViewWithMeridiem } from '../../models'; +import { DateOrTimeViewWithMeridiem, PickerValue } from '../../models'; const PickerStaticLayout = styled(PickersLayout)(({ theme }) => ({ overflow: 'hidden', @@ -32,9 +31,8 @@ export const useStaticPicker = < const { localeText, slots, slotProps, className, sx, displayStaticWrapperAs, autoFocus } = props; const { layoutProps, providerProps, renderCurrentView } = usePicker< - PickerValidDate | null, + PickerValue, TView, - FieldSection, TExternalProps, {} >({ diff --git a/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.types.ts b/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.types.ts index 0b2af3ccd50d3..aecb74e3eae81 100644 --- a/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.types.ts +++ b/packages/x-date-pickers/src/internals/hooks/useStaticPicker/useStaticPicker.types.ts @@ -6,14 +6,13 @@ import { import { BasePickerProps } from '../../models/props/basePickerProps'; import { UsePickerParams } from '../usePicker'; import { UsePickerViewsProps } from '../usePicker/usePickerViews'; -import { FieldSection, PickerValidDate } from '../../../models'; -import { DateOrTimeViewWithMeridiem } from '../../models'; +import { DateOrTimeViewWithMeridiem, PickerValue } from '../../models'; export interface UseStaticPickerSlots - extends ExportedPickersLayoutSlots {} + extends ExportedPickersLayoutSlots {} export interface UseStaticPickerSlotProps - extends ExportedPickersLayoutSlotProps {} + extends ExportedPickersLayoutSlotProps {} export interface StaticOnlyPickerProps { /** @@ -37,8 +36,8 @@ export interface StaticOnlyPickerProps { export interface UseStaticPickerProps< TView extends DateOrTimeViewWithMeridiem, TError, - TExternalProps extends UsePickerViewsProps, -> extends BasePickerProps, + TExternalProps extends UsePickerViewsProps, +> extends BasePickerProps, StaticOnlyPickerProps { /** * Overridable component slots. @@ -56,7 +55,7 @@ export interface UseStaticPickerParams< TView extends DateOrTimeViewWithMeridiem, TExternalProps extends UseStaticPickerProps, > extends Pick< - UsePickerParams, + UsePickerParams, 'valueManager' | 'valueType' | 'validator' > { props: TExternalProps; diff --git a/packages/x-date-pickers/src/internals/hooks/useToolbarOwnerState.ts b/packages/x-date-pickers/src/internals/hooks/useToolbarOwnerState.ts new file mode 100644 index 0000000000000..1069c8d6cddc4 --- /dev/null +++ b/packages/x-date-pickers/src/internals/hooks/useToolbarOwnerState.ts @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { useRtl } from '@mui/system/RtlProvider'; +import { PickerOwnerState } from '../../models'; +import { usePickerPrivateContext } from './usePickerPrivateContext'; + +export function useToolbarOwnerState() { + const { ownerState: pickerOwnerState } = usePickerPrivateContext(); + const isRtl = useRtl(); + + return React.useMemo( + () => ({ + ...pickerOwnerState, + toolbarDirection: isRtl ? 'rtl' : 'ltr', + }), + [pickerOwnerState, isRtl], + ); +} + +export interface PickerToolbarOwnerState extends PickerOwnerState { + /** + * The direction of the toolbar. + * Is equal to "ltr" when the toolbar is in left-to-right direction. + * Is equal to "rtl" when the toolbar is in right-to-left direction. + */ + toolbarDirection: 'ltr' | 'rtl'; +} diff --git a/packages/x-date-pickers/src/internals/hooks/useValueWithTimezone.ts b/packages/x-date-pickers/src/internals/hooks/useValueWithTimezone.ts index 852ad3dc5c8d2..e54a757521c8b 100644 --- a/packages/x-date-pickers/src/internals/hooks/useValueWithTimezone.ts +++ b/packages/x-date-pickers/src/internals/hooks/useValueWithTimezone.ts @@ -4,13 +4,17 @@ import useControlled from '@mui/utils/useControlled'; import { useUtils } from './useUtils'; import type { PickerValueManager } from './usePicker'; import { PickersTimezone, PickerValidDate } from '../../models'; +import { PickerValidValue } from '../models'; /** * Hooks making sure that: * - The value returned by `onChange` always have the timezone of `props.value` or `props.defaultValue` if defined * - The value rendered is always the one from `props.timezone` if defined */ -export const useValueWithTimezone = void>({ +export const useValueWithTimezone = < + TValue extends PickerValidValue, + TChange extends (...params: any[]) => void, +>({ timezone: timezoneProp, value: valueProp, defaultValue, @@ -63,7 +67,10 @@ export const useValueWithTimezone = void>({ +export const useControlledValueWithTimezone = < + TValue extends PickerValidValue, + TChange extends (...params: any[]) => void, +>({ name, timezone: timezoneProp, value: valueProp, @@ -94,7 +101,10 @@ export const useControlledValueWithTimezone = void> { +interface UseValueWithTimezoneParameters< + TValue extends PickerValidValue, + TChange extends (...params: any[]) => void, +> { timezone: PickersTimezone | undefined; value: TValue | undefined; defaultValue: TValue | undefined; @@ -109,7 +119,7 @@ interface UseValueWithTimezoneParameters void, > extends UseValueWithTimezoneParameters { name: string; diff --git a/packages/x-date-pickers/src/internals/hooks/useViews.tsx b/packages/x-date-pickers/src/internals/hooks/useViews.tsx index cf72cc620f301..b26dc412b36c5 100644 --- a/packages/x-date-pickers/src/internals/hooks/useViews.tsx +++ b/packages/x-date-pickers/src/internals/hooks/useViews.tsx @@ -3,7 +3,7 @@ import useEventCallback from '@mui/utils/useEventCallback'; import useControlled from '@mui/utils/useControlled'; import { MakeOptional } from '@mui/x-internals/types'; import type { PickerSelectionState } from './usePicker'; -import { DateOrTimeViewWithMeridiem } from '../models'; +import { DateOrTimeViewWithMeridiem, PickerValidValue } from '../models'; import { PickerValidDate } from '../../models'; export type PickerOnChangeFn = ( @@ -11,7 +11,10 @@ export type PickerOnChangeFn = ( selectionState?: PickerSelectionState, ) => void; -export interface UseViewsOptions { +export interface UseViewsOptions< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> { /** * Callback fired when the value changes. * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. @@ -63,12 +66,17 @@ export interface UseViewsOptions void; } -export interface ExportedUseViewsOptions - extends MakeOptional, 'onChange' | 'openTo' | 'views'> {} +export interface ExportedUseViewsOptions< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> extends MakeOptional, 'onChange' | 'openTo' | 'views'> {} let warnedOnceNotValidView = false; -interface UseViewsResponse { +interface UseViewsResponse< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> { view: TView; setView: (view: TView) => void; focusedView: TView | null; @@ -84,7 +92,10 @@ interface UseViewsResponse { ) => void; } -export function useViews({ +export function useViews< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +>({ onChange, onViewChange, openTo, diff --git a/packages/x-date-pickers/src/internals/index.ts b/packages/x-date-pickers/src/internals/index.ts index 58791c5d2476e..d96774401a835 100644 --- a/packages/x-date-pickers/src/internals/index.ts +++ b/packages/x-date-pickers/src/internals/index.ts @@ -64,6 +64,7 @@ export type { FieldChangeHandler, FieldChangeHandlerContext, } from './hooks/useField'; +export { useFieldOwnerState } from './hooks/useFieldOwnerState'; export type { MobileOnlyPickerProps } from './hooks/useMobilePicker'; export { usePicker } from './hooks/usePicker'; export type { @@ -79,11 +80,11 @@ export type { PickerSelectionState, } from './hooks/usePicker/usePickerValue.types'; export type { - UsePickerViewsNonStaticProps, PickerViewRendererLookup, PickerViewRenderer, UsePickerViewsProps, } from './hooks/usePicker/usePickerViews'; +export type { UsePickerProviderNonStaticProps } from './hooks/usePicker/usePickerProvider'; export { usePickerPrivateContext } from './hooks/usePickerPrivateContext'; export { useStaticPicker } from './hooks/useStaticPicker'; export type { @@ -91,12 +92,15 @@ export type { UseStaticPickerSlots, UseStaticPickerSlotProps, } from './hooks/useStaticPicker'; +export { useToolbarOwnerState } from './hooks/useToolbarOwnerState'; +export type { PickerToolbarOwnerState } from './hooks/useToolbarOwnerState'; export { useLocalizationContext, useDefaultDates, useUtils, useNow } from './hooks/useUtils'; export type { ExportedUseViewsOptions, UseViewsOptions } from './hooks/useViews'; export { useViews } from './hooks/useViews'; export { usePreviousMonthDisabled, useNextMonthDisabled } from './hooks/date-helpers-hooks'; -export type { BaseSingleInputFieldProps } from './models/fields'; +export type { RangePosition } from './models/pickers'; +export type { BaseSingleInputFieldProps, FieldRangeSection } from './models/fields'; export type { BasePickerProps, BasePickerInputProps, @@ -120,7 +124,13 @@ export type { DayValidationProps, DateTimeValidationProps, } from './models/validation'; -export type { PickerRangeValue } from './models/value'; +export type { + PickerValue, + PickerRangeValue, + PickerNonNullableRangeValue, + InferNonNullablePickerValue, + PickerValidValue, +} from './models/value'; export { convertFieldResponseIntoMuiTextFieldProps } from './utils/convertFieldResponseIntoMuiTextFieldProps'; export { @@ -160,3 +170,5 @@ export type { ExportedDateCalendarProps } from '../DateCalendar/DateCalendar.typ export { useCalendarState } from '../DateCalendar/useCalendarState'; export { isInternalTimeView, isTimeView } from './utils/time-utils'; + +export { DateTimePickerToolbarForceDesktopVariant } from '../DateTimePicker/DateTimePickerToolbar'; diff --git a/packages/x-date-pickers/src/internals/models/common.ts b/packages/x-date-pickers/src/internals/models/common.ts index 6c4a62e47d9ee..9177f67af4bdd 100644 --- a/packages/x-date-pickers/src/internals/models/common.ts +++ b/packages/x-date-pickers/src/internals/models/common.ts @@ -2,7 +2,7 @@ import { DateView, TimeView } from '../../models/views'; export type PickerOrientation = 'portrait' | 'landscape'; -export type PickerVariant = 'mobile' | 'desktop' | null; +export type PickerVariant = 'mobile' | 'desktop'; export type TimeViewWithMeridiem = TimeView | 'meridiem'; diff --git a/packages/x-date-pickers/src/internals/models/fields.ts b/packages/x-date-pickers/src/internals/models/fields.ts index 5e8e5102cf3e5..b7476ca12f049 100644 --- a/packages/x-date-pickers/src/internals/models/fields.ts +++ b/packages/x-date-pickers/src/internals/models/fields.ts @@ -7,6 +7,12 @@ import type { } from '../../hooks/useClearableField'; import type { FieldSection, PickerOwnerState } from '../../models'; import type { UseFieldInternalProps } from '../hooks/useField'; +import { RangePosition } from './pickers'; +import { PickerValidValue } from './value'; + +export interface FieldRangeSection extends FieldSection { + dateName: RangePosition; +} export interface BaseForwardedSingleInputFieldProps extends ExportedUseClearableFieldProps { className: string | undefined; @@ -39,13 +45,12 @@ export interface BaseForwardedSingleInputFieldProps extends ExportedUseClearable * Only contains what the MUI components are passing to the field, not what users can pass using the `props.slotProps.field`. */ export type BaseSingleInputFieldProps< - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TEnableAccessibleFieldDOMStructure extends boolean, TError, > = MakeRequired< Pick< - UseFieldInternalProps, + UseFieldInternalProps, | 'readOnly' | 'disabled' | 'format' diff --git a/packages/x-date-pickers/src/internals/models/pickers.ts b/packages/x-date-pickers/src/internals/models/pickers.ts new file mode 100644 index 0000000000000..ff214a929bb75 --- /dev/null +++ b/packages/x-date-pickers/src/internals/models/pickers.ts @@ -0,0 +1 @@ +export type RangePosition = 'start' | 'end'; diff --git a/packages/x-date-pickers/src/internals/models/props/basePickerProps.tsx b/packages/x-date-pickers/src/internals/models/props/basePickerProps.tsx index c271a53229884..c4fef0bdaa157 100644 --- a/packages/x-date-pickers/src/internals/models/props/basePickerProps.tsx +++ b/packages/x-date-pickers/src/internals/models/props/basePickerProps.tsx @@ -7,12 +7,13 @@ import { PickersInputComponentLocaleText } from '../../../locales/utils/pickersL import type { UsePickerViewsProps } from '../../hooks/usePicker/usePickerViews'; import { DateOrTimeViewWithMeridiem } from '../common'; import { UseFieldInternalProps } from '../../hooks/useField'; +import { PickerValidValue } from '../value'; /** * Props common to all pickers after applying the default props on each picker. */ export interface BasePickerProps< - TValue, + TValue extends PickerValidValue, TView extends DateOrTimeViewWithMeridiem, TError, TExternalProps extends UsePickerViewsProps, @@ -33,8 +34,11 @@ export interface BasePickerProps< /** * Props common to all pickers before applying the default props on each picker. */ -export interface BasePickerInputProps - extends Omit< +export interface BasePickerInputProps< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, + TError, +> extends Omit< MakeOptional, 'openTo' | 'views'>, 'viewRenderers' > {} @@ -46,7 +50,7 @@ export interface BasePickerInputProps, + UseFieldInternalProps, | 'formatDensity' | 'enableAccessibleFieldDOMStructure' | 'selectedSections' diff --git a/packages/x-date-pickers/src/internals/models/props/time.ts b/packages/x-date-pickers/src/internals/models/props/time.ts index 1036bc0aeb33b..81583861b148d 100644 --- a/packages/x-date-pickers/src/internals/models/props/time.ts +++ b/packages/x-date-pickers/src/internals/models/props/time.ts @@ -6,6 +6,7 @@ import type { ExportedUseViewsOptions } from '../../hooks/useViews'; import { TimeViewWithMeridiem } from '../common'; import { ExportedValidateTimeProps } from '../../../validation/validateTime'; import { FormProps } from '../formProps'; +import { PickerValue } from '../value'; export interface AmPmProps { /** @@ -21,7 +22,7 @@ export interface ExportedBaseClockProps AmPmProps {} export interface BaseClockProps - extends ExportedUseViewsOptions, + extends ExportedUseViewsOptions, ExportedBaseClockProps, FormProps { className?: string; diff --git a/packages/x-date-pickers/src/internals/models/props/toolbar.ts b/packages/x-date-pickers/src/internals/models/props/toolbar.ts index de6a20208448a..9b0a82632df99 100644 --- a/packages/x-date-pickers/src/internals/models/props/toolbar.ts +++ b/packages/x-date-pickers/src/internals/models/props/toolbar.ts @@ -2,9 +2,12 @@ import * as React from 'react'; import { SxProps } from '@mui/system'; import { Theme } from '@mui/material/styles'; import { DateOrTimeViewWithMeridiem } from '../common'; +import { PickerValidValue } from '../value'; -export interface BaseToolbarProps - extends ExportedBaseToolbarProps { +export interface BaseToolbarProps< + TValue extends PickerValidValue, + TView extends DateOrTimeViewWithMeridiem, +> extends ExportedBaseToolbarProps { isLandscape: boolean; onChange: (newValue: TValue) => void; value: TValue; diff --git a/packages/x-date-pickers/src/internals/models/value.ts b/packages/x-date-pickers/src/internals/models/value.ts index 7429c2df5c390..e5500f488ec96 100644 --- a/packages/x-date-pickers/src/internals/models/value.ts +++ b/packages/x-date-pickers/src/internals/models/value.ts @@ -1,5 +1,22 @@ import { PickerValidDate } from '../../models/pickers'; +/** + * The type that the `value` and `defaultValue` props can receive on non-range components (date, time and date-time). + */ export type PickerValue = PickerValidDate | null; +/** + * The type that the `value` and `defaultValue` props can receive on range components (date-range, time-range and date-time-range). + */ export type PickerRangeValue = [PickerValidDate | null, PickerValidDate | null]; + +export type PickerNonNullableRangeValue = [PickerValidDate, PickerValidDate]; + +export type PickerValidValue = PickerValue | PickerRangeValue; + +export type InferNonNullablePickerValue = + TValue extends PickerRangeValue + ? TValue extends PickerValue + ? PickerValidDate | PickerNonNullableRangeValue + : PickerNonNullableRangeValue + : PickerValidDate; diff --git a/packages/x-date-pickers/src/internals/utils/date-utils.ts b/packages/x-date-pickers/src/internals/utils/date-utils.ts index bdd7540c6f5cd..299afe36e2842 100644 --- a/packages/x-date-pickers/src/internals/utils/date-utils.ts +++ b/packages/x-date-pickers/src/internals/utils/date-utils.ts @@ -110,7 +110,11 @@ export const applyDefaultDate = ( return value; }; -export const areDatesEqual = (utils: MuiPickersAdapter, a: PickerValidDate, b: PickerValidDate) => { +export const areDatesEqual = ( + utils: MuiPickersAdapter, + a: PickerValidDate | null, + b: PickerValidDate | null, +) => { if (!utils.isValid(a) && a != null && !utils.isValid(b) && b != null) { return true; } diff --git a/packages/x-date-pickers/src/internals/utils/valueManagers.ts b/packages/x-date-pickers/src/internals/utils/valueManagers.ts index 3e507fe925c14..ae9a8d91ad703 100644 --- a/packages/x-date-pickers/src/internals/utils/valueManagers.ts +++ b/packages/x-date-pickers/src/internals/utils/valueManagers.ts @@ -1,10 +1,5 @@ import type { PickerValueManager } from '../hooks/usePicker'; -import { - DateValidationError, - TimeValidationError, - DateTimeValidationError, - FieldSection, -} from '../../models'; +import { DateValidationError, TimeValidationError, DateTimeValidationError } from '../../models'; import type { FieldValueManager } from '../hooks/useField'; import { areDatesEqual, getTodayDate, replaceInvalidDateByNull } from './date-utils'; import { getDefaultReferenceDate } from './getDefaultReferenceDate'; @@ -12,11 +7,11 @@ import { createDateStrForV7HiddenInputFromSections, createDateStrForV6InputFromSections, } from '../hooks/useField/useField.utils'; +import { PickerValue } from '../models'; export type SingleItemPickerValueManager< - TValue = any, TError extends DateValidationError | TimeValidationError | DateTimeValidationError = any, -> = PickerValueManager; +> = PickerValueManager; export const singleItemValueManager: SingleItemPickerValueManager = { emptyValue: null, @@ -43,7 +38,7 @@ export const singleItemValueManager: SingleItemPickerValueManager = { value == null ? null : utils.setTimezone(value, timezone), }; -export const singleItemFieldValueManager: FieldValueManager = { +export const singleItemFieldValueManager: FieldValueManager = { updateReferenceValue: (utils, value, prevReferenceValue) => value == null || !utils.isValid(value) ? prevReferenceValue : value, getSectionsFromValue: (utils, date, prevSections, getSectionsFromDate) => { @@ -53,7 +48,7 @@ export const singleItemFieldValueManager: FieldValueManager = return prevSections; } - return getSectionsFromDate(date); + return getSectionsFromDate(date!); }, getV7HiddenInputValueFromSections: createDateStrForV7HiddenInputFromSections, getV6InputValueFromSections: createDateStrForV6InputFromSections, diff --git a/packages/x-date-pickers/src/locales/roRO.ts b/packages/x-date-pickers/src/locales/roRO.ts index d14bca8bc3b71..a48ecad511185 100644 --- a/packages/x-date-pickers/src/locales/roRO.ts +++ b/packages/x-date-pickers/src/locales/roRO.ts @@ -26,10 +26,10 @@ const roROPickers: Partial = { // DateRange labels start: 'Început', end: 'Sfârșit', - // startDate: 'Start date', - // startTime: 'Start time', - // endDate: 'End date', - // endTime: 'End time', + startDate: 'Data de început', + startTime: 'Ora de început', + endDate: 'Data de sfârșit', + endTime: 'Ora de sfârșit', // Action bar cancelButtonLabel: 'Anulare', @@ -74,24 +74,24 @@ const roROPickers: Partial = { fieldYearPlaceholder: (params) => 'A'.repeat(params.digitAmount), fieldMonthPlaceholder: (params) => (params.contentType === 'letter' ? 'LLLL' : 'LL'), fieldDayPlaceholder: () => 'ZZ', - // fieldWeekDayPlaceholder: params => params.contentType === 'letter' ? 'EEEE' : 'EE', + fieldWeekDayPlaceholder: (params) => (params.contentType === 'letter' ? 'ZZZZ' : 'ZZ'), fieldHoursPlaceholder: () => 'hh', fieldMinutesPlaceholder: () => 'mm', fieldSecondsPlaceholder: () => 'ss', fieldMeridiemPlaceholder: () => 'aa', // View names - // year: 'Year', - // month: 'Month', - // day: 'Day', - // weekDay: 'Week day', - // hours: 'Hours', - // minutes: 'Minutes', - // seconds: 'Seconds', - // meridiem: 'Meridiem', + year: 'An', + month: 'Luna', + day: 'Ziua', + weekDay: 'Ziua saptămânii', + hours: 'Ore', + minutes: 'Minute', + seconds: 'Secunde', + meridiem: 'Meridiem', // Common - // empty: 'Empty', + empty: 'Gol', }; export const roRO = getPickersLocalization(roROPickers); diff --git a/packages/x-date-pickers/src/models/adapters.ts b/packages/x-date-pickers/src/models/adapters.ts index 3f038b208532e..e82d805226c7f 100644 --- a/packages/x-date-pickers/src/models/adapters.ts +++ b/packages/x-date-pickers/src/models/adapters.ts @@ -233,7 +233,7 @@ export interface MuiPickersAdapter { */ is12HourCycleInCurrentLocale(): boolean; /** - * Create a format with no meta-token (e.g: `LLL` or `PP`). + * Create a format with no meta-token (for example: `LLL` or `PP`). * @param {string} format The format to expand. * @returns {string} The expanded format. */ @@ -266,7 +266,7 @@ export interface MuiPickersAdapter { */ formatNumber(numberToFormat: string): string; /** - * Check if the two dates are equal (e.g: they represent the same timestamp). + * Check if the two dates are equal (which means they represent the same timestamp). * @param {PickerValidDate | null} value The reference date. * @param {PickerValidDate | null} comparing The date to compare with the reference date. * @returns {boolean} `true` if the two dates are equal. @@ -464,7 +464,7 @@ export interface MuiPickersAdapter { */ getMonth(value: PickerValidDate): number; /** - * Get the date (e.g: the day in the month) of the given date. + * Get the date (day in the month) of the given date. * @param {PickerValidDate} value The given date. * @returns {number} The date of the given date. */ @@ -508,7 +508,7 @@ export interface MuiPickersAdapter { */ setMonth(value: PickerValidDate, month: number): PickerValidDate; /** - * Set the date (e.g: the day in the month) to the given date. + * Set the date (day in the month) to the given date. * @param {PickerValidDate} value The date to be changed. * @param {number} date The date of the new date. * @returns {PickerValidDate} The new date with the date set. diff --git a/packages/x-date-pickers/src/models/fields.ts b/packages/x-date-pickers/src/models/fields.ts index aaff817b403ea..05c0c4e0460ff 100644 --- a/packages/x-date-pickers/src/models/fields.ts +++ b/packages/x-date-pickers/src/models/fields.ts @@ -7,7 +7,13 @@ import type { import { ExportedPickersSectionListProps } from '../PickersSectionList'; import type { UseFieldInternalProps, UseFieldResponse } from '../internals/hooks/useField'; import type { PickersTextFieldProps } from '../PickersTextField'; -import { BaseForwardedSingleInputFieldProps } from '../internals/models'; +import { + BaseForwardedSingleInputFieldProps, + FieldRangeSection, + PickerRangeValue, + PickerValidValue, +} from '../internals/models'; +import { PickerOwnerState } from './pickers'; // Update PickersComponentAgnosticLocaleText -> viewNames when adding new entries export type FieldSectionType = @@ -86,12 +92,22 @@ export interface FieldSection { endSeparator: string; } -export interface FieldRef { +// If `PickerValidDate` contains `any`, then `TValue extends PickerRangeValue` will return true, so we have to handle this edge case first. +type IsAny = boolean extends (T extends never ? true : false) ? true : false; + +export type InferFieldSection = + IsAny extends true + ? FieldSection + : TValue extends PickerRangeValue + ? FieldRangeSection + : FieldSection; + +export interface FieldRef { /** * Returns the sections of the current value. - * @returns {TSection[]} The sections of the current value. + * @returns {InferFieldSection[]} The sections of the current value. */ - getSections: () => TSection[]; + getSections: () => InferFieldSection[]; /** * Returns the index of the active section (the first focused section). * If no section is active, returns `null`. @@ -117,16 +133,26 @@ export interface FieldRef { export type FieldSelectedSections = number | FieldSectionType | null | 'all'; +export interface FieldOwnerState extends PickerOwnerState { + /** + * `true` if the field is disabled, `false` otherwise. + */ + isFieldDisabled: boolean; + /** + * `true` if the field is read-only, `false` otherwise. + */ + isFieldReadOnly: boolean; +} + /** * Props the prop `slotProps.field` of a picker can receive. */ export type PickerFieldSlotProps< - TValue, - TSection extends FieldSection, + TValue extends PickerValidValue, TEnableAccessibleFieldDOMStructure extends boolean, > = ExportedUseClearableFieldProps & Pick< - UseFieldInternalProps, + UseFieldInternalProps, 'shouldRespectLeadingZeros' | 'readOnly' > & React.HTMLAttributes & { diff --git a/packages/x-date-pickers/src/models/validation.ts b/packages/x-date-pickers/src/models/validation.ts index 5dcee050db5ff..04833a901699c 100644 --- a/packages/x-date-pickers/src/models/validation.ts +++ b/packages/x-date-pickers/src/models/validation.ts @@ -1,3 +1,5 @@ +import type { PickerValidValue } from '../internals/models'; + /** * Validation error types applicable to both date and time validation */ @@ -22,7 +24,7 @@ export type TimeValidationError = export type DateTimeValidationError = DateValidationError | TimeValidationError; -export interface OnErrorProps { +export interface OnErrorProps { /** * Callback fired when the error associated with the current value changes. * When a validation error is detected, the `error` parameter contains a non-null value. diff --git a/packages/x-date-pickers/src/themeAugmentation/overrides.d.ts b/packages/x-date-pickers/src/themeAugmentation/overrides.d.ts index 0a845aa4d33d5..085620287683f 100644 --- a/packages/x-date-pickers/src/themeAugmentation/overrides.d.ts +++ b/packages/x-date-pickers/src/themeAugmentation/overrides.d.ts @@ -57,13 +57,13 @@ export interface PickersComponentNameToClassKey { MuiPickersCalendarHeader: PickersCalendarHeaderClassKey; MuiPickersDay: PickersDayClassKey; MuiPickersFadeTransitionGroup: PickersFadeTransitionGroupClassKey; + MuiPickersLayout: PickersLayoutClassKey; MuiPickersMonth: PickersMonthClassKey; MuiPickersPopper: PickersPopperClassKey; MuiPickersSlideTransition: PickersSlideTransitionClassKey; MuiPickersToolbar: PickersToolbarClassKey; MuiPickersToolbarButton: PickersToolbarButtonClassKey; MuiPickersToolbarText: PickersToolbarTextClassKey; - MuiPickersLayout: PickersLayoutClassKey; MuiPickersYear: PickersYearClassKey; MuiTimeClock: TimeClockClassKey; MuiTimePickerToolbar: TimePickerToolbarClassKey; diff --git a/packages/x-date-pickers/src/themeAugmentation/props.d.ts b/packages/x-date-pickers/src/themeAugmentation/props.d.ts index 9fb69436bbad1..f5bdfe45dadea 100644 --- a/packages/x-date-pickers/src/themeAugmentation/props.d.ts +++ b/packages/x-date-pickers/src/themeAugmentation/props.d.ts @@ -52,6 +52,7 @@ import { PickersFilledInputProps, } from '../PickersTextField'; import { PickersSectionListProps } from '../PickersSectionList'; +import { PickerValidValue } from '../internals/models'; export interface PickersComponentsPropsList { MuiClock: ClockProps; @@ -77,10 +78,10 @@ export interface PickersComponentsPropsList { MuiPickersMonth: ExportedPickersMonthProps; MuiPickersPopper: PickerPopperProps; MuiPickersSlideTransition: ExportedSlideTransitionProps; - MuiPickersToolbar: PickersToolbarProps; + MuiPickersToolbar: PickersToolbarProps; MuiPickersToolbarButton: PickersToolbarButtonProps; MuiPickersToolbarText: ExportedPickersToolbarTextProps; - MuiPickersLayout: PickersLayoutProps; + MuiPickersLayout: PickersLayoutProps; MuiPickersYear: ExportedPickersYearProps; MuiTimeClock: TimeClockProps; MuiTimeField: TimeFieldProps; diff --git a/packages/x-date-pickers/src/validation/useValidation.ts b/packages/x-date-pickers/src/validation/useValidation.ts index b09787bed9f03..f9708c1f63632 100644 --- a/packages/x-date-pickers/src/validation/useValidation.ts +++ b/packages/x-date-pickers/src/validation/useValidation.ts @@ -5,8 +5,9 @@ import { useLocalizationContext } from '../internals/hooks/useUtils'; import { MuiPickersAdapterContextValue } from '../LocalizationProvider/LocalizationProvider'; import { OnErrorProps, PickersTimezone } from '../models'; import type { PickerValueManager } from '../internals/hooks/usePicker'; +import { PickerValidValue } from '../internals/models'; -export type Validator = { +export type Validator = { (params: { adapter: MuiPickersAdapterContextValue; value: TValue; @@ -16,7 +17,7 @@ export type Validator = { valueManager: PickerValueManager; }; -interface UseValidationOptions +interface UseValidationOptions extends OnErrorProps { /** * The value to validate. @@ -40,7 +41,7 @@ interface UseValidationOptions props: TValidationProps; } -interface UseValidationReturnValue { +interface UseValidationReturnValue { /** * The validation error associated to the value passed to the `useValidation` hook. */ @@ -54,7 +55,7 @@ interface UseValidationReturnValue { /** * Get the validation error for a new value. * This can be used to validate the value in a change handler before updating the state. - * @template TValue The value type. + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @param {TValue} newValue The value to validate. * @returns {TError} The validation error associated to the new value. */ @@ -63,7 +64,7 @@ interface UseValidationReturnValue { /** * Utility hook to check if a given value is valid based on the provided validation props. - * @template TValue The value type. It will be either the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. + * @template TValue The value type. It will be the same type as `value` or `null`. It can be in `[start, end]` format in case of range value. * @template TError The validation error type. It will be either `string` or a `null`. It can be in `[start, end]` format in case of range value. * @param {UseValidationOptions} options The options to configure the hook. * @param {TValue} options.value The value to validate. @@ -72,7 +73,7 @@ interface UseValidationReturnValue { * @param {TValidationProps} options.props The validation props, they differ depending on the component. * @param {(error: TError, value: TValue) => void} options.onError Callback fired when the error associated with the current value changes. */ -export function useValidation( +export function useValidation( options: UseValidationOptions, ): UseValidationReturnValue { const { props, validator, value, timezone, onError } = options; diff --git a/packages/x-date-pickers/src/validation/validateDate.ts b/packages/x-date-pickers/src/validation/validateDate.ts index aae7114967d87..055fa29f7a209 100644 --- a/packages/x-date-pickers/src/validation/validateDate.ts +++ b/packages/x-date-pickers/src/validation/validateDate.ts @@ -6,9 +6,10 @@ import { MonthValidationProps, YearValidationProps, } from '../internals/models/validation'; -import { DateValidationError, PickerValidDate } from '../models'; +import { DateValidationError } from '../models'; import { applyDefaultDate } from '../internals/utils/date-utils'; import { singleItemValueManager } from '../internals/utils/valueManagers'; +import { PickerValue } from '../internals/models'; /** * Validation props used by the Date Picker, Date Field and Date Calendar components. @@ -30,11 +31,12 @@ export interface ValidateDateProps */ export type ValidateDatePropsToDefault = keyof BaseDateValidationProps; -export const validateDate: Validator< - PickerValidDate | null, - DateValidationError, - ValidateDateProps -> = ({ props, value, timezone, adapter }): DateValidationError => { +export const validateDate: Validator = ({ + props, + value, + timezone, + adapter, +}): DateValidationError => { if (value === null) { return null; } diff --git a/packages/x-date-pickers/src/validation/validateDateTime.ts b/packages/x-date-pickers/src/validation/validateDateTime.ts index f1827fc83b727..66d898275339c 100644 --- a/packages/x-date-pickers/src/validation/validateDateTime.ts +++ b/packages/x-date-pickers/src/validation/validateDateTime.ts @@ -11,9 +11,10 @@ import { ValidateTimeProps, ValidateTimePropsToDefault, } from './validateTime'; -import { DateTimeValidationError, PickerValidDate } from '../models'; +import { DateTimeValidationError } from '../models'; import { singleItemValueManager } from '../internals/utils/valueManagers'; import { DateTimeValidationProps } from '../internals/models/validation'; +import { PickerValue } from '../internals/models'; /** * Validation props used by the Date Time Picker and Date Time Field components. @@ -36,7 +37,7 @@ export type ValidateDateTimePropsToDefault = | ValidateTimePropsToDefault; export const validateDateTime: Validator< - PickerValidDate | null, + PickerValue, DateTimeValidationError, ValidateDateTimeProps > = ({ adapter, value, timezone, props }) => { diff --git a/packages/x-date-pickers/src/validation/validateTime.ts b/packages/x-date-pickers/src/validation/validateTime.ts index c27c31e5614e5..72982ea2184a6 100644 --- a/packages/x-date-pickers/src/validation/validateTime.ts +++ b/packages/x-date-pickers/src/validation/validateTime.ts @@ -2,8 +2,9 @@ import type { MakeRequired } from '@mui/x-internals/types'; import { createIsAfterIgnoreDatePart } from '../internals/utils/time-utils'; import { Validator } from './useValidation'; import { BaseTimeValidationProps, TimeValidationProps } from '../internals/models/validation'; -import { PickerValidDate, TimeValidationError } from '../models'; +import { TimeValidationError } from '../models'; import { singleItemValueManager } from '../internals/utils/valueManagers'; +import { PickerValue } from '../internals/models'; /** * Validation props used by the Time Picker, Time Field and Clock components. @@ -21,11 +22,12 @@ export interface ValidateTimeProps */ export type ValidateTimePropsToDefault = keyof BaseTimeValidationProps; -export const validateTime: Validator< - PickerValidDate | null, - TimeValidationError, - ValidateTimeProps -> = ({ adapter, value, timezone, props }): TimeValidationError => { +export const validateTime: Validator = ({ + adapter, + value, + timezone, + props, +}): TimeValidationError => { if (value === null) { return null; } diff --git a/packages/x-internals/package.json b/packages/x-internals/package.json index 3ed76021fadc1..a2e4c1120b30f 100644 --- a/packages/x-internals/package.json +++ b/packages/x-internals/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-internals", - "version": "8.0.0-alpha.1", + "version": "8.0.0-alpha.2", "description": "Utility functions for the MUI X packages (internal use only).", "author": "MUI Team", "license": "MIT", @@ -48,7 +48,7 @@ "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", + "@mui/internal-test-utils": "^1.0.22", "rimraf": "^6.0.1" }, "engines": { diff --git a/packages/x-license/package.json b/packages/x-license/package.json index e6d7023472722..548e705bccc8a 100644 --- a/packages/x-license/package.json +++ b/packages/x-license/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-license", - "version": "8.0.0-alpha.1", + "version": "8.0.0-alpha.2", "description": "MUI X License verification", "author": "MUI Team", "main": "src/index.ts", @@ -41,7 +41,7 @@ "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", + "@mui/internal-test-utils": "^1.0.22", "rimraf": "^6.0.1" }, "engines": { diff --git a/packages/x-tree-view-pro/package.json b/packages/x-tree-view-pro/package.json index aec8767f29bb7..8efd242872f9a 100644 --- a/packages/x-tree-view-pro/package.json +++ b/packages/x-tree-view-pro/package.json @@ -1,6 +1,6 @@ { "name": "@mui/x-tree-view-pro", - "version": "8.0.0-alpha.1", + "version": "8.0.0-alpha.2", "description": "The Pro plan edition of the Tree View components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -53,7 +53,7 @@ "prop-types": "^15.8.1", "react-transition-group": "^4.4.5", "reselect": "^5.1.1", - "use-sync-external-store": "^1.2.2" + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@emotion/react": "^11.9.0", @@ -72,10 +72,10 @@ } }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", - "@mui/material": "^5.16.7", - "@mui/system": "^5.16.7", - "@types/prop-types": "^15.7.13", + "@mui/internal-test-utils": "^1.0.22", + "@mui/material": "^5.16.9", + "@mui/system": "^5.16.8", + "@types/prop-types": "^15.7.14", "@types/use-sync-external-store": "^0.0.6", "rimraf": "^6.0.1" }, diff --git a/packages/x-tree-view/package.json b/packages/x-tree-view/package.json index 80b3589a8738f..11a0ca2d1e997 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": "8.0.0-alpha.1", + "version": "8.0.0-alpha.2", "description": "The community edition of the Tree View components (MUI X).", "author": "MUI Team", "main": "src/index.ts", @@ -51,7 +51,7 @@ "prop-types": "^15.8.1", "react-transition-group": "^4.4.5", "reselect": "^5.1.1", - "use-sync-external-store": "^1.2.2" + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@emotion/react": "^11.9.0", @@ -70,10 +70,10 @@ } }, "devDependencies": { - "@mui/internal-test-utils": "^1.0.21", - "@mui/material": "^5.16.7", - "@mui/system": "^5.16.7", - "@types/prop-types": "^15.7.13", + "@mui/internal-test-utils": "^1.0.22", + "@mui/material": "^5.16.9", + "@mui/system": "^5.16.8", + "@types/prop-types": "^15.7.14", "@types/use-sync-external-store": "^0.0.6", "rimraf": "^6.0.1" }, 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 65bd886fa1ee1..abcc58481b359 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 @@ -110,10 +110,30 @@ interface UseTreeViewItemsEventLookup { export interface UseTreeViewItemsState { items: { + /** + * If `true`, will allow focus on disabled items. + * Always equal to `props.disabledItemsFocusable` (or `false` if not provided). + */ disabledItemsFocusable: boolean; - itemModelLookup: TreeViewItemModelLookup; - itemMetaLookup: TreeViewItemMetaLookup; + /** + * Model of each item as provided by `props.items` or by imperative items updates. + * It is not updated when properties derived from the model are updated: + * - when the label of an item is updated, `itemMetaLookup` is updated, not `itemModelLookup`. + * - when the children of an item are updated, `itemOrderedChildrenIdsLookup` and `itemChildrenIndexesLookup` are updated, not `itemModelLookup`. + * This means that the `children`, `label` or `id` properties of an item model should never be used directly, always use the structured sub-states instead. + */ + itemModelLookup: { [itemId: string]: TreeViewBaseItem }; + /** + * Meta data of each item. + */ + itemMetaLookup: { [itemId: string]: TreeViewItemMeta }; + /** + * Ordered children ids of each item. + */ itemOrderedChildrenIdsLookup: { [parentItemId: string]: string[] }; + /** + * Index of each child in the ordered children ids of its parent. + */ itemChildrenIndexesLookup: { [parentItemId: string]: { [itemId: string]: number } }; }; } @@ -133,7 +153,3 @@ export type UseTreeViewItemsSignature = TreeViewPluginSignature<{ state: UseTreeViewItemsState; contextValue: UseTreeViewItemsContextValue; }>; - -export type TreeViewItemMetaLookup = { [itemId: string]: TreeViewItemMeta }; - -export type TreeViewItemModelLookup = { [itemId: string]: TreeViewBaseItem }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 515139eb6c944..7f7adde337980 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: overrides: react-is: ^18.3.1 - '@types/node': ^20.17.7 + '@types/node': ^20.17.9 patchedDependencies: babel-plugin-replace-imports@1.0.2: @@ -27,11 +27,11 @@ importers: specifier: ^6.0.0 version: 6.0.0 '@argos-ci/core': - specifier: ^2.11.0 - version: 2.11.0 + specifier: ^2.12.0 + version: 2.12.0 '@babel/cli': - specifier: ^7.25.9 - version: 7.25.9(@babel/core@7.26.0) + specifier: ^7.26.4 + version: 7.26.4(@babel/core@7.26.0) '@babel/core': specifier: ^7.26.0 version: 7.26.0 @@ -60,8 +60,8 @@ importers: specifier: ^7.26.0 version: 7.26.0(@babel/core@7.26.0) '@babel/preset-react': - specifier: ^7.25.9 - version: 7.25.9(@babel/core@7.26.0) + specifier: ^7.26.3 + version: 7.26.3(@babel/core@7.26.0) '@babel/preset-typescript': specifier: ^7.26.0 version: 7.26.0(@babel/core@7.26.0) @@ -69,44 +69,44 @@ importers: specifier: ^7.25.9 version: 7.25.9(@babel/core@7.26.0) '@babel/traverse': - specifier: ^7.25.9 - version: 7.25.9 + specifier: ^7.26.4 + version: 7.26.4 '@babel/types': - specifier: ^7.26.0 - version: 7.26.0 + specifier: ^7.26.3 + version: 7.26.3 '@emotion/cache': - specifier: ^11.13.1 - version: 11.13.1 + specifier: ^11.13.5 + version: 11.13.5 '@emotion/react': - specifier: ^11.13.3 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + specifier: ^11.13.5 + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': - specifier: ^11.13.0 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^11.13.5 + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/icons-material': - specifier: ^5.16.7 - version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/internal-babel-plugin-resolve-imports': specifier: 1.0.18 version: 1.0.18(@babel/core@7.26.0) '@mui/internal-markdown': - specifier: ^1.0.20 - version: 1.0.20 + specifier: ^1.0.22 + version: 1.0.22 '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/monorepo': - specifier: github:mui/material-ui#f706939f7ce7fd90d8d4436515d752daff7395c6 - version: https://codeload.github.com/mui/material-ui/tar.gz/f706939f7ce7fd90d8d4436515d752daff7395c6(encoding@0.1.13) + specifier: github:mui/material-ui#454a4c081a3cda665d5e608e1fc3d600d14eee53 + version: https://codeload.github.com/mui/material-ui/tar.gz/454a4c081a3cda665d5e608e1fc3d600d14eee53(encoding@0.1.13) '@mui/utils': - specifier: ^5.16.6 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@next/eslint-plugin-next': - specifier: 15.0.3 - version: 15.0.3 + specifier: 15.0.4 + version: 15.0.4 '@octokit/plugin-retry': specifier: ^7.1.2 version: 7.1.2(@octokit/core@4.2.4(encoding@0.1.13)) @@ -114,8 +114,8 @@ importers: specifier: ^21.0.2 version: 21.0.2 '@playwright/test': - specifier: ^1.44.1 - version: 1.44.1 + specifier: ^1.49.0 + version: 1.49.0 '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 @@ -141,17 +141,14 @@ importers: specifier: ^10.0.10 version: 10.0.10 '@types/node': - specifier: ^20.17.7 - version: 20.17.7 + specifier: ^20.17.9 + version: 20.17.9 '@types/react': - specifier: ^18.3.12 - version: 18.3.12 + specifier: ^18.3.14 + version: 18.3.14 '@types/react-dom': - specifier: ^18.3.1 - version: 18.3.1 - '@types/react-test-renderer': - specifier: ^18.3.0 - version: 18.3.0 + specifier: ^18.3.2 + version: 18.3.2 '@types/requestidlecallback': specifier: ^0.3.7 version: 0.3.7 @@ -175,7 +172,7 @@ importers: version: 4.10.2 babel-loader: specifier: ^9.2.1 - version: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1) + version: 9.2.1(@babel/core@7.26.0)(webpack@5.97.1) babel-plugin-istanbul: specifier: ^7.0.0 version: 7.0.0 @@ -205,7 +202,7 @@ importers: version: 1.12.0(chai@4.5.0) compression-webpack-plugin: specifier: ^11.1.0 - version: 11.1.0(webpack@5.96.1) + version: 11.1.0(webpack@5.97.1) concurrently: specifier: ^9.1.0 version: 9.1.0 @@ -229,7 +226,7 @@ importers: version: 8.57.1 eslint-config-airbnb: specifier: ^19.0.4 - version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@5.0.0(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1) + version: 19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@5.1.0(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1) eslint-config-airbnb-typescript: specifier: ^18.0.0 version: 18.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.1) @@ -238,7 +235,7 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-import-resolver-webpack: specifier: ^0.13.9 - version: 0.13.9(eslint-plugin-import@2.31.0)(webpack@5.96.1) + version: 0.13.9(eslint-plugin-import@2.31.0)(webpack@5.97.1) eslint-plugin-filenames: specifier: ^1.3.2 version: 1.3.2(eslint@8.57.1) @@ -246,8 +243,8 @@ importers: specifier: ^2.31.0 version: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1) eslint-plugin-jsdoc: - specifier: ^50.5.0 - version: 50.5.0(eslint@8.57.1) + specifier: ^50.6.0 + version: 50.6.0(eslint@8.57.1) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@8.57.1) @@ -259,19 +256,19 @@ importers: version: 10.5.0(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.2.1 - version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) + version: 5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) eslint-plugin-react: specifier: ^7.37.2 version: 7.37.2(eslint@8.57.1) eslint-plugin-react-compiler: - specifier: 19.0.0-beta-a7bf2bd-20241110 - version: 19.0.0-beta-a7bf2bd-20241110(eslint@8.57.1) + specifier: 19.0.0-beta-df7b47d-20241124 + version: 19.0.0-beta-df7b47d-20241124(eslint@8.57.1) eslint-plugin-react-hooks: - specifier: ^5.0.0 - version: 5.0.0(eslint@8.57.1) + specifier: ^5.1.0 + version: 5.1.0(eslint@8.57.1) eslint-plugin-testing-library: - specifier: ^7.0.0 - version: 7.0.0(eslint@8.57.1)(typescript@5.7.2) + specifier: ^7.1.1 + version: 7.1.1(eslint@8.57.1)(typescript@5.7.2) fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -289,10 +286,10 @@ importers: version: 14.0.2 html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.96.1) + version: 5.6.3(webpack@5.97.1) jsdom: - specifier: 24.1.3 - version: 24.1.3 + specifier: 25.0.1 + version: 25.0.1 jss: specifier: ^10.10.0 version: 10.10.0 @@ -319,10 +316,10 @@ importers: version: 0.4.0 karma-webpack: specifier: ^5.0.1 - version: 5.0.1(webpack@5.96.1) + version: 5.0.1(webpack@5.97.1) lerna: specifier: ^8.1.9 - version: 8.1.9(@swc/core@1.7.35(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13) + version: 8.1.9(@swc/core@1.9.3(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -342,11 +339,11 @@ importers: specifier: ^17.1.0 version: 17.1.0 prettier: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.4.2 + version: 3.4.2 pretty-quick: specifier: ^4.0.0 - version: 4.0.0(prettier@3.3.3) + version: 4.0.0(prettier@3.4.2) process: specifier: ^0.11.10 version: 0.11.10 @@ -373,10 +370,10 @@ importers: version: 3.0.0 string-replace-loader: specifier: ^3.1.0 - version: 3.1.0(webpack@5.96.1) + version: 3.1.0(webpack@5.97.1) terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.10(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack@5.96.1) + version: 5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack@5.97.1) tsx: specifier: ^4.19.2 version: 4.19.2 @@ -390,14 +387,14 @@ importers: specifier: ^0.12.5 version: 0.12.5 webpack: - specifier: ^5.96.1 - version: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + specifier: ^5.97.1 + version: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) webpack-bundle-analyzer: specifier: ^4.10.2 version: 4.10.2 webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1) + version: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1) yargs: specifier: ^17.7.2 version: 17.7.2 @@ -415,46 +412,46 @@ importers: version: 7.26.0 '@docsearch/react': specifier: ^3.8.0 - version: 3.8.0(@algolia/client-search@5.12.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0) + version: 3.8.0(@algolia/client-search@5.15.0)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) '@emotion/cache': - specifier: ^11.13.1 - version: 11.13.1 + specifier: ^11.13.5 + version: 11.13.5 '@emotion/react': - specifier: ^11.13.3 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + specifier: ^11.13.5 + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/server': specifier: ^11.11.0 version: 11.11.0 '@emotion/styled': - specifier: ^11.13.0 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^11.13.5 + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/docs': - specifier: 6.1.8 - version: 6.1.8(5mdjhfhz45wjjqmb34n5tm4y5u) + specifier: 6.1.10 + version: 6.1.10(4eqodambaf55mpgx5qj7mrivui) '@mui/icons-material': - specifier: ^5.16.7 - version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/joy': specifier: ^5.0.0-beta.48 - version: 5.0.0-beta.48(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.48(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/lab': specifier: ^5.0.0-alpha.173 - version: 5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.0-alpha.174(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material-nextjs': - specifier: ^5.16.6 - version: 5.16.6(@emotion/cache@11.13.1)(@emotion/server@11.11.0)(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(next@14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/cache@11.13.5)(@emotion/server@11.11.0)(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(next@14.2.20(@babel/core@7.26.0)(@playwright/test@1.49.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@mui/styles': - specifier: ^5.16.7 - version: 5.16.7(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@types/react@18.3.14)(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': - specifier: ^5.16.6 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-charts': specifier: workspace:* version: link:../packages/x-charts/build @@ -486,8 +483,8 @@ importers: specifier: ^9.7.5 version: 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/query-core': - specifier: ^5.60.5 - version: 5.60.5 + specifier: ^5.62.3 + version: 5.62.3 ast-types: specifier: ^0.14.2 version: 0.14.2 @@ -561,8 +558,8 @@ importers: specifier: ^1.5.0 version: 1.5.0 markdown-to-jsx: - specifier: ^7.6.2 - version: 7.6.2(react@18.3.1) + specifier: ^7.7.1 + version: 7.7.1(react@18.3.1) moment: specifier: ^2.30.1 version: 2.30.1 @@ -576,8 +573,8 @@ importers: specifier: ^0.5.46 version: 0.5.46 next: - specifier: ^14.2.18 - version: 14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^14.2.20 + version: 14.2.20(@babel/core@7.26.0)(@playwright/test@1.49.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nprogress: specifier: ^0.2.0 version: 0.2.0 @@ -600,17 +597,17 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-hook-form: - specifier: ^7.53.2 - version: 7.53.2(react@18.3.1) + specifier: ^7.54.0 + version: 7.54.0(react@18.3.1) react-is: specifier: ^18.3.1 version: 18.3.1 react-router: - specifier: ^6.27.0 - version: 6.27.0(react@18.3.1) + specifier: ^6.28.0 + version: 6.28.0(react@18.3.1) react-router-dom: - specifier: ^6.27.0 - version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^6.28.0 + version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-runner: specifier: ^1.0.5 version: 1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -649,11 +646,11 @@ importers: specifier: ^7.26.0 version: 7.26.0(@babel/core@7.26.0) '@mui/internal-docs-utils': - specifier: ^1.0.15 - version: 1.0.15 + specifier: ^1.0.16 + version: 1.0.16 '@mui/internal-scripts': - specifier: ^1.0.27 - version: 1.0.27 + specifier: ^1.0.29 + version: 1.0.29 '@types/chance': specifier: ^1.1.6 version: 1.1.6 @@ -661,8 +658,8 @@ importers: specifier: ^4.0.8 version: 4.0.8 '@types/d3-scale-chromatic': - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.1.0 + version: 3.1.0 '@types/doctrine': specifier: ^0.0.9 version: 0.0.9 @@ -682,20 +679,20 @@ importers: specifier: ^0.7.9 version: 0.7.9 '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 '@types/react-dom': - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^18.3.2 + version: 18.3.2 '@types/react-router-dom': specifier: ^5.3.3 version: 5.3.3 '@types/stylis': - specifier: ^4.2.6 - version: 4.2.6 + specifier: ^4.2.7 + version: 4.2.7 '@types/webpack-bundle-analyzer': specifier: ^4.7.0 - version: 4.7.0(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + version: 4.7.0(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) gm: specifier: ^1.25.0 version: 1.25.0 @@ -728,8 +725,8 @@ importers: specifier: ^10.0.10 version: 10.0.10 '@types/node': - specifier: ^20.17.7 - version: 20.17.7 + specifier: ^20.17.9 + version: 20.17.9 packages/x-charts: dependencies: @@ -738,13 +735,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-charts-vendor': specifier: workspace:* version: link:../x-charts-vendor @@ -773,18 +770,18 @@ importers: specifier: ^5.1.1 version: 5.1.1 use-sync-external-store: - specifier: ^1.0.0 - version: 1.2.2(react@18.3.1) + specifier: ^1.4.0 + version: 1.4.0(react@18.3.1) devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@react-spring/core': specifier: ^9.7.5 version: 9.7.5(react@18.3.1) @@ -792,8 +789,8 @@ importers: specifier: ^9.7.5 version: 9.7.5(react@18.3.1) '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 '@types/use-sync-external-store': specifier: ^0.0.6 version: 0.0.6 @@ -812,13 +809,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-charts': specifier: workspace:* version: link:../x-charts/build @@ -851,11 +848,11 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@react-spring/core': specifier: ^9.7.5 version: 9.7.5(react@18.3.1) @@ -863,8 +860,8 @@ importers: specifier: ^9.7.5 version: 9.7.5(react@18.3.1) '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 csstype: specifier: ^3.1.3 version: 3.1.3 @@ -894,8 +891,8 @@ importers: specifier: ^3.1.6 version: 3.1.6 '@types/d3-time': - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.0.4 + version: 3.0.4 d3-color: specifier: ^3.1.0 version: 3.1.0 @@ -949,8 +946,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 execa: - specifier: ^9.5.1 - version: 9.5.1 + specifier: ^9.5.2 + version: 9.5.2 internmap: specifier: ^2.0.3 version: 2.0.3 @@ -967,8 +964,8 @@ importers: specifier: ^7.26.0 version: 7.26.0 '@babel/traverse': - specifier: ^7.25.9 - version: 7.25.9 + specifier: ^7.26.4 + version: 7.26.4 '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1000,13 +997,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1027,23 +1024,23 @@ importers: version: 5.1.1 devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/joy': specifier: ^5.0.0-beta.48 - version: 5.0.0-beta.48(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.0-beta.48(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/types': specifier: ^7.2.15 - version: 7.2.15(@types/react@18.3.12) + version: 7.2.19(@types/react@18.3.14) '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1056,10 +1053,10 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/x-data-grid-premium': specifier: workspace:* version: link:../x-data-grid-premium/build @@ -1077,11 +1074,11 @@ importers: version: 18.3.1 devDependencies: '@mui/icons-material': - specifier: ^5.16.7 - version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/chance': specifier: ^1.1.6 version: 1.1.6 @@ -1097,13 +1094,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-data-grid': specifier: workspace:* version: link:../x-data-grid/build @@ -1139,17 +1136,17 @@ importers: version: 5.1.1 devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 date-fns: specifier: ^2.30.0 version: 2.30.0 @@ -1165,13 +1162,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-data-grid': specifier: workspace:* version: link:../x-data-grid/build @@ -1201,17 +1198,17 @@ importers: version: 5.1.1 devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1224,13 +1221,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1254,14 +1251,14 @@ importers: version: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@types/luxon': specifier: ^3.4.2 version: 3.4.2 @@ -1272,8 +1269,8 @@ importers: specifier: ^0.7.9 version: 0.7.9 '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 date-fns: specifier: ^2.30.0 version: 2.30.0 @@ -1310,13 +1307,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-date-pickers': specifier: workspace:* version: link:../x-date-pickers/build @@ -1349,20 +1346,20 @@ importers: version: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@types/luxon': specifier: ^3.4.2 version: 3.4.2 '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 date-fns: specifier: ^2.30.0 version: 2.30.0 @@ -1390,14 +1387,14 @@ importers: version: 7.26.0 '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) react: specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 version: 18.3.1 devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1410,14 +1407,14 @@ importers: version: 7.26.0 '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) react: specifier: ^17.0.0 || ^18.0.0 || ^19.0.0 version: 18.3.1 devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1430,13 +1427,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1462,21 +1459,21 @@ importers: specifier: ^5.1.1 version: 5.1.1 use-sync-external-store: - specifier: ^1.2.2 - version: 1.2.2(react@18.3.1) + specifier: ^1.4.0 + version: 1.4.0(react@18.3.1) devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 '@types/use-sync-external-store': specifier: ^0.0.6 version: 0.0.6 @@ -1492,13 +1489,13 @@ importers: version: 7.26.0 '@emotion/react': specifier: ^11.9.0 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@emotion/styled': specifier: ^11.8.1 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@mui/utils': specifier: ^5.16.6 || ^6.0.0 - version: 5.16.6(@types/react@18.3.12)(react@18.3.1) + version: 5.16.8(@types/react@18.3.14)(react@18.3.1) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1530,21 +1527,21 @@ importers: specifier: ^5.1.1 version: 5.1.1 use-sync-external-store: - specifier: ^1.2.2 - version: 1.2.2(react@18.3.1) + specifier: ^1.4.0 + version: 1.4.0(react@18.3.1) devDependencies: '@mui/internal-test-utils': - specifier: ^1.0.21 - version: 1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^1.0.22 + version: 1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/system': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + specifier: ^5.16.8 + version: 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 '@types/use-sync-external-store': specifier: ^0.0.6 version: 0.0.6 @@ -1559,14 +1556,14 @@ importers: specifier: ^7.26.0 version: 7.26.0 '@emotion/cache': - specifier: ^11.13.1 - version: 11.13.1 + specifier: ^11.13.5 + version: 11.13.5 '@emotion/react': - specifier: ^11.13.3 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + specifier: ^11.13.5 + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@mui/material': - specifier: ^5.16.7 - version: 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.9 + version: 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mui/x-charts': specifier: workspace:* version: link:../packages/x-charts/build @@ -1592,8 +1589,8 @@ importers: specifier: workspace:* version: link:../packages/x-license/build '@playwright/test': - specifier: ^1.44.1 - version: 1.44.1 + specifier: ^1.49.0 + version: 1.49.0 '@react-spring/web': specifier: ^9.7.5 version: 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1607,11 +1604,11 @@ importers: specifier: ^0.7.9 version: 0.7.9 '@types/prop-types': - specifier: ^15.7.13 - version: 15.7.13 + specifier: ^15.7.14 + version: 15.7.14 '@types/react': - specifier: ^18.3.12 - version: 18.3.12 + specifier: ^18.3.14 + version: 18.3.14 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -1637,8 +1634,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-router-dom: - specifier: ^6.27.0 - version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^6.28.0 + version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) semver: specifier: ^7.6.3 version: 7.6.3 @@ -1653,10 +1650,10 @@ importers: devDependencies: '@codspeed/vitest-plugin': specifier: ^3.1.1 - version: 3.1.1(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))(vitest@2.1.5) + version: 3.1.1(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))(vitest@2.1.8) '@emotion/react': - specifier: ^11.13.3 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + specifier: ^11.13.5 + version: 11.13.5(@types/react@18.3.14)(react@18.3.1) '@mui/x-charts': specifier: workspace:* version: link:../../packages/x-charts/build @@ -1667,26 +1664,26 @@ importers: specifier: ^6.6.3 version: 6.6.3 '@testing-library/react': - specifier: ^16.0.1 - version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^16.1.0 + version: 16.1.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 version: 14.5.2(@testing-library/dom@10.4.0) '@vitejs/plugin-react': - specifier: ^4.3.3 - version: 4.3.3(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0)) + specifier: ^4.3.4 + version: 4.3.4(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0)) '@vitejs/plugin-react-swc': - specifier: ^3.7.1 - version: 3.7.1(@swc/helpers@0.5.5)(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0)) + specifier: ^3.7.2 + version: 3.7.2(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0)) '@vitest/browser': - specifier: 2.1.5 - version: 2.1.5(@types/node@20.17.7)(playwright@1.48.2)(typescript@5.7.2)(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))(vitest@2.1.5) + specifier: 2.1.8 + version: 2.1.8(@types/node@20.17.9)(playwright@1.49.0)(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))(vitest@2.1.8) '@vitest/ui': - specifier: 2.1.5 - version: 2.1.5(vitest@2.1.5) + specifier: 2.1.8 + version: 2.1.8(vitest@2.1.8) jsdom: - specifier: ^24.1.3 - version: 24.1.3 + specifier: ^25.0.1 + version: 25.0.1 react: specifier: ^18.3.1 version: 18.3.1 @@ -1694,15 +1691,11 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) vitest: - specifier: 2.1.5 - version: 2.1.5(@types/node@20.17.7)(@vitest/browser@2.1.5)(@vitest/ui@2.1.5)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(terser@5.27.0) + specifier: 2.1.8 + version: 2.1.8(@types/node@20.17.9)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(jsdom@25.0.1)(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(terser@5.36.0) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@actions/core@1.11.1': resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} @@ -1712,14 +1705,14 @@ packages: '@actions/github@6.0.0': resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==} - '@actions/http-client@2.2.1': - resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==} + '@actions/http-client@2.2.3': + resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} '@actions/io@1.1.3': resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} - '@adobe/css-tools@4.4.0': - resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@adobe/css-tools@4.4.1': + resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} '@algolia/autocomplete-core@1.17.7': resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} @@ -1741,95 +1734,95 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.12.0': - resolution: {integrity: sha512-hx4eVydkm3yrFCFxmcBtSzI/ykt0cZ6sDWch+v3JTgKpD2WtosMJU3Upv1AjQ4B6COSHCOWEX3vfFxW6OoH6aA==} + '@algolia/client-abtesting@5.15.0': + resolution: {integrity: sha512-FaEM40iuiv1mAipYyiptP4EyxkJ8qHfowCpEeusdHUC4C7spATJYArD2rX3AxkVeREkDIgYEOuXcwKUbDCr7Nw==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.12.0': - resolution: {integrity: sha512-EpTsSv6IW8maCfXCDIptgT7+mQJj7pImEkcNUnxR8yUKAHzTogTXv9yGm2WXOZFVuwstd2i0sImhQ1Vz8RH/hA==} + '@algolia/client-analytics@5.15.0': + resolution: {integrity: sha512-lho0gTFsQDIdCwyUKTtMuf9nCLwq9jOGlLGIeQGKDxXF7HbiAysFIu5QW/iQr1LzMgDyM9NH7K98KY+BiIFriQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.12.0': - resolution: {integrity: sha512-od3WmO8qxyfNhKc+K3D17tvun3IMs/xMNmxCG9MiElAkYVbPPTRUYMkRneCpmJyQI0hNx2/EA4kZgzVfQjO86Q==} + '@algolia/client-common@5.15.0': + resolution: {integrity: sha512-IofrVh213VLsDkPoSKMeM9Dshrv28jhDlBDLRcVJQvlL8pzue7PEB1EZ4UoJFYS3NSn7JOcJ/V+olRQzXlJj1w==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.12.0': - resolution: {integrity: sha512-8alajmsYUd+7vfX5lpRNdxqv3Xx9clIHLUItyQK0Z6gwGMbVEFe6YYhgDtwslMAP0y6b0WeJEIZJMLgT7VYpRw==} + '@algolia/client-insights@5.15.0': + resolution: {integrity: sha512-bDDEQGfFidDi0UQUCbxXOCdphbVAgbVmxvaV75cypBTQkJ+ABx/Npw7LkFGw1FsoVrttlrrQbwjvUB6mLVKs/w==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.12.0': - resolution: {integrity: sha512-bUV9HtfkTBgpoVhxFrMkmVPG03ZN1Rtn51kiaEtukucdk3ggjR9Qu1YUfRSU2lFgxr9qJc8lTxwfvhjCeJRcqw==} + '@algolia/client-personalization@5.15.0': + resolution: {integrity: sha512-LfaZqLUWxdYFq44QrasCDED5bSYOswpQjSiIL7Q5fYlefAAUO95PzBPKCfUhSwhb4rKxigHfDkd81AvEicIEoA==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.12.0': - resolution: {integrity: sha512-Q5CszzGWfxbIDs9DJ/QJsL7bP6h+lJMg27KxieEnI9KGCu0Jt5iFA3GkREkgRZxRdzlHbZKkrIzhtHVbSHw/rg==} + '@algolia/client-query-suggestions@5.15.0': + resolution: {integrity: sha512-wu8GVluiZ5+il8WIRsGKu8VxMK9dAlr225h878GGtpTL6VBvwyJvAyLdZsfFIpY0iN++jiNb31q2C1PlPL+n/A==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.12.0': - resolution: {integrity: sha512-R3qzEytgVLHOGNri+bpta6NtTt7YtkvUe/QBcAmMDjW4Jk1P0eBYIPfvnzIPbINRsLxIq9fZs9uAYBgsrts4Zg==} + '@algolia/client-search@5.15.0': + resolution: {integrity: sha512-Z32gEMrRRpEta5UqVQA612sLdoqY3AovvUPClDfMxYrbdDAebmGDVPtSogUba1FZ4pP5dx20D3OV3reogLKsRA==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.12.0': - resolution: {integrity: sha512-zpHo6qhR22tL8FsdSI4DvEraPDi/019HmMrCFB/TUX98yzh5ooAU7sNW0qPL1I7+S++VbBmNzJOEU9VI8tEC8A==} + '@algolia/ingestion@1.15.0': + resolution: {integrity: sha512-MkqkAxBQxtQ5if/EX2IPqFA7LothghVyvPoRNA/meS2AW2qkHwcxjuiBxv4H6mnAVEPfJlhu9rkdVz9LgCBgJg==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.12.0': - resolution: {integrity: sha512-i2AJZED/zf4uhxezAJUhMKoL5QoepCBp2ynOYol0N76+TSoohaMADdPnWCqOULF4RzOwrG8wWynAwBlXsAI1RQ==} + '@algolia/monitoring@1.15.0': + resolution: {integrity: sha512-QPrFnnGLMMdRa8t/4bs7XilPYnoUXDY8PMQJ1sf9ZFwhUysYYhQNX34/enoO0LBjpoOY6rLpha39YQEFbzgKyQ==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.12.0': - resolution: {integrity: sha512-0jmZyKvYnB/Bj5c7WKsKedOUjnr0UtXm0LVFUdQrxXfqOqvWv9n6Vpr65UjdYG4Q49kRQxhlwtal9WJYrYymXg==} + '@algolia/recommend@5.15.0': + resolution: {integrity: sha512-5eupMwSqMLDObgSMF0XG958zR6GJP3f7jHDQ3/WlzCM9/YIJiWIUoJFGsko9GYsA5xbLDHE/PhWtq4chcCdaGQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.12.0': - resolution: {integrity: sha512-KxwleraFuVoEGCoeW6Y1RAEbgBMS7SavqeyzWdtkJc6mXeCOJXn1iZitb8Tyn2FcpMNUKlSm0adrUTt7G47+Ow==} + '@algolia/requester-browser-xhr@5.15.0': + resolution: {integrity: sha512-Po/GNib6QKruC3XE+WKP1HwVSfCDaZcXu48kD+gwmtDlqHWKc7Bq9lrS0sNZ456rfCKhXksOmMfUs4wRM/Y96w==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.12.0': - resolution: {integrity: sha512-FuDZXUGU1pAg2HCnrt8+q1VGHKChV/LhvjvZlLOT7e56GJie6p+EuLu4/hMKPOVuQQ8XXtrTHKIU3Lw+7O5/bQ==} + '@algolia/requester-fetch@5.15.0': + resolution: {integrity: sha512-rOZ+c0P7ajmccAvpeeNrUmEKoliYFL8aOR5qGW5pFq3oj3Iept7Y5mEtEsOBYsRt6qLnaXn4zUKf+N8nvJpcIw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.12.0': - resolution: {integrity: sha512-ncDDY7CxZhMs6LIoPl+vHFQceIBhYPY5EfuGF1V7beO0U38xfsCYEyutEFB2kRzf4D9Gqppn3iWX71sNtrKcuw==} + '@algolia/requester-node-http@5.15.0': + resolution: {integrity: sha512-b1jTpbFf9LnQHEJP5ddDJKE2sAlhYd7EVSOWgzo/27n/SfCoHfqD0VWntnWYD83PnOKvfe8auZ2+xCb0TXotrQ==} engines: {node: '>= 14.0.0'} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@argos-ci/api-client@0.7.0': - resolution: {integrity: sha512-oRCaqA4DZn+yxD78/dqPTcz7dJd5SIU+GwnlvqorGLw6bktQ3TMPmKND/jb/GOf8tUpOs9FrSrwxVwFjYfiVeg==} + '@argos-ci/api-client@0.7.1': + resolution: {integrity: sha512-cJBNriNEs4aSBBpvsJH0f1D71rr9zxu/f0xRiqdEIIEN4ioFCCxs/66hNKrTxCw+lTaBnBL6LaM5vrBUkzgkzQ==} engines: {node: '>=18.0.0'} - '@argos-ci/core@2.11.0': - resolution: {integrity: sha512-Dvr9iNv/yeGuptjRtVZuO9oO/Z/69Bg9Kndc55eycWhn6GLOTFgLn3yKPYsf1bsobHTFJUa7beuc3n8d/AIxPA==} + '@argos-ci/core@2.12.0': + resolution: {integrity: sha512-SmJYi93Oh0DYnJ1kZVFtzM0UDr0MfrcUhOuUsBJNpYc4hV2AlCNeoi8hzWYPJvARMKh03ZcbNx4+VY5jXiGLOA==} engines: {node: '>=18.0.0'} - '@argos-ci/util@2.2.0': - resolution: {integrity: sha512-MLm8276zl/JkBiQKrkNUCdxQ+OcrGxffn3u61GOH7epaMd3PbxipUnD7JnptxBOt5rnXXqIObprCMl1ox7yAyw==} + '@argos-ci/util@2.2.1': + resolution: {integrity: sha512-z2B3EYVhDCDYlQwg55C/P8Xvbupb+XjmRHggIYl1R3yiNEBqy/kT9X/uOVMHxFyhLsM2PXsOOruugJoT11dB7Q==} engines: {node: '>=18.0.0'} - '@babel/cli@7.25.9': - resolution: {integrity: sha512-I+02IfrTiSanpxJBlZQYb18qCxB6c2Ih371cVpfgIrPQrjAYkf45XxomTJOG8JBWX5GY35/+TmhCMdJ4ZPkL8Q==} + '@babel/cli@7.26.4': + resolution: {integrity: sha512-+mORf3ezU3p3qr+82WvJSnQNE1GAYeoCfEv4fik6B5/2cvKZ75AX8oawWQdXtM9MmndooQj15Jr9kelRFWsuRw==} engines: {node: '>=6.9.0'} hasBin: true peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/code-frame@7.26.0': - resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.0': - resolution: {integrity: sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==} + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.0': - resolution: {integrity: sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==} + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': @@ -1856,8 +1849,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.2': - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1930,8 +1923,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/parser@7.26.1': - resolution: {integrity: sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==} + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true @@ -1965,13 +1958,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@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'} @@ -1983,8 +1969,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-flow@7.24.7': - resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} + '@babel/plugin-syntax-flow@7.26.0': + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2115,8 +2101,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-flow-strip-types@7.24.7': - resolution: {integrity: sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==} + '@babel/plugin-transform-flow-strip-types@7.25.9': + resolution: {integrity: sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2271,14 +2257,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.7': - resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.7': - resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2385,8 +2371,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.24.7': - resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} + '@babel/preset-flow@7.25.9': + resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2396,8 +2382,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.25.9': - resolution: {integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==} + '@babel/preset-react@7.26.3': + resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2426,12 +2412,12 @@ packages: resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -2483,14 +2469,20 @@ packages: search-insights: optional: true - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/core@1.3.1': + resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} - '@emotion/babel-plugin@11.12.0': - resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - '@emotion/cache@11.13.1': - resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + '@emnapi/wasi-threads@1.0.1': + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.13.5': + resolution: {integrity: sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==} '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -2498,8 +2490,8 @@ packages: '@emotion/is-prop-valid@1.2.2': resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - '@emotion/is-prop-valid@1.3.0': - resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} '@emotion/memoize@0.8.1': resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} @@ -2507,8 +2499,8 @@ packages: '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.13.3': - resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + '@emotion/react@11.13.5': + resolution: {integrity: sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -2516,8 +2508,8 @@ packages: '@types/react': optional: true - '@emotion/serialize@1.3.1': - resolution: {integrity: sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==} + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} '@emotion/server@11.11.0': resolution: {integrity: sha512-6q89fj2z8VBTx9w93kJ5n51hsmtYuFPtZgnc1L8VzRx9ti4EU6EyvF6Nn1H1x3vcCQCF7u2dB2lY4AYJwUW4PA==} @@ -2530,8 +2522,8 @@ packages: '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - '@emotion/styled@11.13.0': - resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} + '@emotion/styled@11.13.5': + resolution: {integrity: sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -2551,8 +2543,8 @@ packages: peerDependencies: react: '>=16.8.0' - '@emotion/utils@1.4.0': - resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} @@ -2843,14 +2835,14 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -2871,20 +2863,20 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@floating-ui/core@1.6.0': - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - '@floating-ui/dom@1.6.1': - resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} - '@floating-ui/react-dom@2.0.8': - resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.1': - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} '@gitbeaker/core@38.12.1': resolution: {integrity: sha512-8XMVcBIdVAAoxn7JtqmZ2Ee8f+AZLcCPmqEmPFOXY2jPS84y/DERISg/+sbhhb18iRy+ZsZhpWgQ/r3CkYNJOQ==} @@ -3024,25 +3016,25 @@ packages: cpu: [x64] os: [win32] - '@inquirer/confirm@5.0.1': - resolution: {integrity: sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw==} + '@inquirer/confirm@5.0.2': + resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} engines: {node: '>=18'} peerDependencies: - '@types/node': ^20.17.7 + '@types/node': ^20.17.9 - '@inquirer/core@10.0.1': - resolution: {integrity: sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ==} + '@inquirer/core@10.1.0': + resolution: {integrity: sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==} engines: {node: '>=18'} - '@inquirer/figures@1.0.7': - resolution: {integrity: sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==} + '@inquirer/figures@1.0.8': + resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==} engines: {node: '>=18'} - '@inquirer/type@3.0.0': - resolution: {integrity: sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==} + '@inquirer/type@3.0.1': + resolution: {integrity: sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==} engines: {node: '>=18'} peerDependencies: - '@types/node': ^20.17.7 + '@types/node': ^20.17.9 '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -3067,16 +3059,16 @@ packages: 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==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 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/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -3088,8 +3080,8 @@ packages: resolution: {integrity: sha512-DPnl5lPX4v49eVxEbJnAizrpMdMTBz1qykZrAbBul9rfgk531v8oAt+Pm6O/rpAleRombNM7FJb5rYGzBJatOQ==} engines: {node: '>=18.0.0'} - '@mswjs/interceptors@0.37.0': - resolution: {integrity: sha512-lDiHQMCBV9qz8c7+zxaNFQtWWaSogTYkqJ3Pg+FGYYC76nsfSxkMQ0df8fojyz16E+w4vp57NLjN2muNG7LugQ==} + '@mswjs/interceptors@0.37.3': + resolution: {integrity: sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==} engines: {node: '>=18'} '@mui/base@5.0.0-beta.40': @@ -3103,11 +3095,11 @@ packages: '@types/react': optional: true - '@mui/core-downloads-tracker@5.16.7': - resolution: {integrity: sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==} + '@mui/core-downloads-tracker@5.16.9': + resolution: {integrity: sha512-ue3j79XJ56+F6DlTtFTM+n//5AvNENOvl3MFruZZP5iZzz+hOq6WBwnr+YxiMlr+kvmMHuHxgOHFdPR8+mElDw==} - '@mui/docs@6.1.8': - resolution: {integrity: sha512-5Hi6An7mhn8bwK94Q0gXhHcam49oI66Ca8+fConfhVezSkFdQsVam3Wx0nt9UZIJiuql293IX525pW51igKmYg==} + '@mui/docs@6.1.10': + resolution: {integrity: sha512-67NdsFGyUfd3ZHVSnOnjqnL5923j+8JyiwMEWyocOW0u1K7CoMK87QgdiYk2T64X1TMxCRr3IZdxmCBe7Rr0ag==} engines: {node: '>=14.0.0'} peerDependencies: '@mui/base': '*' @@ -3123,13 +3115,13 @@ packages: '@types/react': optional: true - '@mui/icons-material@5.16.7': - resolution: {integrity: sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==} + '@mui/icons-material@5.16.9': + resolution: {integrity: sha512-nnOJIqan6FS6zEsLX3vf8LZ4vXpZjP5xfCFezeXmqfQConypCOZG4nangoVwKwROlas7b6/bqOdacFUb/HuM/g==} 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 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -3139,17 +3131,17 @@ packages: peerDependencies: '@babel/core': '7' - '@mui/internal-docs-utils@1.0.15': - resolution: {integrity: sha512-I+/9+8p9qck/pePgB7qkJdPd181TwCQf9p1+Re40Vs+FsirbQ6j4lgAsVleu2RZMCwzO6q2k1tfPOHIshNp62w==} + '@mui/internal-docs-utils@1.0.16': + resolution: {integrity: sha512-GEq4dG9+10WGlQVrmXUfCWNe1FiWoMr2KXbgn2/00Da5hdvp4nIa3PXYYZF08Wh+FtnBbLHKGkPmZ7iw9WKtjQ==} - '@mui/internal-markdown@1.0.20': - resolution: {integrity: sha512-p9X+wYIElnWNzXlgodC1qbdiHtWb1xTEJ3ZilhbB6UgTm1oSby9A7ez4GPDr6qkTLDlT3Cnk/oOsSsDa1Lscrw==} + '@mui/internal-markdown@1.0.22': + resolution: {integrity: sha512-js8VF3uDbHjV3gByPVZBcVF0sGkKM22MhFoxKw+W0nGMj6cy1+68Jg3jspFz38diGRqv4lElz9rL31YjY45U9w==} - '@mui/internal-scripts@1.0.27': - resolution: {integrity: sha512-stqXxLEcb1purnwXPrWKy7gd+SEQkzDAo3PZyMvUYRzMN+pmstB8Kh5PtmIHeB6yXVFnsqTTn+Bf4bVmJ5FnLA==} + '@mui/internal-scripts@1.0.29': + resolution: {integrity: sha512-s+ceBqTrrBme/bvt5VQ8uXgV67tFz2eA/UQ2XsMQ+6umHh/9cMuzIYG3qossj7iWUWI3CohwpLDtU+qWbqthAw==} - '@mui/internal-test-utils@1.0.21': - resolution: {integrity: sha512-M9xqbIWghgI9/FjbMJZHz7l8OwtgvxMBDXDHT+kPtTPHRfVdVNoS0lP/n4mVW7YN2+61bZT31NMysKr6lUUD1A==} + '@mui/internal-test-utils@1.0.22': + resolution: {integrity: sha512-XJvX6mt3SO/Y4o4BRvhoMt0lAaJ3rryHelOkMPCpMzp25aSKoAYCJ/cMGty7wbcsPbqrPugrheMshz21O49Sfg==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 @@ -3171,16 +3163,16 @@ packages: '@types/react': optional: true - '@mui/lab@5.0.0-alpha.173': - resolution: {integrity: sha512-Gt5zopIWwxDgGy/MXcp6GueD84xFFugFai4hYiXY0zowJpTVnIrTQCQXV004Q7rejJ7aaCntX9hpPJqCrioshA==} + '@mui/lab@5.0.0-alpha.174': + resolution: {integrity: sha512-6jw+vcjfnDr/V4qzqwOPFwoqzxejGfm9F0k9E92QLmtFv5F0pH73OjmQDzALL7zrcwR4iV4D94iJZ1xFawiREA==} 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 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -3189,16 +3181,16 @@ packages: '@types/react': optional: true - '@mui/material-nextjs@5.16.6': - resolution: {integrity: sha512-Y64ybP5Pmy+GCUcu3SuMnc25CqFwBQkRn6XNXyhvc1mhR48Iq0oFKjoO5ncqfhm58OwPClIRW2tecP/PTdGNJw==} + '@mui/material-nextjs@5.16.8': + resolution: {integrity: sha512-UJhXaizQWrl3a5uXeCYyAHITXZnRBJJFCarccXk04gH5+NS9UArNl20mG6emyuPwV67UDh8DBNUSjpHd1pTVGg==} 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 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 next: ^13.0.0 || ^14.0.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/cache': optional: true @@ -3207,15 +3199,15 @@ packages: '@types/react': optional: true - '@mui/material@5.16.7': - resolution: {integrity: sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==} + '@mui/material@5.16.9': + resolution: {integrity: sha512-XC0oHFm7mrWV0tvhed9uv/o6kLNClnLj1eo/ufuKbj+rgk47ek8Y6HjHe3cGvMn4Bcq8KyoQPgzdwqvS2ZzYrA==} 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 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -3224,52 +3216,52 @@ packages: '@types/react': optional: true - '@mui/monorepo@https://codeload.github.com/mui/material-ui/tar.gz/f706939f7ce7fd90d8d4436515d752daff7395c6': - resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/f706939f7ce7fd90d8d4436515d752daff7395c6} - version: 6.1.8 - engines: {pnpm: 9.13.2} + '@mui/monorepo@https://codeload.github.com/mui/material-ui/tar.gz/454a4c081a3cda665d5e608e1fc3d600d14eee53': + resolution: {tarball: https://codeload.github.com/mui/material-ui/tar.gz/454a4c081a3cda665d5e608e1fc3d600d14eee53} + version: 6.1.10 + engines: {pnpm: 9.14.4} - '@mui/private-theming@5.16.6': - resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} + '@mui/private-theming@5.16.8': + resolution: {integrity: sha512-3Vl9yFVLU6T3CFtxRMQTcJ60Ijv7wxQi4yjH92+9YXcsqvVspeIYoocqNoIV/1bXGYfyWu5zrCmwQVHaGY7bug==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/styled-engine@5.16.6': - resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} + '@mui/styled-engine@5.16.8': + resolution: {integrity: sha512-OFdgFf8JczSRs0kvWGdSn0ZeXxWrY0LITDPJ/nAtLEvUUTyrlFaO4il3SECX8ruzvf1VnAxHx4M/4mX9oOn9yA==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true '@emotion/styled': optional: true - '@mui/styles@5.16.7': - resolution: {integrity: sha512-FfXhHP/2MlqH+vLs2tIHMeCChmqSRgkOALVNLKkPrDsvtoq5J8OraOutCn1scpvRjr9mO8ZhW6jKx2t/vUDxtQ==} + '@mui/styles@5.16.9': + resolution: {integrity: sha512-7Lxn2Bk8tRv5k8Pq0eZ/bNQ2CQr6hIU1sWGjuIK5cUI62bQTx6s+VtJ+x9IjqLKjDJAz99f4/ba+t8RmwQsoRA==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/system@5.16.7': - resolution: {integrity: sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==} + '@mui/system@5.16.8': + resolution: {integrity: sha512-L32TaFDFpGIi1g6ysRtmhc9zDgrlxDXu3NlrGE8gAsQw/ziHrPdr0PNr20O0POUshA1q14W4dNZ/z0Nx2F9lhA==} 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 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -3278,24 +3270,27 @@ packages: '@types/react': optional: true - '@mui/types@7.2.15': - resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==} + '@mui/types@7.2.19': + resolution: {integrity: sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/utils@5.16.6': - resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} + '@mui/utils@5.16.8': + resolution: {integrity: sha512-P/yb7BSWallQUeiNGxb+TM8epHteIUC8gzNTdPV2VfKhVY/EnGliHgt5np0GPkjQ7EzwDi/+gBevrAJtf+K94A==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true + '@napi-rs/wasm-runtime@0.2.4': + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + '@netlify/functions@2.8.2': resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==} engines: {node: '>=14.0.0'} @@ -3308,62 +3303,62 @@ packages: resolution: {integrity: sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==} engines: {node: '>=18.0.0'} - '@next/env@14.2.18': - resolution: {integrity: sha512-2vWLOUwIPgoqMJKG6dt35fVXVhgM09tw4tK3/Q34GFXDrfiHlG7iS33VA4ggnjWxjiz9KV5xzfsQzJX6vGAekA==} + '@next/env@14.2.20': + resolution: {integrity: sha512-JfDpuOCB0UBKlEgEy/H6qcBSzHimn/YWjUHzKl1jMeUO+QVRdzmTTl8gFJaNO87c8DXmVKhFCtwxQ9acqB3+Pw==} - '@next/eslint-plugin-next@15.0.3': - resolution: {integrity: sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw==} + '@next/eslint-plugin-next@15.0.4': + resolution: {integrity: sha512-rbsF17XGzHtR7SDWzWpavSfum3/UdnF8bAaisnKwP//si3KWPTedVUsflAdjyK1zW3rweBjbALfKcavFneLGvg==} - '@next/swc-darwin-arm64@14.2.18': - resolution: {integrity: sha512-tOBlDHCjGdyLf0ube/rDUs6VtwNOajaWV+5FV/ajPgrvHeisllEdymY/oDgv2cx561+gJksfMUtqf8crug7sbA==} + '@next/swc-darwin-arm64@14.2.20': + resolution: {integrity: sha512-WDfq7bmROa5cIlk6ZNonNdVhKmbCv38XteVFYsxea1vDJt3SnYGgxLGMTXQNfs5OkFvAhmfKKrwe7Y0Hs+rWOg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.18': - resolution: {integrity: sha512-uJCEjutt5VeJ30jjrHV1VIHCsbMYnEqytQgvREx+DjURd/fmKy15NaVK4aR/u98S1LGTnjq35lRTnRyygglxoA==} + '@next/swc-darwin-x64@14.2.20': + resolution: {integrity: sha512-XIQlC+NAmJPfa2hruLvr1H1QJJeqOTDV+v7tl/jIdoFvqhoihvSNykLU/G6NMgoeo+e/H7p/VeWSOvMUHKtTIg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.18': - resolution: {integrity: sha512-IL6rU8vnBB+BAm6YSWZewc+qvdL1EaA+VhLQ6tlUc0xp+kkdxQrVqAnh8Zek1ccKHlTDFRyAft0e60gteYmQ4A==} + '@next/swc-linux-arm64-gnu@14.2.20': + resolution: {integrity: sha512-pnzBrHTPXIMm5QX3QC8XeMkpVuoAYOmyfsO4VlPn+0NrHraNuWjdhe+3xLq01xR++iCvX+uoeZmJDKcOxI201Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.18': - resolution: {integrity: sha512-RCaENbIZqKKqTlL8KNd+AZV/yAdCsovblOpYFp0OJ7ZxgLNbV5w23CUU1G5On+0fgafrsGcW+GdMKdFjaRwyYA==} + '@next/swc-linux-arm64-musl@14.2.20': + resolution: {integrity: sha512-WhJJAFpi6yqmUx1momewSdcm/iRXFQS0HU2qlUGlGE/+98eu7JWLD5AAaP/tkK1mudS/rH2f9E3WCEF2iYDydQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.18': - resolution: {integrity: sha512-3kmv8DlyhPRCEBM1Vavn8NjyXtMeQ49ID0Olr/Sut7pgzaQTo4h01S7Z8YNE0VtbowyuAL26ibcz0ka6xCTH5g==} + '@next/swc-linux-x64-gnu@14.2.20': + resolution: {integrity: sha512-ao5HCbw9+iG1Kxm8XsGa3X174Ahn17mSYBQlY6VGsdsYDAbz/ZP13wSLfvlYoIDn1Ger6uYA+yt/3Y9KTIupRg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.18': - resolution: {integrity: sha512-mliTfa8seVSpTbVEcKEXGjC18+TDII8ykW4a36au97spm9XMPqQTpdGPNBJ9RySSFw9/hLuaCMByluQIAnkzlw==} + '@next/swc-linux-x64-musl@14.2.20': + resolution: {integrity: sha512-CXm/kpnltKTT7945np6Td3w7shj/92TMRPyI/VvveFe8+YE+/YOJ5hyAWK5rpx711XO1jBCgXl211TWaxOtkaA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.18': - resolution: {integrity: sha512-J5g0UFPbAjKYmqS3Cy7l2fetFmWMY9Oao32eUsBPYohts26BdrMUyfCJnZFQkX9npYaHNDOWqZ6uV9hSDPw9NA==} + '@next/swc-win32-arm64-msvc@14.2.20': + resolution: {integrity: sha512-upJn2HGQgKNDbXVfIgmqT2BN8f3z/mX8ddoyi1I565FHbfowVK5pnMEwauvLvaJf4iijvuKq3kw/b6E9oIVRWA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.18': - resolution: {integrity: sha512-Ynxuk4ZgIpdcN7d16ivJdjsDG1+3hTvK24Pp8DiDmIa2+A4CfhJSEHHVndCHok6rnLUzAZD+/UOKESQgTsAZGg==} + '@next/swc-win32-ia32-msvc@14.2.20': + resolution: {integrity: sha512-igQW/JWciTGJwj3G1ipalD2V20Xfx3ywQy17IV0ciOUBbFhNfyU1DILWsTi32c8KmqgIDviUEulW/yPb2FF90w==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.18': - resolution: {integrity: sha512-dtRGMhiU9TN5nyhwzce+7c/4CCeykYS+ipY/4mIrGzJ71+7zNo55ZxCB7cAVuNqdwtYniFNR2c9OFQ6UdFIMcg==} + '@next/swc-win32-x64-msvc@14.2.20': + resolution: {integrity: sha512-AFmqeLW6LtxeFTuoB+MXFeM5fm5052i3MU6xD0WzJDOwku6SkZaxb1bxjBaRC8uNqTRTSPl0yMFtjNowIVI67w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3383,8 +3378,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@npmcli/agent@2.2.0': - resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/arborist@7.5.4': @@ -3396,8 +3391,8 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} 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==} + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/installed-package-contents@2.1.0': @@ -3425,8 +3420,8 @@ packages: resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} engines: {node: ^16.14.0 || >=18.0.0} - '@npmcli/promise-spawn@7.0.1': - resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/query@3.1.0': @@ -3441,74 +3436,67 @@ packages: resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} 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==} + '@nx/devkit@20.1.4': + resolution: {integrity: sha512-Opz7eRPmpt3e4SGkbwZbE9Bg3MhKeivh1QTNCj4tQVAB4gucz0lW/F3mdtRDFdj6gUbqIc5rRrbO/DGlNaEzYw==} peerDependencies: - nx: '>= 16 <= 18' + nx: '>= 19 <= 21' - '@nx/nx-darwin-arm64@17.3.0': - resolution: {integrity: sha512-NDR/HjahhNLx9Q4TjR5/W3IedSkdtK+kUZ09EceVeX33HNdeLjkFA26QtVVmGbhnogLcywAX0KELn7oGv2nO+A==} + '@nx/nx-darwin-arm64@20.1.4': + resolution: {integrity: sha512-afyDOZbIyHi6BgKk+Bb4RI1t8dZ6/oIbOY89z4mBPNNevZkbGqUfMwO2vjKnaOoThcjT93SEMJfCLGL8i857ww==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@17.3.0': - resolution: {integrity: sha512-3qxOZnHTPTUXAH8WGCtllAXE2jodStDNSkGVeEcDuIK4NO5tFfF4oVCLKKYcnqKsJOVNTS9B/aJG2bVGbaWYVQ==} + '@nx/nx-darwin-x64@20.1.4': + resolution: {integrity: sha512-aiYklAt95aX0EinepJRryMna8K53G52ngYOFuac1G8iLlguinJvg/YgSKCf7GOAzec8b7Hm7KauPjSJE/P3/iw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@17.3.0': - resolution: {integrity: sha512-kVGK/wSbRRWqL3sAXlR5diI29kDisutUMaxs5dWxzRzY0U/+Kwon6ayLU1/HGwEykXFhCJE7r9vSqCrnn67dzg==} + '@nx/nx-freebsd-x64@20.1.4': + resolution: {integrity: sha512-WUh4bsLK+e7wuN3lE3ZQUj+xQKdWU4P4RymutfLQQnPYiilCMtFwITcvDmazmOHFWI2vPhzSyYJRbOu+YMIR3A==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@17.3.0': - resolution: {integrity: sha512-nb+jsh7zDkXjHEaAM5qmJR0X0wQ1yPbAYJuZSf8oZkllVYXcAofiAf21EqgKHq7vr4sZiCmlDaT16DheM3jyVA==} + '@nx/nx-linux-arm-gnueabihf@20.1.4': + resolution: {integrity: sha512-9vPMw5s89v3od7aw3enTWjdMSCAmQ0tIA89Uz7xbbjB2kX2mAdihSzAKd9woi/cj+ROnY+ynNXzU9UjqhfxdBg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@17.3.0': - resolution: {integrity: sha512-9LkGk2paZn5Ehg/rya8GCISr+CgMz3MZ5PTOO/yEGk6cv6kQSmhZdjUi3wMOQidIqpolRK0MrhSL9DUz8Htl4A==} + '@nx/nx-linux-arm64-gnu@20.1.4': + resolution: {integrity: sha512-JUE4l8utr9KmQSG9tO2Qw5R5i/bZ16s1+J5xnEar7UfcSOfOLqxGHS7HCBUZcfr46dmtv6KjIC83uHMs19AwDQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@17.3.0': - resolution: {integrity: sha512-bMykIGtziR90xLOCdzVDzaLgMXDvCf2Y7KpAj/EqJXpC0j9RmQdkm7VyO3//xN6rpcWjMcn1wgHQ1rPV65vETg==} + '@nx/nx-linux-arm64-musl@20.1.4': + resolution: {integrity: sha512-EaPUDqXvnPc/ure0x7N+5lRYvk5zqOQ3LzFOTRPWdqnFXejyTkGjZEYWbLFIJTFrvyEdpfaPTHyNmCHUrEz9TQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@17.3.0': - resolution: {integrity: sha512-Y3KbMhVcgvVvplyVlWzHaSKqGKqWLPTcuXnnNzuWSqLC9q+UdaDE/6+7SryHbJABM2juMHbo9JNp5LlKp3bkEg==} + '@nx/nx-linux-x64-gnu@20.1.4': + resolution: {integrity: sha512-vaWV37ZayfyckVI/faWdQWIV9XQb06ZT8jHQnwgSd9tKbGz37vN30eYtgZlFL0P4bHfhjtmMXnLvADmfyO/KOw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@17.3.0': - resolution: {integrity: sha512-QvAIZPqvrqI+s2Ddpkb0TE4yRJgXAlL8I+rIA8U+6y266rT5sVJZFPUWubkFWe/PSmqv3l4KqPcsvHTiIzldFA==} + '@nx/nx-linux-x64-musl@20.1.4': + resolution: {integrity: sha512-wjq4Ea1oweBsIA9jq+jDT6BALxv/uac0aFykwoN23dOiwwSMFWMxbXUuBrxp0LjMFGV49S62kVDoRezukvkiZA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@17.3.0': - resolution: {integrity: sha512-uoG3g0eZ9lYWZi4CpEVd04fIs+4lqpmU/FAaB3/K+Tfj9daSEIB6j57EX81ECDRB16k74VUdcI32qLAtD8KIMw==} + '@nx/nx-win32-arm64-msvc@20.1.4': + resolution: {integrity: sha512-d9jN8biyEJh4Mjdc3RU1j/+WIOjrO9mCDxYuERXP2ELaNsOk0tJgcXE1xsa9AF88AHGpOkCOS2rxy61DKBtFKg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@17.3.0': - resolution: {integrity: sha512-ekoejj7ZXMSNYrgQwd/7thCNTHbDRggsqPw5LlTa/jPonsQ4TAPzmLBJUF8hCKn43xXLXaFufK4V1OMxlP1Hfg==} + '@nx/nx-win32-x64-msvc@20.1.4': + resolution: {integrity: sha512-s3RwOkkWKzOflbTmc5MRc4EH2mk1AkJ/V8Gu3Qi2QncF9r1GrR7hDxROpu0MEoHfIhRG+d+n8OGX31nC9GZWUg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3588,11 +3576,11 @@ packages: '@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==} + '@octokit/plugin-paginate-rest@11.3.6': + resolution: {integrity: sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw==} engines: {node: '>= 18'} peerDependencies: - '@octokit/core': '5' + '@octokit/core': '>=6' '@octokit/plugin-paginate-rest@2.21.3': resolution: {integrity: sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==} @@ -3628,11 +3616,11 @@ packages: peerDependencies: '@octokit/core': '5' - '@octokit/plugin-rest-endpoint-methods@13.2.2': - resolution: {integrity: sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==} + '@octokit/plugin-rest-endpoint-methods@13.2.6': + resolution: {integrity: sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==} engines: {node: '>= 18'} peerDependencies: - '@octokit/core': ^5 + '@octokit/core': '>=6' '@octokit/plugin-rest-endpoint-methods@5.16.2': resolution: {integrity: sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==} @@ -3662,8 +3650,8 @@ packages: resolution: {integrity: sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==} engines: {node: '>= 18'} - '@octokit/request-error@6.1.1': - resolution: {integrity: sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==} + '@octokit/request-error@6.1.5': + resolution: {integrity: sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==} engines: {node: '>= 18'} '@octokit/request@5.6.3': @@ -3677,8 +3665,8 @@ packages: resolution: {integrity: sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==} engines: {node: '>= 18'} - '@octokit/request@9.1.1': - resolution: {integrity: sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==} + '@octokit/request@9.1.3': + resolution: {integrity: sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==} engines: {node: '>= 18'} '@octokit/rest@18.12.0': @@ -3701,8 +3689,8 @@ packages: '@octokit/types@12.6.0': resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} - '@octokit/types@13.5.0': - resolution: {integrity: sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==} + '@octokit/types@13.6.2': + resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} '@octokit/types@6.41.0': resolution: {integrity: sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==} @@ -3719,10 +3707,6 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@opentelemetry/api@1.8.0': - resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} - engines: {node: '>=8.0.0'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3731,13 +3715,13 @@ packages: 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'} + '@playwright/test@1.49.0': + resolution: {integrity: sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==} + engines: {node: '>=18'} hasBin: true - '@polka/url@1.0.0-next.24': - resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} @@ -3769,87 +3753,97 @@ packages: 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.20.0': - resolution: {integrity: sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==} + '@remix-run/router@1.21.0': + resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==} engines: {node: '>=14.0.0'} - '@rollup/rollup-android-arm-eabi@4.18.1': - resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} + '@rollup/rollup-android-arm-eabi@4.28.0': + resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.1': - resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} + '@rollup/rollup-android-arm64@4.28.0': + resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.1': - resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} + '@rollup/rollup-darwin-arm64@4.28.0': + resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.1': - resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} + '@rollup/rollup-darwin-x64@4.28.0': + resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.1': - resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} + '@rollup/rollup-freebsd-arm64@4.28.0': + resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.28.0': + resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': + resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.1': - resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} + '@rollup/rollup-linux-arm-musleabihf@4.28.0': + resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.1': - resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} + '@rollup/rollup-linux-arm64-gnu@4.28.0': + resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.1': - resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} + '@rollup/rollup-linux-arm64-musl@4.28.0': + resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': - resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': + resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.1': - resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} + '@rollup/rollup-linux-riscv64-gnu@4.28.0': + resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.1': - resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} + '@rollup/rollup-linux-s390x-gnu@4.28.0': + resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.1': - resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} + '@rollup/rollup-linux-x64-gnu@4.28.0': + resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.1': - resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} + '@rollup/rollup-linux-x64-musl@4.28.0': + resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.1': - resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} + '@rollup/rollup-win32-arm64-msvc@4.28.0': + resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.1': - resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} + '@rollup/rollup-win32-ia32-msvc@4.28.0': + resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.1': - resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} + '@rollup/rollup-win32-x64-msvc@4.28.0': + resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} cpu: [x64] os: [win32] @@ -3859,28 +3853,28 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sigstore/bundle@2.1.1': - resolution: {integrity: sha512-v3/iS+1nufZdKQ5iAlQKcCsoh0jffQyABvYIxKsZQFWc4ubuGjwZklFHpDgV6O6T7vvV78SW5NHI91HFKEcxKg==} + '@sigstore/bundle@2.3.2': + resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} engines: {node: ^16.14.0 || >=18.0.0} - '@sigstore/core@0.2.0': - resolution: {integrity: sha512-THobAPPZR9pDH2CAvDLpkrYedt7BlZnsyxDe+Isq4ZmGfPy5juOFZq487vCU2EgKD7aHSiTfE/i7sN7aEdzQnA==} + '@sigstore/core@1.1.0': + resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} 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/protobuf-specs@0.3.2': + resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} + engines: {node: ^16.14.0 || >=18.0.0} - '@sigstore/sign@2.2.1': - resolution: {integrity: sha512-U5sKQEj+faE1MsnLou1f4DQQHeFZay+V9s9768lw48J4pKykPj34rWyI1lsMOGJ3Mae47Ye6q3HAJvgXO21rkQ==} + '@sigstore/sign@2.3.2': + resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} engines: {node: ^16.14.0 || >=18.0.0} - '@sigstore/tuf@2.3.0': - resolution: {integrity: sha512-S98jo9cpJwO1mtQ+2zY7bOdcYyfVYCUaofCG6wWRzk3pxKHVAkSfshkfecto2+LKsx7Ovtqbgb2LS8zTRhxJ9Q==} + '@sigstore/tuf@2.3.4': + resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} engines: {node: ^16.14.0 || >=18.0.0} - '@sigstore/verify@0.1.0': - resolution: {integrity: sha512-2UzMNYAa/uaz11NhvgRnIQf4gpLTJ59bhb8ESXaoSS5sxedfS+eLak8bsdMc+qpNQfITUTFoSKFx5h8umlRRiA==} + '@sigstore/verify@1.2.1': + resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} engines: {node: ^16.14.0 || >=18.0.0} '@sinclair/typebox@0.27.8': @@ -3906,8 +3900,8 @@ packages: '@sinonjs/text-encoding@0.7.3': resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} - '@slack/bolt@4.1.0': - resolution: {integrity: sha512-7XlTziPVLQn8RXNuOTzsJh/wrkX4YUZr1UpX25MpfDdMpp28Y4TrtIvYDh6GV90uNscdHJhOJcpqLq6ibqfGfg==} + '@slack/bolt@4.1.1': + resolution: {integrity: sha512-Sc8QUnEHCPgRlwrMxmvOl4Vhr/7ZBDXvLR0ir6TO+W5MaDtPsrmWLxqLmb+OhCGSjDp3d4AxO6jdFlC3yNKtsg==} engines: {node: '>=18', npm: '>=8.6.0'} '@slack/logger@4.0.0': @@ -3922,79 +3916,79 @@ packages: resolution: {integrity: sha512-WSLBnGY9eE19jx6QLIP78oFpxNVU74soDIP0dupi35MFY6WfLBAikbuy4Y/rR4v9eJ7MNnd5/BdQNETgv32F8Q==} engines: {node: '>= 18', npm: '>= 8.6.0'} - '@slack/types@2.13.0': - resolution: {integrity: sha512-OAQVtKYIgBVNRmgIoiTjorGPTlgfcfstU3XYYCBA+czlB9aGcKb9MQc+6Jovi4gq3S98yP/GPBZsJSI/2mHKDQ==} + '@slack/types@2.14.0': + resolution: {integrity: sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} '@slack/web-api@7.7.0': resolution: {integrity: sha512-DtRyjgQi0mObA2uC6H8nL2OhAISKDhvtOXgRjGRBnBhiaWb6df5vPmKHsOHjpweYALBMHtiqE5ajZFkDW/ag8Q==} engines: {node: '>= 18', npm: '>= 8.6.0'} - '@socket.io/component-emitter@3.1.0': - resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@swc/core-darwin-arm64@1.7.35': - resolution: {integrity: sha512-BQSSozVxjxS+SVQz6e3GC/+OBWGIK3jfe52pWdANmycdjF3ch7lrCKTHTU7eHwyoJ96mofszPf5AsiVJF34Fwg==} + '@swc/core-darwin-arm64@1.9.3': + resolution: {integrity: sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.35': - resolution: {integrity: sha512-44TYdKN/EWtkU88foXR7IGki9JzhEJzaFOoPevfi9Xe7hjAD/x2+AJOWWqQNzDPMz9+QewLdUVLyR6s5okRgtg==} + '@swc/core-darwin-x64@1.9.3': + resolution: {integrity: sha512-IaRq05ZLdtgF5h9CzlcgaNHyg4VXuiStnOFpfNEMuI5fm5afP2S0FHq8WdakUz5WppsbddTdplL+vpeApt/WCQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.35': - resolution: {integrity: sha512-ccfA5h3zxwioD+/z/AmYtkwtKz9m4rWTV7RoHq6Jfsb0cXHrd6tbcvgqRWXra1kASlE+cDWsMtEZygs9dJRtUQ==} + '@swc/core-linux-arm-gnueabihf@1.9.3': + resolution: {integrity: sha512-Pbwe7xYprj/nEnZrNBvZfjnTxlBIcfApAGdz2EROhjpPj+FBqBa3wOogqbsuGGBdCphf8S+KPprL1z+oDWkmSQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.7.35': - resolution: {integrity: sha512-hx65Qz+G4iG/IVtxJKewC5SJdki8PAPFGl6gC/57Jb0+jA4BIoGLD/J3Q3rCPeoHfdqpkCYpahtyUq8CKx41Jg==} + '@swc/core-linux-arm64-gnu@1.9.3': + resolution: {integrity: sha512-AQ5JZiwNGVV/2K2TVulg0mw/3LYfqpjZO6jDPtR2evNbk9Yt57YsVzS+3vHSlUBQDRV9/jqMuZYVU3P13xrk+g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.7.35': - resolution: {integrity: sha512-kL6tQL9No7UEoEvDRuPxzPTpxrvbwYteNRbdChSSP74j13/55G2/2hLmult5yFFaWuyoyU/2lvzjRL/i8OLZxg==} + '@swc/core-linux-arm64-musl@1.9.3': + resolution: {integrity: sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.7.35': - resolution: {integrity: sha512-Ke4rcLQSwCQ2LHdJX1FtnqmYNQ3IX6BddKlUtS7mcK13IHkQzZWp0Dcu6MgNA3twzb/dBpKX5GLy07XdGgfmyw==} + '@swc/core-linux-x64-gnu@1.9.3': + resolution: {integrity: sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.7.35': - resolution: {integrity: sha512-T30tlLnz0kYyDFyO5RQF5EQ4ENjW9+b56hEGgFUYmfhFhGA4E4V67iEx7KIG4u0whdPG7oy3qjyyIeTb7nElEw==} + '@swc/core-linux-x64-musl@1.9.3': + resolution: {integrity: sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.7.35': - resolution: {integrity: sha512-CfM/k8mvtuMyX+okRhemfLt784PLS0KF7Q9djA8/Dtavk0L5Ghnq+XsGltO3d8B8+XZ7YOITsB14CrjehzeHsg==} + '@swc/core-win32-arm64-msvc@1.9.3': + resolution: {integrity: sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.7.35': - resolution: {integrity: sha512-ATB3uuH8j/RmS64EXQZJSbo2WXfRNpTnQszHME/sGaexsuxeijrp3DTYSFAA3R2Bu6HbIIX6jempe1Au8I3j+A==} + '@swc/core-win32-ia32-msvc@1.9.3': + resolution: {integrity: sha512-rqpzNfpAooSL4UfQnHhkW8aL+oyjqJniDP0qwZfGnjDoJSbtPysHg2LpcOBEdSnEH+uIZq6J96qf0ZFD8AGfXA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.7.35': - resolution: {integrity: sha512-iDGfQO1571NqWUXtLYDhwIELA/wadH42ioGn+J9R336nWx40YICzy9UQyslWRhqzhQ5kT+QXAW/MoCWc058N6Q==} + '@swc/core-win32-x64-msvc@1.9.3': + resolution: {integrity: sha512-3YJJLQ5suIEHEKc1GHtqVq475guiyqisKSoUnoaRtxkDaW5g1yvPt9IoSLOe2mRs7+FFhGGU693RsBUSwOXSdQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.7.35': - resolution: {integrity: sha512-3cUteCTbr2r5jqfgx0r091sfq5Mgh6F1SQh8XAOnSvtKzwv2bC31mvBHVAieD1uPa2kHJhLav20DQgXOhpEitw==} + '@swc/core@1.9.3': + resolution: {integrity: sha512-oRj0AFePUhtatX+BscVhnzaAmWjpfAeySpM1TCbxA1rtBDeH/JDhi5yYzAKneDYtVtBvA7ApfeuzhMC9ye4xSg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -4008,11 +4002,11 @@ packages: '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@swc/types@0.1.13': - resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==} + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} - '@tanstack/query-core@5.60.5': - resolution: {integrity: sha512-jiS1aC3XI3BJp83ZiTuDLerTmn9P3U95r6p+6/SNauLJaYxfIC4dMuWygwnBHIZxjn2zJqEpj3nysmPieoxfPQ==} + '@tanstack/query-core@5.62.3': + resolution: {integrity: sha512-Jp/nYoz8cnO7kqhOlSv8ke/0MJRJVGuZ0P/JO9KQ+f45mpN90hrerzavyTKeSoT/pOzeoOUkv1Xd0wPsxAWXfg==} '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} @@ -4022,15 +4016,15 @@ packages: resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.0.1': - resolution: {integrity: sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==} + '@testing-library/react@16.1.0': + resolution: {integrity: sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 - '@types/react-dom': ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -4051,10 +4045,13 @@ packages: resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} - '@tufjs/models@2.0.0': - resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + '@tufjs/models@2.0.1': + resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} engines: {node: ^16.14.0 || >=18.0.0} + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -4112,8 +4109,8 @@ packages: '@types/d3-path@3.1.0': resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} '@types/d3-scale@4.0.8': resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} @@ -4124,8 +4121,8 @@ packages: '@types/d3-time-format@4.0.3': resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -4139,14 +4136,11 @@ packages: '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/express-serve-static-core@4.17.42': - resolution: {integrity: sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ==} + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -4202,9 +4196,6 @@ packages: '@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==} @@ -4223,8 +4214,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.17.7': - resolution: {integrity: sha512-sZXXnpBFMKbao30dUAvzKbdwA2JM1fwUtVEq/kxKuPI5mMwZiRElCpTXb0Biq/LMEVpXDZL5G5V0RPnxKeyaYg==} + '@types/node@20.17.9': + resolution: {integrity: sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4232,17 +4223,17 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/prop-types@15.7.13': - resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/qs@6.9.11': - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + '@types/qs@6.9.17': + resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + '@types/react-dom@18.3.2': + resolution: {integrity: sha512-Fqp+rcvem9wEnGr3RY8dYNvSQ8PoLqjZ9HLgaPUOjJJD120uDyOxOjc/39M4Kddp9JQCxpGQbnhVQF0C0ncYVg==} '@types/react-router-dom@5.3.3': resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} @@ -4250,14 +4241,11 @@ packages: '@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.11': resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} - '@types/react@18.3.12': - resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + '@types/react@18.3.14': + resolution: {integrity: sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==} '@types/requestidlecallback@0.3.7': resolution: {integrity: sha512-5/EwNH3H/+M2zxATq9UidyD7rCq3WhK5Te/XhdhqP270QoGInVkoNBj6kK2Ah5slkZewkX8XJb7WDaYhmJu+eg==} @@ -4271,8 +4259,8 @@ packages: '@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/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/sinon@17.0.3': resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==} @@ -4286,8 +4274,8 @@ packages: '@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/stylis@4.2.7': + resolution: {integrity: sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==} '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -4335,8 +4323,8 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + '@typescript-eslint/scope-manager@8.17.0': + resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@7.18.0': @@ -4353,8 +4341,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + '@typescript-eslint/types@8.17.0': + resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': @@ -4366,8 +4354,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + '@typescript-eslint/typescript-estree@8.17.0': + resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -4381,8 +4369,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.17.0': + resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4395,30 +4383,30 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + '@typescript-eslint/visitor-keys@8.17.0': + resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitejs/plugin-react-swc@3.7.1': - resolution: {integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==} + '@vitejs/plugin-react-swc@3.7.2': + resolution: {integrity: sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==} peerDependencies: - vite: ^4 || ^5 + vite: ^4 || ^5 || ^6 - '@vitejs/plugin-react@4.3.3': - resolution: {integrity: sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitest/browser@2.1.5': - resolution: {integrity: sha512-JrpnxvkrjlBrF7oXbK/YytWVYfJIzWYeDKppANlUaisBKwDso+yXlWocAJrANx8gUxyirF355Yx80S+SKQqayg==} + '@vitest/browser@2.1.8': + resolution: {integrity: sha512-OWVvEJThRgxlNMYNVLEK/9qVkpRcLvyuKLngIV3Hob01P56NjPHprVBYn+rx4xAJudbM9yrCrywPIEuA3Xyo8A==} peerDependencies: playwright: '*' safaridriver: '*' - vitest: 2.1.5 + vitest: 2.1.8 webdriverio: '*' peerDependenciesMeta: playwright: @@ -4428,11 +4416,11 @@ packages: webdriverio: optional: true - '@vitest/expect@2.1.5': - resolution: {integrity: sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==} + '@vitest/expect@2.1.8': + resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} - '@vitest/mocker@2.1.5': - resolution: {integrity: sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==} + '@vitest/mocker@2.1.8': + resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 @@ -4442,70 +4430,70 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.5': - resolution: {integrity: sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==} + '@vitest/pretty-format@2.1.8': + resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} - '@vitest/runner@2.1.5': - resolution: {integrity: sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==} + '@vitest/runner@2.1.8': + resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} - '@vitest/snapshot@2.1.5': - resolution: {integrity: sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==} + '@vitest/snapshot@2.1.8': + resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} - '@vitest/spy@2.1.5': - resolution: {integrity: sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==} + '@vitest/spy@2.1.8': + resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} - '@vitest/ui@2.1.5': - resolution: {integrity: sha512-ERgKkDMTfngrZip6VG5h8L9B5D0AH/4+bga4yR1UzGH7c2cxv3LWogw2Dvuwr9cP3/iKDHYys7kIFLDKpxORTg==} + '@vitest/ui@2.1.8': + resolution: {integrity: sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w==} peerDependencies: - vitest: 2.1.5 + vitest: 2.1.8 - '@vitest/utils@2.1.5': - resolution: {integrity: sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==} + '@vitest/utils@2.1.8': + resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} '@webpack-cli/configtest@2.1.1': resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} @@ -4541,15 +4529,15 @@ packages: '@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'} + '@yarnpkg/parsers@3.0.2': + resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} + engines: {node: '>=18.12.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==} + '@zkochan/js-yaml@0.0.7': + resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true JSONStream@1.3.5: @@ -4559,9 +4547,6 @@ packages: 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} @@ -4579,8 +4564,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} acorn@8.14.0: @@ -4595,8 +4580,8 @@ packages: 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==} + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} aggregate-error@3.1.0: @@ -4631,8 +4616,11 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - algoliasearch@5.12.0: - resolution: {integrity: sha512-psGBRYdGgik8I6m28iAB8xpubvjEt7UQU+w5MAJUA2324WHiGoHap5BPkkjB14rMaXeRts6pmOsrVIglGyOVwg==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + algoliasearch@5.15.0: + resolution: {integrity: sha512-Yf3Swz1s63hjvBVZ/9f2P1Uu48GjmjCN+Esxb6MAONMGtZB1fRX8/S1AhUTtsuTlcGovbYLxpHgc7wEzstDZBw==} engines: {node: '>= 14.0.0'} amdefine@1.0.1: @@ -4654,8 +4642,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -4770,8 +4758,8 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - array.prototype.reduce@1.0.6: - resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} + array.prototype.reduce@1.0.7: + resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: @@ -4818,8 +4806,8 @@ packages: async@1.5.2: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -4839,8 +4827,8 @@ packages: resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axios@1.7.8: + resolution: {integrity: sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -4867,8 +4855,8 @@ packages: 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==} + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4877,8 +4865,8 @@ packages: 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==} + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4931,8 +4919,8 @@ packages: resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} binary@0.3.0: @@ -4975,8 +4963,8 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5028,8 +5016,8 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - cacache@18.0.3: - resolution: {integrity: sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==} + cacache@18.0.4: + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} caching-transform@4.0.0: @@ -5066,8 +5054,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001667: - resolution: {integrity: sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==} + caniuse-lite@1.0.30001686: + resolution: {integrity: sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==} chai-dom@1.12.0: resolution: {integrity: sha512-pLP8h6IBR8z1AdeQ+EMcJ7dXPdsax/1Q7gdGZjsnAmSBl3/gItQUYSCo32br1qOy4SlcBjvqId7ilAf3uJ2K1w==} @@ -5110,10 +5098,6 @@ packages: 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.12: resolution: {integrity: sha512-vVBIGQVnwtUG+SYe0ge+3MvF78cvSpuCOEUJr7sVEk2vSBuMW6OXNJjSzdtzrlxNUEaoqH2GBd5Y/+18BEB01Q==} @@ -5138,16 +5122,16 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} engines: {node: '>=8'} clean-css@5.3.3: @@ -5397,10 +5381,6 @@ packages: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -5409,15 +5389,15 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - core-js-compat@3.38.1: - resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} 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-js@3.39.0: + resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -5469,8 +5449,8 @@ packages: cross-spawn@4.0.2: resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} css-color-keywords@1.0.0: @@ -5498,12 +5478,12 @@ packages: engines: {node: '>=4'} hasBin: true - cssjanus@2.1.0: - resolution: {integrity: sha512-kAijbny3GmdOi9k+QT6DGIXqFvL96aksNlGr4Rhk9qXDZYWUojU4bRc3IHWxdaLNOqgEZHuXoe5Wl2l7dxLW5g==} + cssjanus@2.3.0: + resolution: {integrity: sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==} engines: {node: '>=10.0.0'} - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} engines: {node: '>=18'} csstype@3.1.3: @@ -5679,8 +5659,8 @@ packages: babel-plugin-macros: optional: true - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} deep-eql@5.0.2: @@ -5811,12 +5791,12 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} engines: {node: '>=12'} - dotenv@16.3.2: - resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} + dotenv@16.4.6: + resolution: {integrity: sha512-JhcR/+KIjkkjiU8yEpaB/USlzVi3i5whwOjpIRNGi9svKEXZSe+Qp6IWAjFjv+2GViAoDRCUv/QLNziQxsLqDg==} engines: {node: '>=12'} duplexer2@0.1.4: @@ -5834,13 +5814,13 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.32: - resolution: {integrity: sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==} + electron-to-chromium@1.5.68: + resolution: {integrity: sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -5866,12 +5846,12 @@ packages: 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==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.5.4: - resolution: {integrity: sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==} + engine.io@6.6.2: + resolution: {integrity: sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==} engines: {node: '>=10.2.0'} enhanced-resolve@0.9.1: @@ -5886,8 +5866,9 @@ packages: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} - ent@2.2.0: - resolution: {integrity: sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==} + ent@2.2.1: + resolution: {integrity: sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==} + engines: {node: '>= 0.4'} entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -5905,14 +5886,19 @@ packages: engines: {node: '>=4'} hasBin: true + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + 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==} + es-abstract@1.23.5: + resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} engines: {node: '>= 0.4'} es-array-method-boxes-properly@1.0.0: @@ -5926,8 +5912,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.1.0: - resolution: {integrity: sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==} + es-iterator-helpers@1.2.0: + resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} engines: {node: '>= 0.4'} es-module-lexer@1.5.4: @@ -5944,8 +5930,8 @@ packages: es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} es6-error@4.1.1: @@ -5961,8 +5947,8 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-html@1.0.3: @@ -6061,8 +6047,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@50.5.0: - resolution: {integrity: sha512-xTkshfZrUbiSHXBwZ/9d5ulZ2OcHXxSvm/NPo494H/hadLRJwOq5PMV0EUpMqsb9V+kQo+9BAgi6Z7aJtdBp2A==} + eslint-plugin-jsdoc@50.6.0: + resolution: {integrity: sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -6093,14 +6079,14 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110: - resolution: {integrity: sha512-b5/hRnOQlnH9CEnJQ6UrPoIAG4y/wIGv+OVEHTeAkbq+1uojfcuQyLToYvK1T9a6vz5WQHeMjQqFOZk3mtWorg==} + eslint-plugin-react-compiler@19.0.0-beta-df7b47d-20241124: + resolution: {integrity: sha512-82PfnllC8jP/68KdLAbpWuYTcfmtGLzkqy2IW85WopKMTr+4rdQpp+lfliQ/QE79wWrv/dRoADrk3Pdhq25nTw==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' - eslint-plugin-react-hooks@5.0.0: - resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} + eslint-plugin-react-hooks@5.1.0: + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -6111,9 +6097,9 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-testing-library@7.0.0: - resolution: {integrity: sha512-Bwrn5Qi08Lf5Huv4ZGDNYxwkFLAyGQIPB9lC0ALlojymP32aKsSxWnccP1NvIcI5vMhkENg4Y5Td/Q9/tLYmGQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, npm: '>=9.8.1'} + eslint-plugin-testing-library@7.1.1: + resolution: {integrity: sha512-nszC833aZPwB6tik1nMkbFqmtgIXTT0sfJEYs0zMBKMlkQ4to2079yUV96SvmLh00ovSBJI4pgcBC1TiIP8mXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: ^9.14.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6149,8 +6135,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -6224,8 +6210,8 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@9.5.1: - resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==} + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} engines: {node: ^18.19.0 || >=20.5.0} expand-tilde@2.0.2: @@ -6281,12 +6267,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + 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==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} @@ -6330,8 +6319,8 @@ packages: resolution: {integrity: sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==} engines: {node: '>= 0.8'} - find-babel-config@2.1.1: - resolution: {integrity: sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==} + find-babel-config@2.1.2: + resolution: {integrity: sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==} find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} @@ -6376,15 +6365,15 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - flow-parser@0.227.0: - resolution: {integrity: sha512-nOygtGKcX/siZK/lFzpfdHEfOkfGcTW7rNroR1Zsz6T/JxSahPALXVt5qVHq/fgvMJuv096BTKbgxN3PzVBaDA==} + flow-parser@0.255.0: + resolution: {integrity: sha512-7QHV2m2mIMh6yIMaAPOVbyNEW77IARwO69d4DgvfDCjuORiykdMLf7XBjF7Zeov7Cpe1OXJ8sB6/aaCE3xuRBw==} engines: {node: '>=0.4.0'} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6403,8 +6392,8 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} format-util@1.0.5: @@ -6428,6 +6417,9 @@ packages: fromentries@1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -6482,8 +6474,8 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gaxios@6.1.1: - resolution: {integrity: sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==} + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} gcp-metadata@6.1.0: @@ -6538,8 +6530,8 @@ packages: 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-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} git-config-path@1.0.1: resolution: {integrity: sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg==} @@ -6583,9 +6575,8 @@ packages: 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'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@11.0.0: @@ -6642,12 +6633,13 @@ packages: resolution: {integrity: sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==} engines: {node: '>=14'} - googleapis-common@7.0.1: - resolution: {integrity: sha512-mgt5zsd7zj5t5QXvDanjWguMdHAcJmmDrF9RkInCecNsyV7S7YtGqm5v2IWONNID88osb7zmx5FtrAP12JfD0w==} + googleapis-common@7.2.0: + resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} engines: {node: '>=14.0.0'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.1.0: + resolution: {integrity: sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -6659,8 +6651,8 @@ packages: resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - gtoken@7.0.1: - resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} gzip-size@6.0.0: @@ -6698,12 +6690,12 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-proto@1.1.0: + resolution: {integrity: sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: @@ -6728,11 +6720,11 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - hermes-estree@0.20.1: - resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - hermes-parser@0.20.1: - resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -6822,8 +6814,8 @@ packages: resolution: {integrity: sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==} engines: {node: '>=4'} - hyphenate-style-name@1.0.4: - resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -6840,12 +6832,12 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore-walk@6.0.4: - resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} + ignore-walk@6.0.5: + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} immediate@3.0.6: @@ -6860,6 +6852,11 @@ packages: engines: {node: '>=8'} hasBin: true + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -6882,6 +6879,10 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@4.1.3: + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + init-package-json@6.0.3: resolution: {integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -6906,8 +6907,9 @@ packages: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} engines: {node: '>=10.13.0'} - ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -6931,15 +6933,16 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} 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==} + is-boolean-object@1.2.0: + resolution: {integrity: sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==} engines: {node: '>= 0.4'} is-callable@1.2.7: @@ -6978,8 +6981,9 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.0: + resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -7003,8 +7007,9 @@ packages: is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} @@ -7013,8 +7018,8 @@ packages: is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.0: + resolution: {integrity: sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -7059,12 +7064,13 @@ packages: is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.0: + resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==} engines: {node: '>= 0.4'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} @@ -7085,12 +7091,12 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.0: + resolution: {integrity: sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.0: + resolution: {integrity: sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==} engines: {node: '>= 0.4'} is-text-path@1.0.1: @@ -7108,18 +7114,20 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} @@ -7161,8 +7169,8 @@ packages: resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} engines: {node: '>=8'} - istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} istanbul-lib-processinfo@2.0.3: @@ -7177,8 +7185,8 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} istanbul@0.4.5: @@ -7193,16 +7201,15 @@ packages: resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} engines: {node: '>= 0.4'} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.0.1: - resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} engines: {node: 20 || >=22} - jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} hasBin: true @@ -7232,6 +7239,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jscodeshift@17.1.1: resolution: {integrity: sha512-4vq5B1sD37aa9qed3zWq2XQPun5XjxebIv+Folr57lt8B4HLGDHEz1UG7pfcxzSaelzPbcY7yZSs033/S0i6wQ==} engines: {node: '>=16'} @@ -7246,8 +7256,8 @@ packages: resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} engines: {node: '>=12.0.0'} - jsdom@24.1.3: - resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} + jsdom@25.0.1: + resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} engines: {node: '>=18'} peerDependencies: canvas: ^2.11.2 @@ -7421,8 +7431,8 @@ packages: 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-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} @@ -7459,8 +7469,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + lines-and-columns@2.0.3: + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} linkify-it@5.0.0: @@ -7662,8 +7672,8 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true - magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} make-array@1.0.5: resolution: {integrity: sha512-sgK2SAzxT19rWU+qxKUcn6PAh/swiIiz2F8C2cZjLc1z4iwYIfdoihqFIDQ8BDzAGtWPYJ6Sr13K1j/DXynDLA==} @@ -7681,8 +7691,8 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-fetch-happen@13.0.0: - resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + make-fetch-happen@13.0.1: + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} engines: {node: ^16.14.0 || >=18.0.0} map-obj@1.0.1: @@ -7697,8 +7707,8 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - markdown-to-jsx@7.6.2: - resolution: {integrity: sha512-gEcyiJXzBxmId2Y/kydLbD6KRNccDiUy/Src1cFGn3s2X0LZZ/hUiEc2VisFyA5kUE3SXclTCczjQiAuqKZiFQ==} + markdown-to-jsx@7.7.1: + resolution: {integrity: sha512-BjLkHb+fWCAH9gp7ndbgPrY+zeZlGFtCiQNTWk+PD+GKfLg9YsUPNonSsYXGw6nQ7eZqeR+i71X59PpWXlxc/w==} engines: {node: '>= 10'} peerDependencies: react: '>= 0.14.0' @@ -7721,19 +7731,19 @@ packages: resolution: {integrity: sha512-s73fU2CQN7WCgjhaQUQ8wYESQNzGRNOKDd+3xgVqu8kuTEhmwepd/mxOv1LR2oV046ONrTLBFsM7IoKWNvmy5g==} engines: {node: '>=18'} - marked@14.1.4: - resolution: {integrity: sha512-vkVZ8ONmUdPnjCKc5uTRvmkRbx4EAi2OkTOXmfTDhZz3OFqMNBM1oTTWwTr4HY4uAEojhzPf+Fy8F1DWa3Sndg==} + marked@15.0.3: + resolution: {integrity: sha512-Ai0cepvl2NHnTcO9jYDtcOEtVBNVYR31XnEA3BndO7f5As1wzpcOceSUM8FDkNLJNIODcLpDTWay/qQhqbuMvg==} engines: {node: '>= 18'} hasBin: true - mdast-util-from-markdown@2.0.1: - resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} @@ -7778,68 +7788,68 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-core-commonmark@2.0.1: - resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.1: - resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + micromark-util-subtokenize@2.0.3: + resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -7904,8 +7914,8 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist-options@4.1.0: @@ -7919,8 +7929,8 @@ packages: 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==} + minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} minipass-flush@1.0.5: @@ -8002,8 +8012,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.6.5: - resolution: {integrity: sha512-PnlnTpUlOrj441kYQzzFhzMzMCGFT6a2jKUBG7zSpLkYS5oh8Arrbc0dL8/rNAtxaoBy0EVs2mFqj2qdmWK7lQ==} + msw@2.6.6: + resolution: {integrity: sha512-npfIIVRHKQX3Lw4aLWX4wBh+lQwpqdZNyJYB5K/+ktK8NhtkdsTxGK7WDrgknozcVyRI7TOqY6yBS9j2FTR+YQ==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -8033,8 +8043,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -8045,6 +8055,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} @@ -8055,8 +8069,8 @@ packages: nested-error-stacks@2.1.1: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - next@14.2.18: - resolution: {integrity: sha512-H9qbjDuGivUDEnK6wa+p2XKO+iMzgVgyr9Zp/4Iv29lKa+DYaxJGjOeEA+5VOvJh/M7HLiskehInSa0cWxVXUw==} + next@14.2.20: + resolution: {integrity: sha512-yPvIiWsiyVYqJlSQxwmzMIReXn5HxFNq4+tlVQ812N1FbvhmE+fDpIAD7bcS2mGYQwPJ5vAsQouyme2eKsxaug==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -8107,12 +8121,12 @@ packages: encoding: optional: true - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-gyp@10.0.1: - resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} + node-gyp@10.3.1: + resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} engines: {node: ^16.14.0 || >=18.0.0} hasBin: true @@ -8154,8 +8168,8 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + npm-bundled@3.0.1: + resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-install-checks@6.3.0: @@ -8174,8 +8188,8 @@ packages: resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - npm-pick-manifest@9.0.1: - resolution: {integrity: sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==} + npm-pick-manifest@9.1.0: + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} engines: {node: ^16.14.0 || >=18.0.0} npm-registry-fetch@17.1.0: @@ -8196,14 +8210,14 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} - nx@17.3.0: - resolution: {integrity: sha512-CoY0qUrO8xErbA/v/bbfDGs+KaD9MCO7PReqmIeyrtDNwFl6vnb+U2MpBxCsRP+YH2Oa8hI8Lu+kcnPktx2v6A==} + nx@20.1.4: + resolution: {integrity: sha512-hyvGYxTzBkPxSXAB2tuqdv9TpVde5xOdGalsIdhF7j7PI3nwPpqtc3y28YTgRgpxtOE1Y6BfDNkXMO1SW0xu2w==} hasBin: true peerDependencies: - '@swc-node/register': ^1.6.7 + '@swc-node/register': ^1.8.0 '@swc/core': ^1.3.85 peerDependenciesMeta: '@swc-node/register': @@ -8224,8 +8238,9 @@ packages: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} engines: {node: '>= 6'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} object-keys@0.4.0: resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} @@ -8246,8 +8261,8 @@ packages: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.getownpropertydescriptors@2.1.7: - resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} + object.getownpropertydescriptors@2.1.8: + resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} engines: {node: '>= 0.8'} object.groupby@1.0.3: @@ -8281,8 +8296,8 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openapi-fetch@0.13.0: - resolution: {integrity: sha512-6Nlf/BDbtyHwHdNrLPUiyt4CZMzL3ZyAt55yWH8W7+Z+8aYWnvca4uZHQHXViy8KcnCMqAhLM/bifh2Yjjkf6w==} + openapi-fetch@0.13.1: + resolution: {integrity: sha512-8P77k9Cmp0VNyry8ml293v1mqAyr4AkN7fE9VuUJ2mR0bK1NWihDM+Vj5/Try4aIYwYpT2OyCrYS3ObIRtO4LQ==} openapi-typescript-helpers@0.0.15: resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} @@ -8295,8 +8310,8 @@ packages: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@5.3.0: @@ -8425,8 +8440,8 @@ packages: resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} engines: {node: '>=8'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} pacote@18.0.6: resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} @@ -8454,13 +8469,13 @@ packages: 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'} + parse-github-url@1.0.3: + resolution: {integrity: sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==} + engines: {node: '>= 0.10'} hasBin: true - parse-imports@2.1.1: - resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==} + parse-imports@2.2.1: + resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==} engines: {node: '>= 18'} parse-json@4.0.0: @@ -8488,8 +8503,8 @@ packages: parse-url@8.1.0: resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -8528,9 +8543,9 @@ packages: 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-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} @@ -8542,8 +8557,8 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.1.0: - resolution: {integrity: sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} path-type@3.0.0: @@ -8622,23 +8637,13 @@ packages: 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-core@1.48.2: - resolution: {integrity: sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==} + playwright-core@1.49.0: + resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} engines: {node: '>=18'} hasBin: true - playwright@1.44.1: - resolution: {integrity: sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==} - engines: {node: '>=16'} - hasBin: true - - playwright@1.48.2: - resolution: {integrity: sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==} + playwright@1.49.0: + resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} engines: {node: '>=18'} hasBin: true @@ -8646,8 +8651,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -8677,8 +8682,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -8693,8 +8698,8 @@ packages: 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==} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} pretty-quick@4.0.0: @@ -8712,10 +8717,6 @@ packages: 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} - proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -8723,8 +8724,8 @@ packages: 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==} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} engines: {node: '>=8'} process@0.11.10: @@ -8738,8 +8739,8 @@ packages: promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} - promise-call-limit@3.0.1: - resolution: {integrity: sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg==} + promise-call-limit@3.0.2: + resolution: {integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==} promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} @@ -8753,8 +8754,8 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} - promzard@1.0.0: - resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} + promzard@1.0.2: + resolution: {integrity: sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} prop-types@15.8.1: @@ -8773,13 +8774,16 @@ packages: pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} 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'} @@ -8792,6 +8796,10 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + qs@6.13.1: + resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==} + engines: {node: '>=0.6'} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -8838,8 +8846,8 @@ packages: peerDependencies: react: ^18.3.1 - react-hook-form@7.53.2: - resolution: {integrity: sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==} + react-hook-form@7.54.0: + resolution: {integrity: sha512-PS05+UQy/IdSbJNojBypxAo9wllhHgGmyr8/dyGQcPoiMf3e7Dfb9PWYVRco55bLbxH9S+1yDDJeTdlYCSxO3A==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -8851,15 +8859,15 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-router-dom@6.27.0: - resolution: {integrity: sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==} + react-router-dom@6.28.0: + resolution: {integrity: sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.27.0: - resolution: {integrity: sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==} + react-router@6.28.0: + resolution: {integrity: sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -8910,10 +8918,6 @@ packages: 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} - read@3.0.1: resolution: {integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -8955,8 +8959,8 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + reflect.getprototypeof@1.0.7: + resolution: {integrity: sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==} engines: {node: '>= 0.4'} regenerate-unicode-properties@10.2.0: @@ -8975,12 +8979,12 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} - regexpu-core@6.1.1: - resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} registry-auth-token@3.3.2: @@ -8993,8 +8997,8 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.11.1: - resolution: {integrity: sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==} + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true relateurl@0.2.7: @@ -9079,8 +9083,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rifm@0.12.1: resolution: {integrity: sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==} @@ -9110,8 +9114,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.18.1: - resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} + rollup@4.28.0: + resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -9119,9 +9123,6 @@ packages: resolution: {integrity: sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ==} engines: {node: '>= 0.10'} - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - rrweb-cssom@0.7.1: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} @@ -9174,8 +9175,8 @@ packages: 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==} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} @@ -9185,11 +9186,6 @@ packages: 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.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -9250,8 +9246,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -9267,8 +9264,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sigstore@2.2.0: - resolution: {integrity: sha512-fcU9clHwEss2/M/11FFM8Jwc4PjBgbhXoNskoK5guoK0qGQBSeUbQZRJ+B2fDFIvhyf0gqCaPrel9mszbhAxug==} + sigstore@2.3.1: + resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} engines: {node: ^16.14.0 || >=18.0.0} simple-swizzle@0.2.2: @@ -9308,24 +9305,24 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socket.io-adapter@2.5.2: - resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} 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==} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} - socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} engines: {node: '>= 14'} - socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sort-keys@2.0.0: resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} @@ -9357,8 +9354,8 @@ packages: spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.4.0: - resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} @@ -9366,8 +9363,8 @@ packages: 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==} + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -9378,6 +9375,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -9561,8 +9561,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} tapable@0.1.10: @@ -9601,8 +9601,8 @@ packages: uglify-js: optional: true - terser@5.27.0: - resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + terser@5.36.0: + resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} engines: {node: '>=10'} hasBin: true @@ -9649,8 +9649,8 @@ packages: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} - tinypool@1.0.1: - resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: @@ -9661,6 +9661,13 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tldts-core@6.1.65: + resolution: {integrity: sha512-Uq5t0N0Oj4nQSbU8wFN1YYENvMthvwU13MQrMJRspYCGLSAZjAfoBOJki5IQpnBM/WFskxxC/gIOTwaedmHaSg==} + + tldts@6.1.65: + resolution: {integrity: sha512-xU9gLTfAGsADQ2PcWee6Hg8RFAv0DnjMGVJmDnUmI8a9+nYmapMQix4afwrdaCtT+AqP4MaxEzu7cCrYmBPbzQ==} + hasBin: true + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -9685,6 +9692,10 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} + tough-cookie@5.0.0: + resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -9710,8 +9721,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -9729,6 +9740,9 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsscmp@1.0.6: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} @@ -9738,8 +9752,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - tuf-js@2.2.0: - resolution: {integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==} + tuf-js@2.2.1: + resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} engines: {node: ^16.14.0 || >=18.0.0} tunnel@0.0.6: @@ -9790,8 +9804,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.26.1: - resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} + type-fest@4.30.0: + resolution: {integrity: sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==} engines: {node: '>=16'} type-is@1.6.18: @@ -9810,12 +9824,12 @@ packages: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.3: + resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typedarray-to-buffer@3.1.5: @@ -9829,14 +9843,15 @@ packages: engines: {node: '>=14.17'} hasBin: true - ua-parser-js@0.7.37: - resolution: {integrity: sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==} + ua-parser-js@0.7.39: + resolution: {integrity: sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==} + hasBin: true 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==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -9850,16 +9865,16 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} 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==} + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} engines: {node: '>=4'} unicode-property-aliases-ecmascript@2.1.0: @@ -9926,8 +9941,8 @@ packages: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -9947,10 +9962,10 @@ packages: urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - use-sync-external-store@1.2.2: - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -9973,6 +9988,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.0.3: + resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -9981,8 +10000,8 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} v8flags@3.2.0: @@ -10006,20 +10025,21 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@2.1.5: - resolution: {integrity: sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==} + vite-node@2.1.8: + resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.3.4: - resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': ^20.17.7 + '@types/node': ^20.17.9 less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -10032,6 +10052,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -10039,15 +10061,15 @@ packages: terser: optional: true - vitest@2.1.5: - resolution: {integrity: sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==} + vitest@2.1.8: + resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^20.17.7 - '@vitest/browser': 2.1.5 - '@vitest/ui': 2.1.5 + '@types/node': ^20.17.9 + '@vitest/browser': 2.1.8 + '@vitest/ui': 2.1.8 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -10075,8 +10097,8 @@ packages: walk-up-path@3.0.1: resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: @@ -10122,8 +10144,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.96.1: - resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -10147,21 +10169,23 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.0: + resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==} + engines: {node: '>= 0.4'} - which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + which-builtin-type@1.2.0: + resolution: {integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.16: + resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} engines: {node: '>= 0.4'} which@1.3.1: @@ -10236,8 +10260,8 @@ packages: resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} engines: {node: '>=8'} - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -10248,12 +10272,12 @@ packages: utf-8-validate: optional: true - ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true @@ -10342,24 +10366,24 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - yoctocolors@2.0.2: - resolution: {integrity: sha512-Ct97huExsu7cWeEjmrXlofevF8CvzUglJ4iGUet5B8xn1oumtAZBpHU4GzYuoE6PVqcZ5hghtBrSlhwHuR1Jmw==} + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} 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==} + zod-validation-error@3.4.0: + resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} peerDependencies: zod: ^3.18.0 @@ -10372,12 +10396,10 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@actions/core@1.11.1': dependencies: '@actions/exec': 1.1.1 - '@actions/http-client': 2.2.1 + '@actions/http-client': 2.2.3 '@actions/exec@1.1.1': dependencies: @@ -10385,142 +10407,142 @@ snapshots: '@actions/github@6.0.0': dependencies: - '@actions/http-client': 2.2.1 + '@actions/http-client': 2.2.3 '@octokit/core': 5.2.0 '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.2.0) '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.0) - '@actions/http-client@2.2.1': + '@actions/http-client@2.2.3': dependencies: tunnel: 0.0.6 undici: 5.28.4 '@actions/io@1.1.3': {} - '@adobe/css-tools@4.4.0': {} + '@adobe/css-tools@4.4.1': {} - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0)(search-insights@2.13.0)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0)(search-insights@2.13.0)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0) - search-insights: 2.13.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0) - '@algolia/client-search': 5.12.0 - algoliasearch: 5.12.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) + '@algolia/client-search': 5.15.0 + algoliasearch: 5.15.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)': dependencies: - '@algolia/client-search': 5.12.0 - algoliasearch: 5.12.0 + '@algolia/client-search': 5.15.0 + algoliasearch: 5.15.0 - '@algolia/client-abtesting@5.12.0': + '@algolia/client-abtesting@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-analytics@5.12.0': + '@algolia/client-analytics@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-common@5.12.0': {} + '@algolia/client-common@5.15.0': {} - '@algolia/client-insights@5.12.0': + '@algolia/client-insights@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-personalization@5.12.0': + '@algolia/client-personalization@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-query-suggestions@5.12.0': + '@algolia/client-query-suggestions@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/client-search@5.12.0': + '@algolia/client-search@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/ingestion@1.12.0': + '@algolia/ingestion@1.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/monitoring@1.12.0': + '@algolia/monitoring@1.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/recommend@5.12.0': + '@algolia/recommend@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + '@algolia/client-common': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 - '@algolia/requester-browser-xhr@5.12.0': + '@algolia/requester-browser-xhr@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 + '@algolia/client-common': 5.15.0 - '@algolia/requester-fetch@5.12.0': + '@algolia/requester-fetch@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 + '@algolia/client-common': 5.15.0 - '@algolia/requester-node-http@5.12.0': + '@algolia/requester-node-http@5.15.0': dependencies: - '@algolia/client-common': 5.12.0 + '@algolia/client-common': 5.15.0 '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@argos-ci/api-client@0.7.0': + '@argos-ci/api-client@0.7.1': dependencies: debug: 4.3.7(supports-color@8.1.1) - openapi-fetch: 0.13.0 + openapi-fetch: 0.13.1 transitivePeerDependencies: - supports-color - '@argos-ci/core@2.11.0': + '@argos-ci/core@2.12.0': dependencies: - '@argos-ci/api-client': 0.7.0 - '@argos-ci/util': 2.2.0 - axios: 1.7.7(debug@4.3.7) + '@argos-ci/api-client': 0.7.1 + '@argos-ci/util': 2.2.1 + axios: 1.7.8(debug@4.3.7) convict: 6.2.4 debug: 4.3.7(supports-color@8.1.1) fast-glob: 3.3.2 @@ -10529,9 +10551,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@argos-ci/util@2.2.0': {} + '@argos-ci/util@2.2.1': {} - '@babel/cli@7.25.9(@babel/core@7.26.0)': + '@babel/cli@7.26.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@jridgewell/trace-mapping': 0.3.25 @@ -10545,26 +10567,26 @@ snapshots: '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 chokidar: 3.6.0 - '@babel/code-frame@7.26.0': + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.0': {} + '@babel/compat-data@7.26.2': {} '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.0 - '@babel/generator': 7.26.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.1 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 convert-source-map: 2.0.0 debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -10573,30 +10595,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.0': + '@babel/generator@7.26.3': dependencies: - '@babel/parser': 7.26.1 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.26.0 + '@babel/compat-data': 7.26.2 '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.0 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -10608,7 +10630,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -10617,10 +10639,10 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.1.1 + regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 @@ -10633,15 +10655,15 @@ snapshots: '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color @@ -10650,13 +10672,13 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 '@babel/helper-plugin-utils@7.25.9': {} @@ -10665,7 +10687,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -10674,21 +10696,21 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color '@babel/helper-simple-access@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color @@ -10701,35 +10723,35 @@ snapshots: '@babel/helper-wrap-function@7.25.9': dependencies: '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 '@babel/node@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/register': 7.25.9(@babel/core@7.26.0) commander: 6.2.1 - core-js: 3.35.1 + core-js: 3.39.0 node-environment-flags: 1.0.6 regenerator-runtime: 0.14.1 v8flags: 3.2.0 - '@babel/parser@7.26.1': + '@babel/parser@7.26.3': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -10756,15 +10778,7 @@ snapshots: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -10777,7 +10791,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 @@ -10818,7 +10832,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -10864,7 +10878,7 @@ snapshots: '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -10915,11 +10929,11 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-flow-strip-types@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: @@ -10934,7 +10948,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -10981,7 +10995,7 @@ snapshots: '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -11086,12 +11100,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 @@ -11103,7 +11117,7 @@ snapshots: '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color @@ -11135,9 +11149,9 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -11206,7 +11220,7 @@ snapshots: '@babel/preset-env@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/compat-data': 7.26.0 + '@babel/compat-data': 7.26.2 '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 @@ -11271,29 +11285,29 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.26.0) - core-js-compat: 3.38.1 + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.24.7(@babel/core@7.26.0)': + '@babel/preset-flow@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-flow-strip-types': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-transform-flow-strip-types': 7.25.9(@babel/core@7.26.0) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 esutils: 2.0.3 - '@babel/preset-react@7.25.9(@babel/core@7.26.0)': + '@babel/preset-react@7.26.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 @@ -11336,23 +11350,23 @@ snapshots: '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.26.0 - '@babel/parser': 7.26.1 - '@babel/types': 7.26.0 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 - '@babel/traverse@7.25.9': + '@babel/traverse@7.26.4': dependencies: - '@babel/code-frame': 7.26.0 - '@babel/generator': 7.26.0 - '@babel/parser': 7.26.1 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.0': + '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -11374,18 +11388,18 @@ snapshots: '@codspeed/core@3.1.1': dependencies: - axios: 1.7.7(debug@4.3.7) + axios: 1.7.8(debug@4.3.7) find-up: 6.3.0 - form-data: 4.0.0 - node-gyp-build: 4.8.1 + form-data: 4.0.1 + node-gyp-build: 4.8.4 transitivePeerDependencies: - debug - '@codspeed/vitest-plugin@3.1.1(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))(vitest@2.1.5)': + '@codspeed/vitest-plugin@3.1.1(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))(vitest@2.1.8)': dependencies: '@codspeed/core': 3.1.1 - vite: 5.3.4(@types/node@20.17.7)(terser@5.27.0) - vitest: 2.1.5(@types/node@20.17.7)(@vitest/browser@2.1.5)(@vitest/ui@2.1.5)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(terser@5.27.0) + vite: 5.4.11(@types/node@20.17.9)(terser@5.36.0) + vitest: 2.1.8(@types/node@20.17.9)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(jsdom@25.0.1)(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(terser@5.36.0) transitivePeerDependencies: - debug @@ -11395,32 +11409,40 @@ snapshots: '@docsearch/css@3.8.0': {} - '@docsearch/react@3.8.0(@algolia/client-search@5.12.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.13.0)': + '@docsearch/react@3.8.0(@algolia/client-search@5.15.0)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.12.0)(algoliasearch@5.12.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.15.0)(algoliasearch@5.15.0) '@docsearch/css': 3.8.0 - algoliasearch: 5.12.0 + algoliasearch: 5.15.0 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - search-insights: 2.13.0 + search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - '@emnapi/runtime@1.2.0': + '@emnapi/core@1.3.1': dependencies: - tslib: 2.6.2 - optional: true + '@emnapi/wasi-threads': 1.0.1 + tslib: 2.8.1 + + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + + '@emnapi/wasi-threads@1.0.1': + dependencies: + tslib: 2.8.1 - '@emotion/babel-plugin@11.12.0': + '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.1 + '@emotion/serialize': 1.3.3 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -11430,11 +11452,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/cache@11.13.1': + '@emotion/cache@11.13.5': dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 @@ -11444,7 +11466,7 @@ snapshots: dependencies: '@emotion/memoize': 0.8.1 - '@emotion/is-prop-valid@1.3.0': + '@emotion/is-prop-valid@1.3.1': dependencies: '@emotion/memoize': 0.9.0 @@ -11452,51 +11474,51 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1)': + '@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.1 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.13.5 + '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 transitivePeerDependencies: - supports-color - '@emotion/serialize@1.3.1': + '@emotion/serialize@1.3.3': dependencies: '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.2 csstype: 3.1.3 '@emotion/server@11.11.0': dependencies: - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.2 html-tokenize: 2.0.1 multipipe: 1.0.2 through: 2.3.8 '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + '@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/serialize': 1.3.1 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.13.5(@types/react@18.3.14)(react@18.3.1) + '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 transitivePeerDependencies: - supports-color @@ -11508,7 +11530,7 @@ snapshots: dependencies: react: 18.3.1 - '@emotion/utils@1.4.0': {} + '@emotion/utils@1.4.2': {} '@emotion/weak-memoize@0.4.0': {} @@ -11659,12 +11681,12 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/eslintrc@2.1.4': dependencies: @@ -11672,7 +11694,7 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -11684,7 +11706,7 @@ snapshots: '@fast-csv/format@4.3.5': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 lodash.escaperegexp: 4.1.2 lodash.isboolean: 3.0.3 lodash.isequal: 4.5.0 @@ -11693,7 +11715,7 @@ snapshots: '@fast-csv/parse@4.3.6': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 lodash.escaperegexp: 4.1.2 lodash.groupby: 4.6.0 lodash.isfunction: 3.0.9 @@ -11703,32 +11725,32 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@floating-ui/core@1.6.0': + '@floating-ui/core@1.6.8': dependencies: - '@floating-ui/utils': 0.2.1 + '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.6.1': + '@floating-ui/dom@1.6.12': dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 - '@floating-ui/react-dom@2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.6.1 + '@floating-ui/dom': 1.6.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@floating-ui/utils@0.2.1': {} + '@floating-ui/utils@0.2.8': {} '@gitbeaker/core@38.12.1': dependencies: '@gitbeaker/requester-utils': 38.12.1 - qs: 6.13.0 + qs: 6.13.1 xcase: 2.0.1 '@gitbeaker/requester-utils@38.12.1': dependencies: - qs: 6.13.0 + qs: 6.13.1 xcase: 2.0.1 '@gitbeaker/rest@38.12.1': @@ -11738,7 +11760,7 @@ snapshots: '@googleapis/sheets@9.3.1(encoding@0.1.13)': dependencies: - googleapis-common: 7.0.1(encoding@0.1.13) + googleapis-common: 7.2.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color @@ -11823,7 +11845,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.2.0 + '@emnapi/runtime': 1.3.1 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -11832,16 +11854,16 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@inquirer/confirm@5.0.1(@types/node@20.17.7)': + '@inquirer/confirm@5.0.2(@types/node@20.17.9)': dependencies: - '@inquirer/core': 10.0.1(@types/node@20.17.7) - '@inquirer/type': 3.0.0(@types/node@20.17.7) - '@types/node': 20.17.7 + '@inquirer/core': 10.1.0(@types/node@20.17.9) + '@inquirer/type': 3.0.1(@types/node@20.17.9) + '@types/node': 20.17.9 - '@inquirer/core@10.0.1(@types/node@20.17.7)': + '@inquirer/core@10.1.0(@types/node@20.17.9)': dependencies: - '@inquirer/figures': 1.0.7 - '@inquirer/type': 3.0.0(@types/node@20.17.7) + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@20.17.9) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -11852,11 +11874,11 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@inquirer/figures@1.0.7': {} + '@inquirer/figures@1.0.8': {} - '@inquirer/type@3.0.0(@types/node@20.17.7)': + '@inquirer/type@3.0.1(@types/node@20.17.9)': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@isaacs/cliui@8.0.2': dependencies: @@ -11889,11 +11911,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.5': + '@jridgewell/source-map@0.3.6': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 @@ -11902,15 +11924,15 @@ snapshots: '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@lerna/create@8.1.9(@swc/core@1.7.35(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2)': + '@lerna/create@8.1.9(@swc/core@1.9.3(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2)': dependencies: '@npmcli/arborist': 7.5.4 '@npmcli/package-json': 5.2.0 '@npmcli/run-script': 8.1.0 - '@nx/devkit': 17.3.0(nx@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5))) + '@nx/devkit': 20.1.4(nx@20.1.4(@swc/core@1.9.3(@swc/helpers@0.5.5))) '@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/rest': 19.0.11(encoding@0.1.13) aproba: 2.0.0 @@ -11949,7 +11971,7 @@ snapshots: npm-package-arg: 11.0.2 npm-packlist: 8.0.2 npm-registry-fetch: 17.1.0 - nx: 17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)) + nx: 20.1.4(@swc/core@1.9.3(@swc/helpers@0.5.5)) p-map: 4.0.0 p-map-series: 2.1.0 p-queue: 6.6.2 @@ -11988,7 +12010,7 @@ snapshots: - supports-color - typescript - '@mswjs/interceptors@0.37.0': + '@mswjs/interceptors@0.37.3': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -11997,101 +12019,101 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@mui/base@5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/base@5.0.0-beta.40(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.14) + '@mui/utils': 5.16.8(@types/react@18.3.14)(react@18.3.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 - '@mui/core-downloads-tracker@5.16.7': {} + '@mui/core-downloads-tracker@5.16.9': {} - '@mui/docs@6.1.8(5mdjhfhz45wjjqmb34n5tm4y5u)': + '@mui/docs@6.1.10(4eqodambaf55mpgx5qj7mrivui)': dependencies: '@babel/runtime': 7.26.0 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/icons-material': 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@mui/internal-markdown': 1.0.20 - '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/icons-material': 5.16.9(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@mui/internal-markdown': 1.0.22 + '@mui/material': 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) chai: 5.1.2 clipboard-copy: 4.0.1 clsx: 2.1.1 csstype: 3.1.3 - next: 14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.20(@babel/core@7.26.0)(@playwright/test@1.49.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nprogress: 0.2.0 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 - '@mui/icons-material@5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + '@mui/icons-material@5.16.9(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 '@mui/internal-babel-plugin-resolve-imports@1.0.18(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 resolve: 1.22.8 - '@mui/internal-docs-utils@1.0.15': + '@mui/internal-docs-utils@1.0.16': dependencies: rimraf: 6.0.1 typescript: 5.7.2 - '@mui/internal-markdown@1.0.20': + '@mui/internal-markdown@1.0.22': dependencies: '@babel/runtime': 7.26.0 lodash: 4.17.21 - marked: 14.1.4 + marked: 15.0.3 prismjs: 1.29.0 - '@mui/internal-scripts@1.0.27': + '@mui/internal-scripts@1.0.29': dependencies: '@babel/core': 7.26.0 '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.0 - '@mui/internal-docs-utils': 1.0.15 + '@babel/types': 7.26.3 + '@mui/internal-docs-utils': 1.0.16 doctrine: 3.0.0 lodash: 4.17.21 typescript: 5.7.2 - uuid: 9.0.1 + uuid: 11.0.3 transitivePeerDependencies: - supports-color - '@mui/internal-test-utils@1.0.21(@babel/core@7.26.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/internal-test-utils@1.0.22(@babel/core@7.26.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/register': 7.25.9(@babel/core@7.26.0) '@babel/runtime': 7.26.0 - '@emotion/cache': 11.13.1 - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/cache': 11.13.5 + '@emotion/react': 11.13.5(@types/react@18.3.14)(react@18.3.1) '@testing-library/dom': 10.4.0 - '@testing-library/react': 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@testing-library/react': 16.1.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) chai: 4.5.0 chai-dom: 1.12.0(chai@4.5.0) dom-accessibility-api: 0.7.0 format-util: 1.0.5 fs-extra: 11.2.0 - jsdom: 24.1.3 + jsdom: 25.0.1 lodash: 4.17.21 mocha: 10.8.2 - playwright: 1.48.2 + playwright: 1.49.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -12105,58 +12127,58 @@ snapshots: - supports-color - utf-8-validate - '@mui/joy@5.0.0-beta.48(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/joy@5.0.0-beta.48(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/core-downloads-tracker': 5.16.7 - '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/core-downloads-tracker': 5.16.9 + '@mui/system': 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.14) + '@mui/utils': 5.16.8(@types/react@18.3.14)(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 + '@emotion/react': 11.13.5(@types/react@18.3.14)(react@18.3.1) + '@emotion/styled': 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@types/react': 18.3.14 - '@mui/lab@5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/lab@5.0.0-alpha.174(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.14) + '@mui/utils': 5.16.8(@types/react@18.3.14)(react@18.3.1) clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 + '@emotion/react': 11.13.5(@types/react@18.3.14)(react@18.3.1) + '@emotion/styled': 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@types/react': 18.3.14 - '@mui/material-nextjs@5.16.6(@emotion/cache@11.13.1)(@emotion/server@11.11.0)(@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(next@14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@mui/material-nextjs@5.16.8(@emotion/cache@11.13.5)(@emotion/server@11.11.0)(@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.14)(next@14.2.20(@babel/core@7.26.0)(@playwright/test@1.49.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/material': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - next: 14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.20(@babel/core@7.26.0)(@playwright/test@1.49.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 optionalDependencies: - '@emotion/cache': 11.13.1 + '@emotion/cache': 11.13.5 '@emotion/server': 11.11.0 - '@types/react': 18.3.12 + '@types/react': 18.3.14 - '@mui/material@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@5.16.9(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/core-downloads-tracker': 5.16.7 - '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/core-downloads-tracker': 5.16.9 + '@mui/system': 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.14) + '@mui/utils': 5.16.8(@types/react@18.3.14)(react@18.3.1) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.11 clsx: 2.1.1 @@ -12167,16 +12189,16 @@ snapshots: react-is: 18.3.1 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 + '@emotion/react': 11.13.5(@types/react@18.3.14)(react@18.3.1) + '@emotion/styled': 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@types/react': 18.3.14 - '@mui/monorepo@https://codeload.github.com/mui/material-ui/tar.gz/f706939f7ce7fd90d8d4436515d752daff7395c6(encoding@0.1.13)': + '@mui/monorepo@https://codeload.github.com/mui/material-ui/tar.gz/454a4c081a3cda665d5e608e1fc3d600d14eee53(encoding@0.1.13)': dependencies: '@googleapis/sheets': 9.3.1(encoding@0.1.13) '@netlify/functions': 2.8.2 - '@slack/bolt': 4.1.0 - execa: 9.5.1 + '@slack/bolt': 4.1.1 + execa: 9.5.2 google-auth-library: 9.15.0(encoding@0.1.13) transitivePeerDependencies: - bufferutil @@ -12185,33 +12207,33 @@ snapshots: - supports-color - utf-8-validate - '@mui/private-theming@5.16.6(@types/react@18.3.12)(react@18.3.1)': + '@mui/private-theming@5.16.8(@types/react@18.3.14)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 5.16.8(@types/react@18.3.14)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 - '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@emotion/cache': 11.13.1 + '@emotion/cache': 11.13.5 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.5(@types/react@18.3.14)(react@18.3.1) + '@emotion/styled': 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) - '@mui/styles@5.16.7(@types/react@18.3.12)(react@18.3.1)': + '@mui/styles@5.16.9(@types/react@18.3.14)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 - '@mui/private-theming': 5.16.6(@types/react@18.3.12)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/private-theming': 5.16.8(@types/react@18.3.14)(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.14) + '@mui/utils': 5.16.8(@types/react@18.3.14)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 hoist-non-react-statics: 3.3.2 @@ -12226,39 +12248,45 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 - '@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + '@mui/system@5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/private-theming': 5.16.6(@types/react@18.3.12)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/private-theming': 5.16.8(@types/react@18.3.14)(react@18.3.1) + '@mui/styled-engine': 5.16.8(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.19(@types/react@18.3.14) + '@mui/utils': 5.16.8(@types/react@18.3.14)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@types/react': 18.3.12 + '@emotion/react': 11.13.5(@types/react@18.3.14)(react@18.3.1) + '@emotion/styled': 11.13.5(@emotion/react@11.13.5(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1) + '@types/react': 18.3.14 - '@mui/types@7.2.15(@types/react@18.3.12)': + '@mui/types@7.2.19(@types/react@18.3.14)': optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 - '@mui/utils@5.16.6(@types/react@18.3.12)(react@18.3.1)': + '@mui/utils@5.16.8(@types/react@18.3.14)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 - '@mui/types': 7.2.15(@types/react@18.3.12) - '@types/prop-types': 15.7.13 + '@mui/types': 7.2.19(@types/react@18.3.14) + '@types/prop-types': 15.7.14 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 react-is: 18.3.1 optionalDependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 + + '@napi-rs/wasm-runtime@0.2.4': + dependencies: + '@emnapi/core': 1.3.1 + '@emnapi/runtime': 1.3.1 + '@tybys/wasm-util': 0.9.0 '@netlify/functions@2.8.2': dependencies: @@ -12271,37 +12299,37 @@ snapshots: '@netlify/node-cookies': 0.1.0 urlpattern-polyfill: 8.0.2 - '@next/env@14.2.18': {} + '@next/env@14.2.20': {} - '@next/eslint-plugin-next@15.0.3': + '@next/eslint-plugin-next@15.0.4': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@14.2.18': + '@next/swc-darwin-arm64@14.2.20': optional: true - '@next/swc-darwin-x64@14.2.18': + '@next/swc-darwin-x64@14.2.20': optional: true - '@next/swc-linux-arm64-gnu@14.2.18': + '@next/swc-linux-arm64-gnu@14.2.20': optional: true - '@next/swc-linux-arm64-musl@14.2.18': + '@next/swc-linux-arm64-musl@14.2.20': optional: true - '@next/swc-linux-x64-gnu@14.2.18': + '@next/swc-linux-x64-gnu@14.2.20': optional: true - '@next/swc-linux-x64-musl@14.2.18': + '@next/swc-linux-x64-musl@14.2.20': optional: true - '@next/swc-win32-arm64-msvc@14.2.18': + '@next/swc-win32-arm64-msvc@14.2.20': optional: true - '@next/swc-win32-ia32-msvc@14.2.18': + '@next/swc-win32-ia32-msvc@14.2.20': optional: true - '@next/swc-win32-x64-msvc@14.2.18': + '@next/swc-win32-x64-msvc@14.2.20': optional: true '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': @@ -12317,15 +12345,15 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.0 + fastq: 1.17.1 - '@npmcli/agent@2.2.0': + '@npmcli/agent@2.2.2': dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 lru-cache: 10.4.3 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.4 transitivePeerDependencies: - supports-color @@ -12343,24 +12371,24 @@ snapshots: '@npmcli/redact': 2.0.1 '@npmcli/run-script': 8.1.0 bin-links: 4.0.4 - cacache: 18.0.3 + cacache: 18.0.4 common-ancestor-path: 1.0.1 hosted-git-info: 7.0.2 json-parse-even-better-errors: 3.0.2 json-stringify-nice: 1.1.4 lru-cache: 10.4.3 - minimatch: 9.0.4 + minimatch: 9.0.5 nopt: 7.2.1 npm-install-checks: 6.3.0 npm-package-arg: 11.0.2 - npm-pick-manifest: 9.0.1 + npm-pick-manifest: 9.1.0 npm-registry-fetch: 17.1.0 pacote: 18.0.6 parse-conflict-json: 3.0.1 proc-log: 4.2.0 proggy: 2.0.0 promise-all-reject-late: 1.0.1 - promise-call-limit: 3.0.1 + promise-call-limit: 3.0.2 read-package-json-fast: 3.0.2 semver: 7.6.3 ssri: 10.0.6 @@ -12374,12 +12402,13 @@ snapshots: dependencies: semver: 7.6.3 - '@npmcli/git@5.0.4': + '@npmcli/git@5.0.8': dependencies: - '@npmcli/promise-spawn': 7.0.1 + '@npmcli/promise-spawn': 7.0.2 + ini: 4.1.3 lru-cache: 10.4.3 - npm-pick-manifest: 9.0.1 - proc-log: 3.0.0 + npm-pick-manifest: 9.1.0 + proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 semver: 7.6.3 @@ -12389,19 +12418,19 @@ snapshots: '@npmcli/installed-package-contents@2.1.0': dependencies: - npm-bundled: 3.0.0 + npm-bundled: 3.0.1 npm-normalize-package-bin: 3.0.1 '@npmcli/map-workspaces@3.0.6': dependencies: '@npmcli/name-from-folder': 2.0.0 - glob: 10.3.10 - minimatch: 9.0.4 + glob: 10.4.5 + minimatch: 9.0.5 read-package-json-fast: 3.0.2 '@npmcli/metavuln-calculator@7.1.1': dependencies: - cacache: 18.0.3 + cacache: 18.0.4 json-parse-even-better-errors: 3.0.2 pacote: 18.0.6 proc-log: 4.2.0 @@ -12416,8 +12445,8 @@ snapshots: '@npmcli/package-json@5.2.0': dependencies: - '@npmcli/git': 5.0.4 - glob: 10.3.10 + '@npmcli/git': 5.0.8 + glob: 10.4.5 hosted-git-info: 7.0.2 json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.2 @@ -12426,13 +12455,13 @@ snapshots: transitivePeerDependencies: - bluebird - '@npmcli/promise-spawn@7.0.1': + '@npmcli/promise-spawn@7.0.2': dependencies: which: 4.0.0 '@npmcli/query@3.1.0': dependencies: - postcss-selector-parser: 6.1.0 + postcss-selector-parser: 6.1.2 '@npmcli/redact@2.0.1': {} @@ -12440,69 +12469,54 @@ snapshots: dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/package-json': 5.2.0 - '@npmcli/promise-spawn': 7.0.1 - node-gyp: 10.0.1 + '@npmcli/promise-spawn': 7.0.2 + node-gyp: 10.3.1 proc-log: 4.2.0 which: 4.0.0 transitivePeerDependencies: - bluebird - supports-color - '@nrwl/devkit@17.3.0(nx@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)))': - dependencies: - '@nx/devkit': 17.3.0(nx@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5))) - transitivePeerDependencies: - - nx - - '@nrwl/tao@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5))': - dependencies: - nx: 17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)) - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - - '@nx/devkit@17.3.0(nx@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)))': + '@nx/devkit@20.1.4(nx@20.1.4(@swc/core@1.9.3(@swc/helpers@0.5.5)))': dependencies: - '@nrwl/devkit': 17.3.0(nx@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5))) - ejs: 3.1.9 + ejs: 3.1.10 enquirer: 2.3.6 - ignore: 5.3.1 - nx: 17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)) - semver: 7.5.3 + ignore: 5.3.2 + minimatch: 9.0.3 + nx: 20.1.4(@swc/core@1.9.3(@swc/helpers@0.5.5)) + semver: 7.6.3 tmp: 0.2.3 - tslib: 2.6.2 + tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/nx-darwin-arm64@17.3.0': + '@nx/nx-darwin-arm64@20.1.4': optional: true - '@nx/nx-darwin-x64@17.3.0': + '@nx/nx-darwin-x64@20.1.4': optional: true - '@nx/nx-freebsd-x64@17.3.0': + '@nx/nx-freebsd-x64@20.1.4': optional: true - '@nx/nx-linux-arm-gnueabihf@17.3.0': + '@nx/nx-linux-arm-gnueabihf@20.1.4': optional: true - '@nx/nx-linux-arm64-gnu@17.3.0': + '@nx/nx-linux-arm64-gnu@20.1.4': optional: true - '@nx/nx-linux-arm64-musl@17.3.0': + '@nx/nx-linux-arm64-musl@20.1.4': optional: true - '@nx/nx-linux-x64-gnu@17.3.0': + '@nx/nx-linux-x64-gnu@20.1.4': optional: true - '@nx/nx-linux-x64-musl@17.3.0': + '@nx/nx-linux-x64-musl@20.1.4': optional: true - '@nx/nx-win32-arm64-msvc@17.3.0': + '@nx/nx-win32-arm64-msvc@20.1.4': optional: true - '@nx/nx-win32-x64-msvc@17.3.0': + '@nx/nx-win32-x64-msvc@20.1.4': optional: true '@octokit/auth-token@2.5.0': @@ -12545,7 +12559,7 @@ snapshots: '@octokit/graphql': 7.1.0 '@octokit/request': 8.4.0 '@octokit/request-error': 5.1.0 - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 before-after-hook: 2.2.3 universal-user-agent: 6.0.1 @@ -12553,15 +12567,15 @@ snapshots: dependencies: '@octokit/auth-token': 5.1.1 '@octokit/graphql': 8.1.1 - '@octokit/request': 9.1.1 - '@octokit/request-error': 6.1.1 - '@octokit/types': 13.5.0 + '@octokit/request': 9.1.3 + '@octokit/request-error': 6.1.5 + '@octokit/types': 13.6.2 before-after-hook: 3.0.2 universal-user-agent: 7.0.2 '@octokit/endpoint@10.1.1': dependencies: - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 '@octokit/endpoint@6.0.12': @@ -12578,7 +12592,7 @@ snapshots: '@octokit/endpoint@9.0.5': dependencies: - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 universal-user-agent: 6.0.1 '@octokit/graphql@4.8.0(encoding@0.1.13)': @@ -12600,13 +12614,13 @@ snapshots: '@octokit/graphql@7.1.0': dependencies: '@octokit/request': 8.4.0 - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 universal-user-agent: 6.0.1 '@octokit/graphql@8.1.1': dependencies: - '@octokit/request': 9.1.1 - '@octokit/types': 13.5.0 + '@octokit/request': 9.1.3 + '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 '@octokit/openapi-types@12.11.0': {} @@ -12619,10 +12633,10 @@ snapshots: '@octokit/plugin-enterprise-rest@6.0.1': {} - '@octokit/plugin-paginate-rest@11.3.1(@octokit/core@6.1.2)': + '@octokit/plugin-paginate-rest@11.3.6(@octokit/core@6.1.2)': dependencies: '@octokit/core': 6.1.2 - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 '@octokit/plugin-paginate-rest@2.21.3(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: @@ -12657,10 +12671,10 @@ snapshots: '@octokit/core': 5.2.0 '@octokit/types': 12.6.0 - '@octokit/plugin-rest-endpoint-methods@13.2.2(@octokit/core@6.1.2)': + '@octokit/plugin-rest-endpoint-methods@13.2.6(@octokit/core@6.1.2)': dependencies: '@octokit/core': 6.1.2 - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 '@octokit/plugin-rest-endpoint-methods@5.16.2(@octokit/core@3.6.0(encoding@0.1.13))': dependencies: @@ -12676,8 +12690,8 @@ snapshots: '@octokit/plugin-retry@7.1.2(@octokit/core@4.2.4(encoding@0.1.13))': dependencies: '@octokit/core': 4.2.4(encoding@0.1.13) - '@octokit/request-error': 6.1.1 - '@octokit/types': 13.5.0 + '@octokit/request-error': 6.1.5 + '@octokit/types': 13.6.2 bottleneck: 2.19.5 '@octokit/request-error@2.1.0': @@ -12694,13 +12708,13 @@ snapshots: '@octokit/request-error@5.1.0': dependencies: - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 deprecation: 2.3.1 once: 1.4.0 - '@octokit/request-error@6.1.1': + '@octokit/request-error@6.1.5': dependencies: - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 '@octokit/request@5.6.3(encoding@0.1.13)': dependencies: @@ -12728,14 +12742,14 @@ snapshots: dependencies: '@octokit/endpoint': 9.0.5 '@octokit/request-error': 5.1.0 - '@octokit/types': 13.5.0 + '@octokit/types': 13.6.2 universal-user-agent: 6.0.1 - '@octokit/request@9.1.1': + '@octokit/request@9.1.3': dependencies: '@octokit/endpoint': 10.1.1 - '@octokit/request-error': 6.1.1 - '@octokit/types': 13.5.0 + '@octokit/request-error': 6.1.5 + '@octokit/types': 13.6.2 universal-user-agent: 7.0.2 '@octokit/rest@18.12.0(encoding@0.1.13)': @@ -12759,9 +12773,9 @@ snapshots: '@octokit/rest@21.0.2': dependencies: '@octokit/core': 6.1.2 - '@octokit/plugin-paginate-rest': 11.3.1(@octokit/core@6.1.2) + '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.2) - '@octokit/plugin-rest-endpoint-methods': 13.2.2(@octokit/core@6.1.2) + '@octokit/plugin-rest-endpoint-methods': 13.2.6(@octokit/core@6.1.2) '@octokit/tsconfig@1.0.2': {} @@ -12773,7 +12787,7 @@ snapshots: dependencies: '@octokit/openapi-types': 20.0.0 - '@octokit/types@13.5.0': + '@octokit/types@13.6.2': dependencies: '@octokit/openapi-types': 22.2.0 @@ -12794,19 +12808,16 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opentelemetry/api@1.8.0': - optional: true - '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.1.1': {} - '@playwright/test@1.44.1': + '@playwright/test@1.49.0': dependencies: - playwright: 1.44.1 + playwright: 1.49.0 - '@polka/url@1.0.0-next.24': {} + '@polka/url@1.0.0-next.28': {} '@popperjs/core@2.11.8': {} @@ -12842,89 +12853,97 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@remix-run/router@1.20.0': {} + '@remix-run/router@1.21.0': {} + + '@rollup/rollup-android-arm-eabi@4.28.0': + optional: true + + '@rollup/rollup-android-arm64@4.28.0': + optional: true - '@rollup/rollup-android-arm-eabi@4.18.1': + '@rollup/rollup-darwin-arm64@4.28.0': optional: true - '@rollup/rollup-android-arm64@4.18.1': + '@rollup/rollup-darwin-x64@4.28.0': optional: true - '@rollup/rollup-darwin-arm64@4.18.1': + '@rollup/rollup-freebsd-arm64@4.28.0': optional: true - '@rollup/rollup-darwin-x64@4.18.1': + '@rollup/rollup-freebsd-x64@4.28.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.1': + '@rollup/rollup-linux-arm-gnueabihf@4.28.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.1': + '@rollup/rollup-linux-arm-musleabihf@4.28.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.1': + '@rollup/rollup-linux-arm64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.1': + '@rollup/rollup-linux-arm64-musl@4.28.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.1': + '@rollup/rollup-linux-riscv64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.1': + '@rollup/rollup-linux-s390x-gnu@4.28.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.1': + '@rollup/rollup-linux-x64-gnu@4.28.0': optional: true - '@rollup/rollup-linux-x64-musl@4.18.1': + '@rollup/rollup-linux-x64-musl@4.28.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.1': + '@rollup/rollup-win32-arm64-msvc@4.28.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.1': + '@rollup/rollup-win32-ia32-msvc@4.28.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.1': + '@rollup/rollup-win32-x64-msvc@4.28.0': optional: true '@rtsao/scc@1.1.0': {} '@sec-ant/readable-stream@0.4.1': {} - '@sigstore/bundle@2.1.1': + '@sigstore/bundle@2.3.2': dependencies: - '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/protobuf-specs': 0.3.2 - '@sigstore/core@0.2.0': {} + '@sigstore/core@1.1.0': {} - '@sigstore/protobuf-specs@0.2.1': {} + '@sigstore/protobuf-specs@0.3.2': {} - '@sigstore/sign@2.2.1': + '@sigstore/sign@2.3.2': dependencies: - '@sigstore/bundle': 2.1.1 - '@sigstore/core': 0.2.0 - '@sigstore/protobuf-specs': 0.2.1 - make-fetch-happen: 13.0.0 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + make-fetch-happen: 13.0.1 + proc-log: 4.2.0 + promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@sigstore/tuf@2.3.0': + '@sigstore/tuf@2.3.4': dependencies: - '@sigstore/protobuf-specs': 0.2.1 - tuf-js: 2.2.0 + '@sigstore/protobuf-specs': 0.3.2 + tuf-js: 2.2.1 transitivePeerDependencies: - supports-color - '@sigstore/verify@0.1.0': + '@sigstore/verify@1.2.1': dependencies: - '@sigstore/bundle': 2.1.1 - '@sigstore/core': 0.2.0 - '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 '@sinclair/typebox@0.27.8': {} @@ -12948,17 +12967,17 @@ snapshots: '@sinonjs/text-encoding@0.7.3': {} - '@slack/bolt@4.1.0': + '@slack/bolt@4.1.1': dependencies: '@slack/logger': 4.0.0 '@slack/oauth': 3.0.1 '@slack/socket-mode': 2.0.2 - '@slack/types': 2.13.0 + '@slack/types': 2.14.0 '@slack/web-api': 7.7.0 '@types/express': 4.17.21 - axios: 1.7.7(debug@4.3.7) + axios: 1.7.8(debug@4.3.7) express: 5.0.1 - path-to-regexp: 8.1.0 + path-to-regexp: 8.2.0 raw-body: 3.0.0 tsscmp: 1.0.6 transitivePeerDependencies: @@ -12969,14 +12988,14 @@ snapshots: '@slack/logger@4.0.0': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@slack/oauth@3.0.1': dependencies: '@slack/logger': 4.0.0 '@slack/web-api': 7.7.0 '@types/jsonwebtoken': 9.0.7 - '@types/node': 20.17.7 + '@types/node': 20.17.9 jsonwebtoken: 9.0.2 lodash.isstring: 4.0.1 transitivePeerDependencies: @@ -12986,7 +13005,7 @@ snapshots: dependencies: '@slack/logger': 4.0.0 '@slack/web-api': 7.7.0 - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/ws': 8.5.13 eventemitter3: 5.0.1 ws: 8.18.0 @@ -12995,17 +13014,17 @@ snapshots: - debug - utf-8-validate - '@slack/types@2.13.0': {} + '@slack/types@2.14.0': {} '@slack/web-api@7.7.0': dependencies: '@slack/logger': 4.0.0 - '@slack/types': 2.13.0 - '@types/node': 20.17.7 + '@slack/types': 2.14.0 + '@types/node': 20.17.9 '@types/retry': 0.12.0 - axios: 1.7.7(debug@4.3.7) + axios: 1.7.8(debug@4.3.7) eventemitter3: 5.0.1 - form-data: 4.0.0 + form-data: 4.0.1 is-electron: 2.2.2 is-stream: 2.0.1 p-queue: 6.6.2 @@ -13014,53 +13033,53 @@ snapshots: transitivePeerDependencies: - debug - '@socket.io/component-emitter@3.1.0': {} + '@socket.io/component-emitter@3.1.2': {} - '@swc/core-darwin-arm64@1.7.35': + '@swc/core-darwin-arm64@1.9.3': optional: true - '@swc/core-darwin-x64@1.7.35': + '@swc/core-darwin-x64@1.9.3': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.35': + '@swc/core-linux-arm-gnueabihf@1.9.3': optional: true - '@swc/core-linux-arm64-gnu@1.7.35': + '@swc/core-linux-arm64-gnu@1.9.3': optional: true - '@swc/core-linux-arm64-musl@1.7.35': + '@swc/core-linux-arm64-musl@1.9.3': optional: true - '@swc/core-linux-x64-gnu@1.7.35': + '@swc/core-linux-x64-gnu@1.9.3': optional: true - '@swc/core-linux-x64-musl@1.7.35': + '@swc/core-linux-x64-musl@1.9.3': optional: true - '@swc/core-win32-arm64-msvc@1.7.35': + '@swc/core-win32-arm64-msvc@1.9.3': optional: true - '@swc/core-win32-ia32-msvc@1.7.35': + '@swc/core-win32-ia32-msvc@1.9.3': optional: true - '@swc/core-win32-x64-msvc@1.7.35': + '@swc/core-win32-x64-msvc@1.9.3': optional: true - '@swc/core@1.7.35(@swc/helpers@0.5.5)': + '@swc/core@1.9.3(@swc/helpers@0.5.5)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.13 + '@swc/types': 0.1.17 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.35 - '@swc/core-darwin-x64': 1.7.35 - '@swc/core-linux-arm-gnueabihf': 1.7.35 - '@swc/core-linux-arm64-gnu': 1.7.35 - '@swc/core-linux-arm64-musl': 1.7.35 - '@swc/core-linux-x64-gnu': 1.7.35 - '@swc/core-linux-x64-musl': 1.7.35 - '@swc/core-win32-arm64-msvc': 1.7.35 - '@swc/core-win32-ia32-msvc': 1.7.35 - '@swc/core-win32-x64-msvc': 1.7.35 + '@swc/core-darwin-arm64': 1.9.3 + '@swc/core-darwin-x64': 1.9.3 + '@swc/core-linux-arm-gnueabihf': 1.9.3 + '@swc/core-linux-arm64-gnu': 1.9.3 + '@swc/core-linux-arm64-musl': 1.9.3 + '@swc/core-linux-x64-gnu': 1.9.3 + '@swc/core-linux-x64-musl': 1.9.3 + '@swc/core-win32-arm64-msvc': 1.9.3 + '@swc/core-win32-ia32-msvc': 1.9.3 + '@swc/core-win32-x64-msvc': 1.9.3 '@swc/helpers': 0.5.5 '@swc/counter@0.1.3': {} @@ -13068,17 +13087,17 @@ snapshots: '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.6.2 + tslib: 2.8.1 - '@swc/types@0.1.13': + '@swc/types@0.1.17': dependencies: '@swc/counter': 0.1.3 - '@tanstack/query-core@5.60.5': {} + '@tanstack/query-core@5.62.3': {} '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.26.0 + '@babel/code-frame': 7.26.2 '@babel/runtime': 7.26.0 '@types/aria-query': 5.0.4 aria-query: 5.3.0 @@ -13089,7 +13108,7 @@ snapshots: '@testing-library/jest-dom@6.6.3': dependencies: - '@adobe/css-tools': 4.4.0 + '@adobe/css-tools': 4.4.1 aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 @@ -13097,15 +13116,15 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.1.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 '@testing-library/dom': 10.4.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.12 - '@types/react-dom': 18.3.1 + '@types/react': 18.3.14 + '@types/react-dom': 18.3.2 '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: @@ -13115,38 +13134,42 @@ snapshots: '@tufjs/canonical-json@2.0.0': {} - '@tufjs/models@2.0.0': + '@tufjs/models@2.0.1': dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.4 + minimatch: 9.0.5 + + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.26.1 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.26.1 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/chai-dom@1.11.3': dependencies: @@ -13158,7 +13181,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/cookie@0.4.1': {} @@ -13166,7 +13189,7 @@ snapshots: '@types/cors@2.8.17': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/d3-array@3.2.1': {} @@ -13182,11 +13205,11 @@ snapshots: '@types/d3-path@3.1.0': {} - '@types/d3-scale-chromatic@3.0.3': {} + '@types/d3-scale-chromatic@3.1.0': {} '@types/d3-scale@4.0.8': dependencies: - '@types/d3-time': 3.0.3 + '@types/d3-time': 3.0.4 '@types/d3-shape@3.1.6': dependencies: @@ -13194,7 +13217,7 @@ snapshots: '@types/d3-time-format@4.0.3': {} - '@types/d3-time@3.0.3': {} + '@types/d3-time@3.0.4': {} '@types/debug@4.1.12': dependencies: @@ -13212,30 +13235,28 @@ snapshots: '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 - '@types/estree@1.0.5': {} - '@types/estree@1.0.6': {} - '@types/express-serve-static-core@4.17.42': + '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.17.7 - '@types/qs': 6.9.11 + '@types/node': 20.17.9 + '@types/qs': 6.9.17 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@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 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.17 + '@types/serve-static': 1.15.7 '@types/format-util@1.0.4': {} '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/gtag.js@0.0.20': {} @@ -13258,15 +13279,15 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/jsonwebtoken@9.0.7': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/karma@6.3.9': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 log4js: 6.9.1 transitivePeerDependencies: - supports-color @@ -13281,8 +13302,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/mime@3.0.4': {} - '@types/minimatch@3.0.5': {} '@types/minimist@1.2.5': {} @@ -13299,7 +13318,7 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@20.17.7': + '@types/node@20.17.9': dependencies: undici-types: 6.19.8 @@ -13307,38 +13326,34 @@ snapshots: '@types/parse-json@4.0.2': {} - '@types/prop-types@15.7.13': {} + '@types/prop-types@15.7.14': {} - '@types/qs@6.9.11': {} + '@types/qs@6.9.17': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@18.3.1': + '@types/react-dom@18.3.2': dependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.12 + '@types/react': 18.3.14 '@types/react-router': 5.1.20 '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.12 - - '@types/react-test-renderer@18.3.0': - dependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 18.3.12 + '@types/react': 18.3.14 - '@types/react@18.3.12': + '@types/react@18.3.14': dependencies: - '@types/prop-types': 15.7.13 + '@types/prop-types': 15.7.14 csstype: 3.1.3 '@types/requestidlecallback@0.3.7': {} @@ -13350,13 +13365,13 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.17.7 + '@types/node': 20.17.9 - '@types/serve-static@1.15.5': + '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.17.7 + '@types/node': 20.17.9 + '@types/send': 0.17.4 '@types/sinon@17.0.3': dependencies: @@ -13368,7 +13383,7 @@ snapshots: '@types/stylis@4.2.5': {} - '@types/stylis@4.2.6': {} + '@types/stylis@4.2.7': {} '@types/tough-cookie@4.0.5': {} @@ -13376,11 +13391,11 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} - '@types/webpack-bundle-analyzer@4.7.0(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1))': + '@types/webpack-bundle-analyzer@4.7.0(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1))': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 tapable: 2.2.1 - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -13389,7 +13404,7 @@ snapshots: '@types/ws@8.5.13': dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 '@types/yargs-parser@21.0.3': {} @@ -13399,7 +13414,7 @@ snapshots: '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) @@ -13407,9 +13422,9 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -13433,10 +13448,10 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.15.0': + '@typescript-eslint/scope-manager@8.17.0': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: @@ -13444,7 +13459,7 @@ snapshots: '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) debug: 4.3.7(supports-color@8.1.1) eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -13452,7 +13467,7 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.17.0': {} '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.2)': dependencies: @@ -13461,24 +13476,24 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.17.0(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/visitor-keys': 8.17.0 debug: 4.3.7(supports-color@8.1.1) fast-glob: 3.3.2 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.2) + ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -13486,7 +13501,7 @@ snapshots: '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) @@ -13495,12 +13510,12 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.15.0(eslint@8.57.1)(typescript@5.7.2)': + '@typescript-eslint/utils@8.17.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/types': 8.17.0 + '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) eslint: 8.57.1 optionalDependencies: typescript: 5.7.2 @@ -13512,45 +13527,45 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.15.0': + '@typescript-eslint/visitor-keys@8.17.0': dependencies: - '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/types': 8.17.0 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.1(@swc/helpers@0.5.5)(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))': + '@vitejs/plugin-react-swc@3.7.2(@swc/helpers@0.5.5)(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))': dependencies: - '@swc/core': 1.7.35(@swc/helpers@0.5.5) - vite: 5.3.4(@types/node@20.17.7)(terser@5.27.0) + '@swc/core': 1.9.3(@swc/helpers@0.5.5) + vite: 5.4.11(@types/node@20.17.9)(terser@5.36.0) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@4.3.3(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.4(@types/node@20.17.7)(terser@5.27.0) + vite: 5.4.11(@types/node@20.17.9)(terser@5.36.0) transitivePeerDependencies: - supports-color - '@vitest/browser@2.1.5(@types/node@20.17.7)(playwright@1.48.2)(typescript@5.7.2)(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))(vitest@2.1.5)': + '@vitest/browser@2.1.8(@types/node@20.17.9)(playwright@1.49.0)(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))(vitest@2.1.8)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/mocker': 2.1.5(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0)) - '@vitest/utils': 2.1.5 - magic-string: 0.30.12 - msw: 2.6.5(@types/node@20.17.7)(typescript@5.7.2) + '@vitest/mocker': 2.1.8(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0)) + '@vitest/utils': 2.1.8 + magic-string: 0.30.14 + msw: 2.6.6(@types/node@20.17.9)(typescript@5.7.2) sirv: 3.0.0 tinyrainbow: 1.2.0 - vitest: 2.1.5(@types/node@20.17.7)(@vitest/browser@2.1.5)(@vitest/ui@2.1.5)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(terser@5.27.0) + vitest: 2.1.8(@types/node@20.17.9)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(jsdom@25.0.1)(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(terser@5.36.0) ws: 8.18.0 optionalDependencies: - playwright: 1.48.2 + playwright: 1.49.0 transitivePeerDependencies: - '@types/node' - bufferutil @@ -13558,148 +13573,148 @@ snapshots: - utf-8-validate - vite - '@vitest/expect@2.1.5': + '@vitest/expect@2.1.8': dependencies: - '@vitest/spy': 2.1.5 - '@vitest/utils': 2.1.5 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.5(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))': + '@vitest/mocker@2.1.8(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))': dependencies: - '@vitest/spy': 2.1.5 + '@vitest/spy': 2.1.8 estree-walker: 3.0.3 - magic-string: 0.30.12 + magic-string: 0.30.14 optionalDependencies: - msw: 2.6.5(@types/node@20.17.7)(typescript@5.7.2) - vite: 5.3.4(@types/node@20.17.7)(terser@5.27.0) + msw: 2.6.6(@types/node@20.17.9)(typescript@5.7.2) + vite: 5.4.11(@types/node@20.17.9)(terser@5.36.0) - '@vitest/pretty-format@2.1.5': + '@vitest/pretty-format@2.1.8': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.5': + '@vitest/runner@2.1.8': dependencies: - '@vitest/utils': 2.1.5 + '@vitest/utils': 2.1.8 pathe: 1.1.2 - '@vitest/snapshot@2.1.5': + '@vitest/snapshot@2.1.8': dependencies: - '@vitest/pretty-format': 2.1.5 - magic-string: 0.30.12 + '@vitest/pretty-format': 2.1.8 + magic-string: 0.30.14 pathe: 1.1.2 - '@vitest/spy@2.1.5': + '@vitest/spy@2.1.8': dependencies: tinyspy: 3.0.2 - '@vitest/ui@2.1.5(vitest@2.1.5)': + '@vitest/ui@2.1.8(vitest@2.1.8)': dependencies: - '@vitest/utils': 2.1.5 + '@vitest/utils': 2.1.8 fflate: 0.8.2 - flatted: 3.3.1 + flatted: 3.3.2 pathe: 1.1.2 sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 1.2.0 - vitest: 2.1.5(@types/node@20.17.7)(@vitest/browser@2.1.5)(@vitest/ui@2.1.5)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(terser@5.27.0) + vitest: 2.1.8(@types/node@20.17.9)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(jsdom@25.0.1)(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(terser@5.36.0) - '@vitest/utils@2.1.5': + '@vitest/utils@2.1.8': dependencies: - '@vitest/pretty-format': 2.1.5 + '@vitest/pretty-format': 2.1.8 loupe: 3.1.2 tinyrainbow: 1.2.0 - '@webassemblyjs/ast@1.12.1': + '@webassemblyjs/ast@1.14.1': dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - '@webassemblyjs/helper-api-error@1.11.6': {} + '@webassemblyjs/helper-api-error@1.13.2': {} - '@webassemblyjs/helper-buffer@1.12.1': {} + '@webassemblyjs/helper-buffer@1.14.1': {} - '@webassemblyjs/helper-numbers@1.11.6': + '@webassemblyjs/helper-numbers@1.13.2': dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - '@webassemblyjs/helper-wasm-section@1.12.1': + '@webassemblyjs/helper-wasm-section@1.14.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/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/ieee754@1.11.6': + '@webassemblyjs/ieee754@1.13.2': dependencies: '@xtuc/ieee754': 1.2.0 - '@webassemblyjs/leb128@1.11.6': + '@webassemblyjs/leb128@1.13.2': dependencies: '@xtuc/long': 4.2.2 - '@webassemblyjs/utf8@1.11.6': {} + '@webassemblyjs/utf8@1.13.2': {} - '@webassemblyjs/wasm-edit@1.12.1': + '@webassemblyjs/wasm-edit@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 - '@webassemblyjs/wasm-gen@1.12.1': + '@webassemblyjs/wasm-gen@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wasm-opt@1.12.1': + '@webassemblyjs/wasm-opt@1.14.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/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wasm-parser@1.12.1': + '@webassemblyjs/wasm-parser@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 - '@webassemblyjs/wast-printer@1.12.1': + '@webassemblyjs/wast-printer@1.14.1': dependencies: - '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1))(webpack@5.96.1)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1))(webpack@5.97.1)': dependencies: - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1))(webpack@5.96.1)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1))(webpack@5.97.1)': dependencies: - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1))(webpack@5.96.1)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1))(webpack@5.97.1)': dependencies: - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1) '@xtuc/ieee754@1.2.0': {} @@ -13707,14 +13722,14 @@ snapshots: '@yarnpkg/lockfile@1.1.0': {} - '@yarnpkg/parsers@3.0.0-rc.46': + '@yarnpkg/parsers@3.0.2': dependencies: js-yaml: 3.14.1 - tslib: 2.6.2 + tslib: 2.8.1 '@zeit/schemas@2.36.0': {} - '@zkochan/js-yaml@0.0.6': + '@zkochan/js-yaml@0.0.7': dependencies: argparse: 2.0.1 @@ -13725,8 +13740,6 @@ snapshots: abbrev@1.0.9: {} - abbrev@1.1.1: {} - abbrev@2.0.0: {} accepts@1.3.8: @@ -13743,7 +13756,9 @@ snapshots: dependencies: acorn: 8.14.0 - acorn-walk@8.3.2: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 acorn@8.14.0: {} @@ -13755,7 +13770,7 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.0: + agent-base@7.1.1: dependencies: debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: @@ -13771,17 +13786,17 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ajv-formats@2.1.1(ajv@8.12.0): + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: - ajv: 8.12.0 + ajv: 8.17.1 ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.12.0): + ajv-keywords@5.1.0(ajv@8.17.1): dependencies: - ajv: 8.12.0 + ajv: 8.17.1 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -13798,21 +13813,28 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - algoliasearch@5.12.0: - dependencies: - '@algolia/client-abtesting': 5.12.0 - '@algolia/client-analytics': 5.12.0 - '@algolia/client-common': 5.12.0 - '@algolia/client-insights': 5.12.0 - '@algolia/client-personalization': 5.12.0 - '@algolia/client-query-suggestions': 5.12.0 - '@algolia/client-search': 5.12.0 - '@algolia/ingestion': 1.12.0 - '@algolia/monitoring': 1.12.0 - '@algolia/recommend': 5.12.0 - '@algolia/requester-browser-xhr': 5.12.0 - '@algolia/requester-fetch': 5.12.0 - '@algolia/requester-node-http': 5.12.0 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.15.0: + dependencies: + '@algolia/client-abtesting': 5.15.0 + '@algolia/client-analytics': 5.15.0 + '@algolia/client-common': 5.15.0 + '@algolia/client-insights': 5.15.0 + '@algolia/client-personalization': 5.15.0 + '@algolia/client-query-suggestions': 5.15.0 + '@algolia/client-search': 5.15.0 + '@algolia/ingestion': 1.15.0 + '@algolia/monitoring': 1.15.0 + '@algolia/recommend': 5.15.0 + '@algolia/requester-browser-xhr': 5.15.0 + '@algolia/requester-fetch': 5.15.0 + '@algolia/requester-node-http': 5.15.0 amdefine@1.0.1: optional: true @@ -13829,7 +13851,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -13887,7 +13909,7 @@ snapshots: archiver@5.3.2: dependencies: archiver-utils: 2.1.0 - async: 3.2.5 + async: 3.2.6 buffer-crc32: 0.2.13 readable-stream: 3.6.2 readdir-glob: 1.1.3 @@ -13927,10 +13949,10 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 - is-string: 1.0.7 + is-string: 1.1.0 array-parallel@0.1.3: {} @@ -13942,7 +13964,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -13951,7 +13973,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 @@ -13960,29 +13982,31 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 - array.prototype.reduce@1.0.6: + array.prototype.reduce@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + is-string: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 @@ -13991,7 +14015,7 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 @@ -14011,11 +14035,11 @@ snapshots: ast-types@0.14.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 ast-types@0.16.1: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 async-retry@1.2.3: dependencies: @@ -14023,14 +14047,14 @@ snapshots: async@1.5.2: {} - async@3.2.5: {} + async@3.2.6: {} asynckit@0.4.0: {} autoprefixer@10.4.20(postcss@8.4.49): dependencies: - browserslist: 4.24.0 - caniuse-lite: 1.0.30001667 + browserslist: 4.24.2 + caniuse-lite: 1.0.30001686 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -14043,29 +14067,29 @@ snapshots: axe-core@4.10.2: {} - axios@1.7.7(debug@4.3.7): + axios@1.7.8(debug@4.3.7): dependencies: - follow-redirects: 1.15.6(debug@4.3.7) - form-data: 4.0.0 + follow-redirects: 1.15.9(debug@4.3.7) + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug axobject-query@4.1.0: {} - babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.1): + babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.97.1): dependencies: '@babel/core': 7.26.0 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) babel-plugin-istanbul@7.0.0: dependencies: '@babel/helper-plugin-utils': 7.25.9 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color @@ -14078,7 +14102,7 @@ snapshots: babel-plugin-module-resolver@5.0.2: dependencies: - find-babel-config: 2.1.1 + find-babel-config: 2.1.2 glob: 9.3.5 pkg-up: 3.1.0 reselect: 4.1.8 @@ -14086,18 +14110,18 @@ snapshots: babel-plugin-optimize-clsx@2.6.2: dependencies: - '@babel/generator': 7.26.0 + '@babel/generator': 7.26.3 '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 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.26.0): + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: - '@babel/compat-data': 7.26.0 + '@babel/compat-data': 7.26.2 '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -14105,15 +14129,15 @@ snapshots: babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) - core-js-compat: 3.38.1 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.26.0): + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) transitivePeerDependencies: - supports-color @@ -14163,7 +14187,7 @@ snapshots: read-cmd-shim: 4.0.0 write-file-atomic: 5.0.1 - binary-extensions@2.2.0: {} + binary-extensions@2.3.0: {} binary@0.3.0: dependencies: @@ -14218,7 +14242,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.3.0 + chalk: 5.0.1 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -14240,12 +14264,12 @@ snapshots: browser-stdout@1.3.1: {} - browserslist@4.24.0: + browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001667 - electron-to-chromium: 1.5.32 + caniuse-lite: 1.0.30001686 + electron-to-chromium: 1.5.68 node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.24.0) + update-browserslist-db: 1.1.1(browserslist@4.24.2) buffer-crc32@0.2.13: {} @@ -14282,20 +14306,20 @@ snapshots: foreground-child: 2.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.6 + istanbul-reports: 3.1.7 rimraf: 3.0.2 test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 + v8-to-istanbul: 9.3.0 yargs: 16.2.0 yargs-parser: 20.2.9 cac@6.7.14: {} - cacache@18.0.3: + cacache@18.0.4: dependencies: '@npmcli/fs': 3.1.1 fs-minipass: 3.0.3 - glob: 10.3.10 + glob: 10.4.5 lru-cache: 10.4.3 minipass: 7.1.2 minipass-collect: 2.0.1 @@ -14326,7 +14350,7 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.6.2 + tslib: 2.8.1 camelcase-keys@6.2.2: dependencies: @@ -14342,7 +14366,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001667: {} + caniuse-lite@1.0.30001686: {} chai-dom@1.12.0(chai@4.5.0): dependencies: @@ -14352,7 +14376,7 @@ snapshots: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 @@ -14397,8 +14421,6 @@ snapshots: chalk@5.0.1: {} - chalk@5.3.0: {} - chance@1.1.12: {} character-entities@2.0.2: {} @@ -14425,11 +14447,11 @@ snapshots: chownr@2.0.0: {} - chrome-trace-event@1.0.3: {} + chrome-trace-event@1.0.4: {} ci-info@3.9.0: {} - ci-info@4.0.0: {} + ci-info@4.1.0: {} clean-css@5.3.3: dependencies: @@ -14568,11 +14590,11 @@ snapshots: dependencies: mime-db: 1.53.0 - compression-webpack-plugin@11.1.0(webpack@5.96.1): + compression-webpack-plugin@11.1.0(webpack@5.97.1): dependencies: schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) compression@1.7.4: dependencies: @@ -14600,7 +14622,7 @@ snapshots: chalk: 4.1.2 lodash: 4.17.21 rxjs: 7.8.1 - shell-quote: 1.8.1 + shell-quote: 1.8.2 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -14689,19 +14711,17 @@ snapshots: cookie-signature@1.2.2: {} - cookie@0.4.2: {} - cookie@0.7.1: {} cookie@0.7.2: {} - core-js-compat@3.38.1: + core-js-compat@3.39.0: dependencies: - browserslist: 4.24.0 + browserslist: 4.24.2 core-js@2.6.12: {} - core-js@3.35.1: {} + core-js@3.39.0: {} core-util-is@1.0.3: {} @@ -14758,14 +14778,14 @@ snapshots: cross-env@7.0.3: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 cross-spawn@4.0.2: dependencies: lru-cache: 4.1.5 which: 1.3.1 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -14798,11 +14818,11 @@ snapshots: cssesc@3.0.0: {} - cssjanus@2.1.0: {} + cssjanus@2.3.0: {} - cssstyle@4.0.1: + cssstyle@4.1.0: dependencies: - rrweb-cssom: 0.6.0 + rrweb-cssom: 0.7.1 csstype@3.1.3: {} @@ -14860,7 +14880,7 @@ snapshots: async-retry: 1.2.3 chalk: 2.4.2 commander: 2.20.3 - core-js: 3.35.1 + core-js: 3.39.0 debug: 4.3.7(supports-color@8.1.1) fast-json-patch: 3.1.1 get-stdin: 6.0.0 @@ -14884,7 +14904,7 @@ snapshots: p-limit: 2.3.0 parse-diff: 0.7.1 parse-git-config: 2.0.3 - parse-github-url: 1.0.2 + parse-github-url: 1.0.3 parse-link-header: 2.0.0 pinpoint: 1.1.0 prettyjson: 1.2.5 @@ -14982,7 +15002,7 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: type-detect: 4.1.0 @@ -15004,7 +15024,7 @@ snapshots: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.1.0 define-lazy-prop@2.0.0: {} @@ -15074,7 +15094,7 @@ snapshots: dom-serialize@2.2.1: dependencies: custom-event: 1.0.1 - ent: 2.2.0 + ent: 2.2.1 extend: 3.0.2 void-elements: 2.0.1 @@ -15099,15 +15119,17 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dotenv-expand@10.0.0: {} + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.4.6 - dotenv@16.3.2: {} + dotenv@16.4.6: {} duplexer2@0.1.4: dependencies: @@ -15123,11 +15145,11 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.9: + ejs@3.1.10: dependencies: - jake: 10.8.7 + jake: 10.9.2 - electron-to-chromium@1.5.32: {} + electron-to-chromium@1.5.68: {} emoji-regex@8.0.0: {} @@ -15148,20 +15170,20 @@ snapshots: dependencies: once: 1.4.0 - engine.io-parser@5.2.1: {} + engine.io-parser@5.2.3: {} - engine.io@6.5.4: + engine.io@6.6.2: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.17.7 + '@types/node': 20.17.9 accepts: 1.3.8 base64id: 2.0.0 - cookie: 0.4.2 + cookie: 0.7.2 cors: 2.8.5 debug: 4.3.7(supports-color@8.1.1) - engine.io-parser: 5.2.1 - ws: 8.11.0 + engine.io-parser: 5.2.3 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - supports-color @@ -15182,7 +15204,9 @@ snapshots: dependencies: ansi-colors: 4.1.3 - ent@2.2.0: {} + ent@2.2.1: + dependencies: + punycode: 1.4.1 entities@2.2.0: {} @@ -15192,13 +15216,15 @@ snapshots: envinfo@7.13.0: {} + envinfo@7.14.0: {} + err-code@2.0.3: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + es-abstract@1.23.5: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 @@ -15211,30 +15237,30 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 + es-to-primitive: 1.3.0 function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.1.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.1.0 + has-symbols: 1.1.0 hasown: 2.0.2 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 is-data-view: 1.0.1 is-negative-zero: 2.0.3 - is-regex: 1.1.4 + is-regex: 1.2.0 is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 + is-string: 1.1.0 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.3 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 + regexp.prototype.flags: 1.5.3 safe-array-concat: 1.1.2 safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 @@ -15242,10 +15268,10 @@ snapshots: string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 + typed-array-byte-offset: 1.0.3 + typed-array-length: 1.0.7 unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 es-array-method-boxes-properly@1.0.0: {} @@ -15255,19 +15281,20 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.1.0: + es-iterator-helpers@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 globalthis: 1.0.4 + gopd: 1.1.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.1.0 + has-symbols: 1.1.0 internal-slot: 1.0.7 iterator.prototype: 1.1.3 safe-array-concat: 1.1.2 @@ -15288,11 +15315,11 @@ snapshots: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-symbol: 1.1.0 es6-error@4.1.1: {} @@ -15349,7 +15376,7 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - escalade@3.1.2: {} + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -15386,14 +15413,14 @@ snapshots: transitivePeerDependencies: - eslint-plugin-import - eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@5.0.0(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1): + eslint-config-airbnb@19.0.4(eslint-plugin-import@2.31.0)(eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1))(eslint-plugin-react-hooks@5.1.0(eslint@8.57.1))(eslint-plugin-react@7.37.2(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.9)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.2(eslint@8.57.1) - eslint-plugin-react-hooks: 5.0.0(eslint@8.57.1) + eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) object.assign: 4.1.5 object.entries: 1.1.8 @@ -15409,7 +15436,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.9(eslint-plugin-import@2.31.0)(webpack@5.96.1): + eslint-import-resolver-webpack@0.13.9(eslint-plugin-import@2.31.0)(webpack@5.97.1): dependencies: debug: 3.2.7 enhanced-resolve: 0.9.1 @@ -15418,11 +15445,11 @@ snapshots: hasown: 2.0.2 interpret: 1.4.0 is-core-module: 2.15.1 - is-regex: 1.1.4 + is-regex: 1.2.0 lodash: 4.17.21 resolve: 2.0.0-next.5 semver: 5.7.2 - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) transitivePeerDependencies: - supports-color @@ -15433,7 +15460,7 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.9(eslint-plugin-import@2.31.0)(webpack@5.96.1) + eslint-import-resolver-webpack: 0.13.9(eslint-plugin-import@2.31.0)(webpack@5.97.1) transitivePeerDependencies: - supports-color @@ -15474,7 +15501,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@50.5.0(eslint@8.57.1): + eslint-plugin-jsdoc@50.6.0(eslint@8.57.1): dependencies: '@es-joy/jsdoccomment': 0.49.0 are-docs-informative: 0.0.2 @@ -15482,12 +15509,12 @@ snapshots: debug: 4.3.7(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint: 8.57.1 - espree: 10.1.0 + espree: 10.3.0 esquery: 1.6.0 - parse-imports: 2.1.1 + parse-imports: 2.2.1 semver: 7.6.3 spdx-expression-parse: 4.0.0 - synckit: 0.9.1 + synckit: 0.9.2 transitivePeerDependencies: - supports-color @@ -15517,29 +15544,29 @@ snapshots: globals: 13.24.0 rambda: 7.5.0 - eslint-plugin-prettier@5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3): + eslint-plugin-prettier@5.2.1(@types/eslint@8.56.12)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): dependencies: eslint: 8.57.1 - prettier: 3.3.3 + prettier: 3.4.2 prettier-linter-helpers: 1.0.0 - synckit: 0.9.1 + synckit: 0.9.2 optionalDependencies: '@types/eslint': 8.56.12 eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-plugin-react-compiler@19.0.0-beta-a7bf2bd-20241110(eslint@8.57.1): + eslint-plugin-react-compiler@19.0.0-beta-df7b47d-20241124(eslint@8.57.1): dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.1 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.0) + '@babel/parser': 7.26.3 + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) eslint: 8.57.1 - hermes-parser: 0.20.1 + hermes-parser: 0.25.1 zod: 3.23.8 - zod-validation-error: 3.3.0(zod@3.23.8) + zod-validation-error: 3.4.0(zod@3.23.8) transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks@5.0.0(eslint@8.57.1): + eslint-plugin-react-hooks@5.1.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -15550,7 +15577,7 @@ snapshots: array.prototype.flatmap: 1.3.2 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.1.0 + es-iterator-helpers: 1.2.0 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.2 @@ -15565,10 +15592,10 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@7.0.0(eslint@8.57.1)(typescript@5.7.2): + eslint-plugin-testing-library@7.1.1(eslint@8.57.1)(typescript@5.7.2): dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.17.0 + '@typescript-eslint/utils': 8.17.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -15597,8 +15624,8 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 @@ -15607,7 +15634,7 @@ snapshots: '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.3.7(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 @@ -15622,7 +15649,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -15632,13 +15659,13 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - espree@10.1.0: + espree@10.3.0: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) @@ -15670,8 +15697,8 @@ snapshots: estree-to-babel@3.2.1: dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -15704,7 +15731,7 @@ snapshots: execa@5.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -15716,7 +15743,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -15726,20 +15753,20 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@9.5.1: + execa@9.5.2: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 human-signals: 8.0.0 is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.0.0 + pretty-ms: 9.2.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.0.2 + yoctocolors: 2.1.1 expand-tilde@2.0.2: dependencies: @@ -15829,9 +15856,11 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.0.3: {} + fastest-levenshtein@1.0.16: {} - fastq@1.17.0: + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -15849,7 +15878,7 @@ snapshots: figures@6.1.0: dependencies: - is-unicode-supported: 2.0.0 + is-unicode-supported: 2.1.0 file-entry-cache@6.0.1: dependencies: @@ -15887,10 +15916,9 @@ snapshots: transitivePeerDependencies: - supports-color - find-babel-config@2.1.1: + find-babel-config@2.1.2: dependencies: json5: 2.2.3 - path-exists: 4.0.0 find-cache-dir@2.1.0: dependencies: @@ -15936,17 +15964,17 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 flat@5.0.2: {} - flatted@3.3.1: {} + flatted@3.3.2: {} - flow-parser@0.227.0: {} + flow-parser@0.255.0: {} - follow-redirects@1.15.6(debug@4.3.7): + follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: debug: 4.3.7(supports-color@8.1.1) @@ -15956,15 +15984,15 @@ snapshots: foreground-child@2.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 3.0.7 foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -15982,6 +16010,10 @@ snapshots: fromentries@1.3.2: {} + front-matter@4.0.2: + dependencies: + js-yaml: 3.14.1 + fs-constants@1.0.0: {} fs-exists-sync@0.1.0: {} @@ -16029,24 +16061,25 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} - gaxios@6.1.1(encoding@0.1.13): + gaxios@6.7.1(encoding@0.1.13): dependencies: extend: 3.0.2 https-proxy-agent: 7.0.5 is-stream: 2.0.1 node-fetch: 2.7.0(encoding@0.1.13) + uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color gcp-metadata@6.1.0(encoding@0.1.13): dependencies: - gaxios: 6.1.1(encoding@0.1.13) + gaxios: 6.7.1(encoding@0.1.13) json-bigint: 1.0.0 transitivePeerDependencies: - encoding @@ -16062,8 +16095,8 @@ snapshots: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.1.0 + has-symbols: 1.1.0 hasown: 2.0.2 get-package-type@0.1.0: {} @@ -16094,7 +16127,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.5: + get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -16136,7 +16169,7 @@ snapshots: glob-gitignore@1.0.15: dependencies: glob: 7.2.3 - ignore: 5.3.1 + ignore: 5.3.2 lodash: 4.17.21 make-array: 1.0.5 util.inherits: 1.0.3 @@ -16151,21 +16184,22 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.10: + glob@10.4.5: dependencies: foreground-child: 3.3.0 - jackspeak: 2.3.6 - minimatch: 9.0.4 + jackspeak: 3.4.3 + minimatch: 9.0.5 minipass: 7.1.2 - path-scurry: 1.10.1 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 glob@11.0.0: dependencies: foreground-child: 3.3.0 - jackspeak: 4.0.1 + jackspeak: 4.0.2 minimatch: 10.0.1 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 2.0.0 glob@5.0.15: @@ -16198,7 +16232,7 @@ snapshots: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 - path-scurry: 1.10.1 + path-scurry: 1.11.1 globals@11.12.0: {} @@ -16209,14 +16243,14 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.1.0 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -16224,7 +16258,7 @@ snapshots: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 4.0.0 @@ -16232,7 +16266,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 path-type: 5.0.0 slash: 5.1.0 unicorn-magic: 0.1.0 @@ -16250,27 +16284,27 @@ snapshots: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 6.1.1(encoding@0.1.13) + gaxios: 6.7.1(encoding@0.1.13) gcp-metadata: 6.1.0(encoding@0.1.13) - gtoken: 7.0.1(encoding@0.1.13) + gtoken: 7.1.0(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding - supports-color - googleapis-common@7.0.1(encoding@0.1.13): + googleapis-common@7.2.0(encoding@0.1.13): dependencies: extend: 3.0.2 - gaxios: 6.1.1(encoding@0.1.13) + gaxios: 6.7.1(encoding@0.1.13) google-auth-library: 9.15.0(encoding@0.1.13) - qs: 6.13.0 + qs: 6.13.1 url-template: 2.0.8 uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color - gopd@1.0.1: + gopd@1.1.0: dependencies: get-intrinsic: 1.2.4 @@ -16280,9 +16314,9 @@ snapshots: graphql@16.9.0: {} - gtoken@7.0.1(encoding@0.1.13): + gtoken@7.1.0(encoding@0.1.13): dependencies: - gaxios: 6.1.1(encoding@0.1.13) + gaxios: 6.7.1(encoding@0.1.13) jws: 4.0.0 transitivePeerDependencies: - encoding @@ -16299,7 +16333,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.19.3 hard-rejection@2.1.0: {} @@ -16317,13 +16351,15 @@ snapshots: dependencies: es-define-property: 1.0.0 - has-proto@1.0.3: {} + has-proto@1.1.0: + dependencies: + call-bind: 1.0.7 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 has-unicode@2.0.1: {} @@ -16340,11 +16376,11 @@ snapshots: headers-polyfill@4.0.3: {} - hermes-estree@0.20.1: {} + hermes-estree@0.25.1: {} - hermes-parser@0.20.1: + hermes-parser@0.25.1: dependencies: - hermes-estree: 0.20.1 + hermes-estree: 0.25.1 hoist-non-react-statics@3.3.2: dependencies: @@ -16378,7 +16414,7 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.27.0 + terser: 5.36.0 html-tokenize@2.0.1: dependencies: @@ -16388,7 +16424,7 @@ snapshots: readable-stream: 1.0.34 through2: 0.4.2 - html-webpack-plugin@5.6.3(webpack@5.96.1): + html-webpack-plugin@5.6.3(webpack@5.97.1): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16396,7 +16432,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) htmlparser2@6.1.0: dependencies: @@ -16425,7 +16461,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16433,7 +16469,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.6(debug@4.3.7) + follow-redirects: 1.15.9(debug@4.3.7) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -16447,7 +16483,7 @@ snapshots: https-proxy-agent@7.0.5: dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -16458,7 +16494,7 @@ snapshots: hyperlinker@1.0.0: {} - hyphenate-style-name@1.0.4: {} + hyphenate-style-name@1.1.0: {} iconv-lite@0.4.24: dependencies: @@ -16474,11 +16510,11 @@ snapshots: ieee754@1.2.1: {} - ignore-walk@6.0.4: + ignore-walk@6.0.5: dependencies: - minimatch: 9.0.4 + minimatch: 9.0.5 - ignore@5.3.1: {} + ignore@5.3.2: {} immediate@3.0.6: {} @@ -16492,6 +16528,11 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -16507,11 +16548,13 @@ snapshots: ini@1.3.8: {} + ini@4.1.3: {} + init-package-json@6.0.3: dependencies: '@npmcli/package-json': 5.2.0 npm-package-arg: 11.0.2 - promzard: 1.0.0 + promzard: 1.0.2 read: 3.0.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 @@ -16549,7 +16592,10 @@ snapshots: interpret@3.1.1: {} - ip@2.0.0: {} + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 ipaddr.js@1.9.1: {} @@ -16571,15 +16617,15 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-bigint@1.0.4: + is-bigint@1.1.0: dependencies: has-bigints: 1.0.2 is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.0: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 @@ -16610,7 +16656,7 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: + is-finalizationregistry@1.1.0: dependencies: call-bind: 1.0.7 @@ -16630,14 +16676,15 @@ snapshots: is-lambda@1.0.1: {} - is-map@2.0.2: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} is-node-process@1.2.0: {} - is-number-object@1.0.7: + is-number-object@1.1.0: dependencies: + call-bind: 1.0.7 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -16664,12 +16711,14 @@ snapshots: is-promise@4.0.0: {} - is-regex@1.1.4: + is-regex@1.2.0: dependencies: call-bind: 1.0.7 + gopd: 1.1.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 - is-set@2.0.2: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: @@ -16685,13 +16734,16 @@ snapshots: is-stream@4.0.1: {} - is-string@1.0.7: + is-string@1.1.0: dependencies: + call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.0: dependencies: - has-symbols: 1.0.3 + call-bind: 1.0.7 + has-symbols: 1.1.0 + safe-regex-test: 1.0.3 is-text-path@1.0.1: dependencies: @@ -16699,21 +16751,21 @@ snapshots: is-typed-array@1.1.13: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} - is-unicode-supported@2.0.0: {} + is-unicode-supported@2.1.0: {} - is-weakmap@2.0.1: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - is-weakset@2.0.2: + is-weakset@2.0.3: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 @@ -16744,10 +16796,10 @@ snapshots: dependencies: append-transform: 2.0.0 - istanbul-lib-instrument@6.0.2: + istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.1 + '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.3 @@ -16757,7 +16809,7 @@ snapshots: istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 istanbul-lib-coverage: 3.2.2 p-map: 3.0.0 rimraf: 3.0.2 @@ -16777,7 +16829,7 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-reports@3.1.6: + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -16803,25 +16855,23 @@ snapshots: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 + has-symbols: 1.1.0 + reflect.getprototypeof: 1.0.7 set-function-name: 2.0.2 - jackspeak@2.3.6: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.0.1: + jackspeak@4.0.2: dependencies: '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jake@10.8.7: + jake@10.9.2: dependencies: - async: 3.2.5 + async: 3.2.6 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -16839,7 +16889,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -16854,19 +16904,21 @@ snapshots: dependencies: argparse: 2.0.1 + jsbn@1.1.0: {} + jscodeshift@17.1.1(@babel/preset-env@7.26.0(@babel/core@7.26.0)): dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.1 + '@babel/parser': 7.26.3 '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) - '@babel/preset-flow': 7.24.7(@babel/core@7.26.0) + '@babel/preset-flow': 7.25.9(@babel/core@7.26.0) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/register': 7.25.9(@babel/core@7.26.0) - flow-parser: 0.227.0 + flow-parser: 0.255.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -16881,22 +16933,22 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} - jsdom@24.1.3: + jsdom@25.0.1: dependencies: - cssstyle: 4.0.1 + cssstyle: 4.1.0 data-urls: 5.0.0 decimal.js: 10.4.3 - form-data: 4.0.0 + form-data: 4.0.1 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.12 - parse5: 7.1.2 + nwsapi: 2.2.16 + parse5: 7.2.1 rrweb-cssom: 0.7.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 + tough-cookie: 5.0.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 @@ -16973,7 +17025,7 @@ snapshots: jss-plugin-camel-case@10.10.0: dependencies: '@babel/runtime': 7.26.0 - hyphenate-style-name: 1.0.4 + hyphenate-style-name: 1.1.0 jss: 10.10.0 jss-plugin-default-unit@10.10.0: @@ -17089,11 +17141,11 @@ snapshots: dependencies: graceful-fs: 4.2.11 - karma-webpack@5.0.1(webpack@5.96.1): + karma-webpack@5.0.1(webpack@5.97.1): dependencies: glob: 7.2.3 - minimatch: 9.0.4 - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + minimatch: 9.0.5 + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) webpack-merge: 4.2.2 karma@6.4.4: @@ -17117,10 +17169,10 @@ snapshots: qjobs: 1.2.0 range-parser: 1.2.1 rimraf: 3.0.2 - socket.io: 4.7.4 + socket.io: 4.8.1 source-map: 0.6.1 tmp: 0.2.3 - ua-parser-js: 0.7.37 + ua-parser-js: 0.7.39 yargs: 16.2.0 transitivePeerDependencies: - bufferutil @@ -17134,23 +17186,23 @@ snapshots: kind-of@6.0.3: {} - language-subtag-registry@0.3.22: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: - language-subtag-registry: 0.3.22 + language-subtag-registry: 0.3.23 lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - lerna@8.1.9(@swc/core@1.7.35(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13): + lerna@8.1.9(@swc/core@1.9.3(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13): dependencies: - '@lerna/create': 8.1.9(@swc/core@1.7.35(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2) + '@lerna/create': 8.1.9(@swc/core@1.9.3(@swc/helpers@0.5.5))(babel-plugin-macros@3.1.0)(encoding@0.1.13)(typescript@5.7.2) '@npmcli/arborist': 7.5.4 '@npmcli/package-json': 5.2.0 '@npmcli/run-script': 8.1.0 - '@nx/devkit': 17.3.0(nx@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5))) + '@nx/devkit': 20.1.4(nx@20.1.4(@swc/core@1.9.3(@swc/helpers@0.5.5))) '@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/rest': 19.0.11(encoding@0.1.13) aproba: 2.0.0 @@ -17195,7 +17247,7 @@ snapshots: npm-package-arg: 11.0.2 npm-packlist: 8.0.2 npm-registry-fetch: 17.1.0 - nx: 17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)) + nx: 20.1.4(@swc/core@1.9.3(@swc/helpers@0.5.5)) p-map: 4.0.0 p-map-series: 2.1.0 p-pipe: 3.1.0 @@ -17255,13 +17307,13 @@ snapshots: libnpmpublish@9.0.9: dependencies: - ci-info: 4.0.0 + ci-info: 4.1.0 normalize-package-data: 6.0.2 npm-package-arg: 11.0.2 npm-registry-fetch: 17.1.0 proc-log: 4.2.0 semver: 7.6.3 - sigstore: 2.2.0 + sigstore: 2.3.1 ssri: 10.0.6 transitivePeerDependencies: - supports-color @@ -17272,7 +17324,7 @@ snapshots: lines-and-columns@1.2.4: {} - lines-and-columns@2.0.4: {} + lines-and-columns@2.0.3: {} linkify-it@5.0.0: dependencies: @@ -17405,8 +17457,8 @@ snapshots: dependencies: date-format: 4.0.14 debug: 4.3.7(supports-color@8.1.1) - flatted: 3.3.1 - rfdc: 1.3.1 + flatted: 3.3.2 + rfdc: 1.4.1 streamroller: 3.1.5 transitivePeerDependencies: - supports-color @@ -17425,7 +17477,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 lru-cache@10.4.3: {} @@ -17448,7 +17500,7 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.30.12: + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -17467,17 +17519,18 @@ snapshots: dependencies: semver: 7.6.3 - make-fetch-happen@13.0.0: + make-fetch-happen@13.0.1: dependencies: - '@npmcli/agent': 2.2.0 - cacache: 18.0.3 + '@npmcli/agent': 2.2.2 + cacache: 18.0.4 http-cache-semantics: 4.1.1 is-lambda: 1.0.1 minipass: 7.1.2 - minipass-fetch: 3.0.4 + minipass-fetch: 3.0.5 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.3 + negotiator: 0.6.4 + proc-log: 4.2.0 promise-retry: 2.0.1 ssri: 10.0.6 transitivePeerDependencies: @@ -17496,7 +17549,7 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - markdown-to-jsx@7.6.2(react@18.3.1): + markdown-to-jsx@7.7.1(react@18.3.1): dependencies: react: 18.3.1 @@ -17520,21 +17573,21 @@ snapshots: markdown-it: 14.1.0 markdownlint-micromark: 0.1.12 - marked@14.1.4: {} + marked@15.0.3: {} - mdast-util-from-markdown@2.0.1: + mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -17544,14 +17597,15 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.0 - mdast-util-to-markdown@2.1.0: + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 unist-util-visit: 5.0.0 zwitch: 2.0.4 @@ -17597,136 +17651,136 @@ snapshots: methods@1.1.2: {} - micromark-core-commonmark@2.0.1: + micromark-core-commonmark@2.0.2: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-destination@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-label@2.0.0: + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - micromark-factory-space@2.0.0: + micromark-factory-space@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 - micromark-factory-title@2.0.0: + micromark-factory-title@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - micromark-factory-whitespace@2.0.0: + micromark-factory-whitespace@2.0.1: dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - micromark-util-character@2.1.0: + micromark-util-character@2.1.1: dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - micromark-util-chunked@2.0.0: + micromark-util-chunked@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-classify-character@2.0.0: + micromark-util-classify-character@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - micromark-util-combine-extensions@2.0.0: + micromark-util-combine-extensions@2.0.1: dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 - micromark-util-decode-numeric-character-reference@2.0.1: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-decode-string@2.0.0: + micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - micromark-util-encode@2.0.0: {} + micromark-util-encode@2.0.1: {} - micromark-util-html-tag-name@2.0.0: {} + micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@2.0.0: + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@2.0.0: + micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 2.0.1 - micromark-util-sanitize-uri@2.0.0: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.1: + micromark-util-subtokenize@2.0.3: dependencies: devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - micromark-util-symbol@2.0.0: {} + micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.0: {} + micromark-util-types@2.0.1: {} - micromark@4.0.0: + micromark@4.0.1: dependencies: '@types/debug': 4.1.12 debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 transitivePeerDependencies: - supports-color @@ -17783,7 +17837,7 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -17799,7 +17853,7 @@ snapshots: dependencies: minipass: 7.1.2 - minipass-fetch@3.0.4: + minipass-fetch@3.0.5: dependencies: minipass: 7.1.2 minipass-sized: 1.0.3 @@ -17891,13 +17945,13 @@ snapshots: ms@2.1.3: {} - msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2): + msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.0.1(@types/node@20.17.7) - '@mswjs/interceptors': 0.37.0 + '@inquirer/confirm': 5.0.2(@types/node@20.17.9) + '@mswjs/interceptors': 0.37.3 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 @@ -17909,7 +17963,7 @@ snapshots: outvariant: 1.4.3 path-to-regexp: 6.3.0 strict-event-emitter: 0.5.1 - type-fest: 4.26.1 + type-fest: 4.30.0 yargs: 17.7.2 optionalDependencies: typescript: 5.7.2 @@ -17941,41 +17995,42 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} negotiator@0.6.3: {} + negotiator@0.6.4: {} + negotiator@1.0.0: {} neo-async@2.6.2: {} nested-error-stacks@2.1.1: {} - next@14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.20(@babel/core@7.26.0)(@playwright/test@1.49.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.18 + '@next/env': 14.2.20 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001667 + caniuse-lite: 1.0.30001686 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(@babel/core@7.26.0)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.18 - '@next/swc-darwin-x64': 14.2.18 - '@next/swc-linux-arm64-gnu': 14.2.18 - '@next/swc-linux-arm64-musl': 14.2.18 - '@next/swc-linux-x64-gnu': 14.2.18 - '@next/swc-linux-x64-musl': 14.2.18 - '@next/swc-win32-arm64-msvc': 14.2.18 - '@next/swc-win32-ia32-msvc': 14.2.18 - '@next/swc-win32-x64-msvc': 14.2.18 - '@opentelemetry/api': 1.8.0 - '@playwright/test': 1.44.1 + '@next/swc-darwin-arm64': 14.2.20 + '@next/swc-darwin-x64': 14.2.20 + '@next/swc-linux-arm64-gnu': 14.2.20 + '@next/swc-linux-arm64-musl': 14.2.20 + '@next/swc-linux-x64-gnu': 14.2.20 + '@next/swc-linux-x64-musl': 14.2.20 + '@next/swc-win32-arm64-msvc': 14.2.20 + '@next/swc-win32-ia32-msvc': 14.2.20 + '@next/swc-win32-x64-msvc': 14.2.20 + '@playwright/test': 1.49.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -17986,12 +18041,12 @@ snapshots: '@sinonjs/fake-timers': 13.0.5 '@sinonjs/text-encoding': 0.7.3 just-extend: 6.2.0 - path-to-regexp: 8.1.0 + path-to-regexp: 8.2.0 no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 node-cleanup@2.1.2: {} @@ -18001,7 +18056,7 @@ snapshots: node-environment-flags@1.0.6: dependencies: - object.getownpropertydescriptors: 2.1.7 + object.getownpropertydescriptors: 2.1.8 semver: 5.7.2 node-fetch@2.6.7(encoding@0.1.13): @@ -18016,17 +18071,17 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-gyp-build@4.8.1: {} + node-gyp-build@4.8.4: {} - node-gyp@10.0.1: + node-gyp@10.3.1: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 - glob: 10.3.10 + glob: 10.4.5 graceful-fs: 4.2.11 - make-fetch-happen: 13.0.0 + make-fetch-happen: 13.0.1 nopt: 7.2.1 - proc-log: 3.0.0 + proc-log: 4.2.0 semver: 7.6.3 tar: 6.2.1 which: 4.0.0 @@ -18037,13 +18092,13 @@ snapshots: node-preload@0.2.1: dependencies: - process-on-spawn: 1.0.0 + process-on-spawn: 1.1.0 node-releases@2.0.18: {} nopt@3.0.6: dependencies: - abbrev: 1.1.1 + abbrev: 1.0.9 nopt@7.2.1: dependencies: @@ -18073,7 +18128,7 @@ snapshots: normalize-range@0.1.2: {} - npm-bundled@3.0.0: + npm-bundled@3.0.1: dependencies: npm-normalize-package-bin: 3.0.1 @@ -18092,9 +18147,9 @@ snapshots: npm-packlist@8.0.2: dependencies: - ignore-walk: 6.0.4 + ignore-walk: 6.0.5 - npm-pick-manifest@9.0.1: + npm-pick-manifest@9.1.0: dependencies: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 @@ -18105,9 +18160,9 @@ snapshots: dependencies: '@npmcli/redact': 2.0.1 jsonparse: 1.3.1 - make-fetch-happen: 13.0.0 + make-fetch-happen: 13.0.1 minipass: 7.1.2 - minipass-fetch: 3.0.4 + minipass-fetch: 3.0.5 minizlib: 2.1.2 npm-package-arg: 11.0.2 proc-log: 4.2.0 @@ -18129,56 +18184,54 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.12: {} + nwsapi@2.2.16: {} - nx@17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)): + nx@20.1.4(@swc/core@1.9.3(@swc/helpers@0.5.5)): dependencies: - '@nrwl/tao': 17.3.0(@swc/core@1.7.35(@swc/helpers@0.5.5)) + '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.6 - axios: 1.7.7(debug@4.3.7) + '@yarnpkg/parsers': 3.0.2 + '@zkochan/js-yaml': 0.0.7 + axios: 1.7.8(debug@4.3.7) chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 - dotenv: 16.3.2 - dotenv-expand: 10.0.0 + dotenv: 16.4.6 + dotenv-expand: 11.0.7 enquirer: 2.3.6 figures: 3.2.0 flat: 5.0.2 - fs-extra: 11.2.0 - ignore: 5.3.1 + front-matter: 4.0.2 + ignore: 5.3.2 jest-diff: 29.7.0 - js-yaml: 4.1.0 jsonc-parser: 3.2.0 - lines-and-columns: 2.0.4 + lines-and-columns: 2.0.3 minimatch: 9.0.3 node-machine-id: 1.1.12 npm-run-path: 4.0.1 open: 8.4.2 ora: 5.3.0 - semver: 7.5.3 + semver: 7.6.3 string-width: 4.2.3 - strong-log-transformer: 2.1.0 tar-stream: 2.2.0 tmp: 0.2.3 tsconfig-paths: 4.2.0 - tslib: 2.6.2 + tslib: 2.8.1 yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 17.3.0 - '@nx/nx-darwin-x64': 17.3.0 - '@nx/nx-freebsd-x64': 17.3.0 - '@nx/nx-linux-arm-gnueabihf': 17.3.0 - '@nx/nx-linux-arm64-gnu': 17.3.0 - '@nx/nx-linux-arm64-musl': 17.3.0 - '@nx/nx-linux-x64-gnu': 17.3.0 - '@nx/nx-linux-x64-musl': 17.3.0 - '@nx/nx-win32-arm64-msvc': 17.3.0 - '@nx/nx-win32-x64-msvc': 17.3.0 - '@swc/core': 1.7.35(@swc/helpers@0.5.5) + '@nx/nx-darwin-arm64': 20.1.4 + '@nx/nx-darwin-x64': 20.1.4 + '@nx/nx-freebsd-x64': 20.1.4 + '@nx/nx-linux-arm-gnueabihf': 20.1.4 + '@nx/nx-linux-arm64-gnu': 20.1.4 + '@nx/nx-linux-arm64-musl': 20.1.4 + '@nx/nx-linux-x64-gnu': 20.1.4 + '@nx/nx-linux-x64-musl': 20.1.4 + '@nx/nx-win32-arm64-msvc': 20.1.4 + '@nx/nx-win32-x64-msvc': 20.1.4 + '@swc/core': 1.9.3(@swc/helpers@0.5.5) transitivePeerDependencies: - debug @@ -18196,15 +18249,15 @@ snapshots: glob: 7.2.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 6.0.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-processinfo: 2.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 + istanbul-reports: 3.1.7 make-dir: 3.1.0 node-preload: 0.2.1 p-map: 3.0.0 - process-on-spawn: 1.0.0 + process-on-spawn: 1.1.0 resolve-from: 5.0.0 rimraf: 3.0.2 signal-exit: 3.0.7 @@ -18218,7 +18271,7 @@ snapshots: object-hash@2.2.0: {} - object-inspect@1.13.1: {} + object-inspect@1.13.3: {} object-keys@0.4.0: {} @@ -18228,7 +18281,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - has-symbols: 1.0.3 + has-symbols: 1.1.0 object-keys: 1.1.1 object.entries@1.1.8: @@ -18241,22 +18294,24 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 - object.getownpropertydescriptors@2.1.7: + object.getownpropertydescriptors@2.1.8: dependencies: - array.prototype.reduce: 1.0.6 + array.prototype.reduce: 1.0.7 call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 + es-object-atoms: 1.0.0 + gopd: 1.1.0 safe-array-concat: 1.1.2 object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 object.values@1.2.0: dependencies: @@ -18288,7 +18343,7 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openapi-fetch@0.13.0: + openapi-fetch@0.13.1: dependencies: openapi-typescript-helpers: 0.0.15 @@ -18305,14 +18360,14 @@ snapshots: type-check: 0.3.2 word-wrap: 1.2.5 - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ora@5.3.0: dependencies: @@ -18367,7 +18422,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 p-locate@2.0.0: dependencies: @@ -18440,25 +18495,25 @@ snapshots: lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 - package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} pacote@18.0.6: dependencies: - '@npmcli/git': 5.0.4 + '@npmcli/git': 5.0.8 '@npmcli/installed-package-contents': 2.1.0 '@npmcli/package-json': 5.2.0 - '@npmcli/promise-spawn': 7.0.1 + '@npmcli/promise-spawn': 7.0.2 '@npmcli/run-script': 8.1.0 - cacache: 18.0.3 + cacache: 18.0.4 fs-minipass: 3.0.3 minipass: 7.1.2 npm-package-arg: 11.0.2 npm-packlist: 8.0.2 - npm-pick-manifest: 9.0.1 + npm-pick-manifest: 9.1.0 npm-registry-fetch: 17.1.0 proc-log: 4.2.0 promise-retry: 2.0.1 - sigstore: 2.2.0 + sigstore: 2.3.1 ssri: 10.0.6 tar: 6.2.1 transitivePeerDependencies: @@ -18470,7 +18525,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 parent-module@1.0.1: dependencies: @@ -18490,9 +18545,9 @@ snapshots: git-config-path: 1.0.1 ini: 1.3.8 - parse-github-url@1.0.2: {} + parse-github-url@1.0.3: {} - parse-imports@2.1.1: + parse-imports@2.2.1: dependencies: es-module-lexer: 1.5.4 slashes: 3.0.12 @@ -18504,7 +18559,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.0 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -18525,7 +18580,7 @@ snapshots: dependencies: parse-path: 7.0.0 - parse5@7.1.2: + parse5@7.2.1: dependencies: entities: 4.5.0 @@ -18534,7 +18589,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 path-exists@3.0.0: {} @@ -18552,7 +18607,7 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 minipass: 7.1.2 @@ -18566,7 +18621,7 @@ snapshots: path-to-regexp@6.3.0: {} - path-to-regexp@8.1.0: {} + path-to-regexp@8.2.0: {} path-type@3.0.0: dependencies: @@ -18618,25 +18673,17 @@ snapshots: dependencies: find-up: 3.0.0 - playwright-core@1.44.1: {} - - playwright-core@1.48.2: {} + playwright-core@1.49.0: {} - playwright@1.44.1: + playwright@1.49.0: dependencies: - playwright-core: 1.44.1 - optionalDependencies: - fsevents: 2.3.2 - - playwright@1.48.2: - dependencies: - playwright-core: 1.48.2 + playwright-core: 1.49.0 optionalDependencies: fsevents: 2.3.2 possible-typed-array-names@1.0.0: {} - postcss-selector-parser@6.1.0: + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -18645,19 +18692,19 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.38: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.49: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -18669,7 +18716,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.3.3: {} + prettier@3.4.2: {} pretty-error@4.0.0: dependencies: @@ -18688,20 +18735,20 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-ms@9.0.0: + pretty-ms@9.2.0: dependencies: parse-ms: 4.0.0 - pretty-quick@4.0.0(prettier@3.3.3): + pretty-quick@4.0.0(prettier@3.4.2): dependencies: execa: 5.1.1 find-up: 5.0.0 - ignore: 5.3.1 + ignore: 5.3.2 mri: 1.2.0 picocolors: 1.1.1 picomatch: 3.0.1 - prettier: 3.3.3 - tslib: 2.6.2 + prettier: 3.4.2 + tslib: 2.8.1 prettyjson@1.2.5: dependencies: @@ -18710,13 +18757,11 @@ snapshots: prismjs@1.29.0: {} - proc-log@3.0.0: {} - proc-log@4.2.0: {} process-nextick-args@2.0.1: {} - process-on-spawn@1.0.0: + process-on-spawn@1.1.0: dependencies: fromentries: 1.3.2 @@ -18726,7 +18771,7 @@ snapshots: promise-all-reject-late@1.0.1: {} - promise-call-limit@3.0.1: {} + promise-call-limit@3.0.2: {} promise-inflight@1.0.1: {} @@ -18735,9 +18780,9 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 - promzard@1.0.0: + promzard@1.0.2: dependencies: - read: 2.1.0 + read: 3.0.1 prop-types@15.8.1: dependencies: @@ -18756,10 +18801,14 @@ snapshots: pseudomap@1.0.2: {} - psl@1.9.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 punycode.js@2.3.1: {} + punycode@1.4.1: {} + punycode@2.3.1: {} qjobs@1.2.0: {} @@ -18768,6 +18817,10 @@ snapshots: dependencies: side-channel: 1.0.6 + qs@6.13.1: + dependencies: + side-channel: 1.0.6 + querystringify@2.2.0: {} queue-microtask@1.2.3: {} @@ -18808,7 +18861,7 @@ snapshots: react-docgen@5.4.3: dependencies: '@babel/core': 7.26.0 - '@babel/generator': 7.26.0 + '@babel/generator': 7.26.3 '@babel/runtime': 7.26.0 ast-types: 0.14.2 commander: 2.20.3 @@ -18826,7 +18879,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-hook-form@7.53.2(react@18.3.1): + react-hook-form@7.54.0(react@18.3.1): dependencies: react: 18.3.1 @@ -18834,16 +18887,16 @@ snapshots: react-refresh@0.14.2: {} - react-router-dom@6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@remix-run/router': 1.20.0 + '@remix-run/router': 1.21.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.27.0(react@18.3.1) + react-router: 6.28.0(react@18.3.1) - react-router@6.27.0(react@18.3.1): + react-router@6.28.0(react@18.3.1): dependencies: - '@remix-run/router': 1.20.0 + '@remix-run/router': 1.21.0 react: 18.3.1 react-runner@1.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -18901,10 +18954,6 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 - read@2.1.0: - dependencies: - mute-stream: 1.0.0 - read@3.0.1: dependencies: mute-stream: 1.0.0 @@ -18947,7 +18996,7 @@ snapshots: ast-types: 0.14.2 esprima: 4.0.1 source-map: 0.6.1 - tslib: 2.6.2 + tslib: 2.8.1 recast@0.23.9: dependencies: @@ -18955,7 +19004,7 @@ snapshots: esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.6.2 + tslib: 2.8.1 rechoir@0.8.0: dependencies: @@ -18966,14 +19015,15 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - reflect.getprototypeof@1.0.4: + reflect.getprototypeof@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 + es-errors: 1.3.0 get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.3 + gopd: 1.1.0 + which-builtin-type: 1.2.0 regenerate-unicode-properties@10.2.0: dependencies: @@ -18989,21 +19039,21 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - regexpu-core@6.1.1: + regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.0 regjsgen: 0.8.0 - regjsparser: 0.11.1 + regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 + unicode-match-property-value-ecmascript: 2.2.0 registry-auth-token@3.3.2: dependencies: @@ -19016,7 +19066,7 @@ snapshots: regjsgen@0.8.0: {} - regjsparser@0.11.1: + regjsparser@0.12.0: dependencies: jsesc: 3.0.2 @@ -19029,8 +19079,8 @@ snapshots: remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.1 - micromark-util-types: 2.0.0 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.1 unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -19038,7 +19088,7 @@ snapshots: remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.0 + mdast-util-to-markdown: 2.1.2 unified: 11.0.5 remark@15.0.1: @@ -19105,7 +19155,7 @@ snapshots: reusify@1.0.4: {} - rfdc@1.3.1: {} + rfdc@1.4.1: {} rifm@0.12.1(react@18.3.1): dependencies: @@ -19126,30 +19176,32 @@ snapshots: rimraf@6.0.1: dependencies: glob: 11.0.0 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 robust-predicates@3.0.2: {} - rollup@4.18.1: + rollup@4.28.0: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.1 - '@rollup/rollup-android-arm64': 4.18.1 - '@rollup/rollup-darwin-arm64': 4.18.1 - '@rollup/rollup-darwin-x64': 4.18.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 - '@rollup/rollup-linux-arm-musleabihf': 4.18.1 - '@rollup/rollup-linux-arm64-gnu': 4.18.1 - '@rollup/rollup-linux-arm64-musl': 4.18.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 - '@rollup/rollup-linux-riscv64-gnu': 4.18.1 - '@rollup/rollup-linux-s390x-gnu': 4.18.1 - '@rollup/rollup-linux-x64-gnu': 4.18.1 - '@rollup/rollup-linux-x64-musl': 4.18.1 - '@rollup/rollup-win32-arm64-msvc': 4.18.1 - '@rollup/rollup-win32-ia32-msvc': 4.18.1 - '@rollup/rollup-win32-x64-msvc': 4.18.1 + '@rollup/rollup-android-arm-eabi': 4.28.0 + '@rollup/rollup-android-arm64': 4.28.0 + '@rollup/rollup-darwin-arm64': 4.28.0 + '@rollup/rollup-darwin-x64': 4.28.0 + '@rollup/rollup-freebsd-arm64': 4.28.0 + '@rollup/rollup-freebsd-x64': 4.28.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 + '@rollup/rollup-linux-arm-musleabihf': 4.28.0 + '@rollup/rollup-linux-arm64-gnu': 4.28.0 + '@rollup/rollup-linux-arm64-musl': 4.28.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 + '@rollup/rollup-linux-riscv64-gnu': 4.28.0 + '@rollup/rollup-linux-s390x-gnu': 4.28.0 + '@rollup/rollup-linux-x64-gnu': 4.28.0 + '@rollup/rollup-linux-x64-musl': 4.28.0 + '@rollup/rollup-win32-arm64-msvc': 4.28.0 + '@rollup/rollup-win32-ia32-msvc': 4.28.0 + '@rollup/rollup-win32-x64-msvc': 4.28.0 fsevents: 2.3.3 router@2.0.0: @@ -19158,12 +19210,10 @@ snapshots: is-promise: 4.0.0 methods: 1.1.2 parseurl: 1.3.3 - path-to-regexp: 8.1.0 + path-to-regexp: 8.2.0 setprototypeof: 1.2.0 utils-merge: 1.0.1 - rrweb-cssom@0.6.0: {} - rrweb-cssom@0.7.1: {} rtl-css-js@1.16.1: @@ -19178,13 +19228,13 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.1.2: {} @@ -19195,7 +19245,7 @@ snapshots: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 + is-regex: 1.2.0 safer-buffer@2.1.2: {} @@ -19220,20 +19270,16 @@ snapshots: 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) + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) - search-insights@2.13.0: {} + search-insights@2.17.3: {} semver@5.7.2: {} semver@6.3.1: {} - semver@7.5.3: - dependencies: - lru-cache: 6.0.0 - semver@7.6.3: {} send@1.1.0: @@ -19300,7 +19346,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - gopd: 1.0.1 + gopd: 1.1.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -19352,14 +19398,14 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.2: {} 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 + object-inspect: 1.13.3 siginfo@2.0.0: {} @@ -19367,14 +19413,14 @@ snapshots: signal-exit@4.1.0: {} - sigstore@2.2.0: + sigstore@2.3.1: dependencies: - '@sigstore/bundle': 2.1.1 - '@sigstore/core': 0.2.0 - '@sigstore/protobuf-specs': 0.2.1 - '@sigstore/sign': 2.2.1 - '@sigstore/tuf': 2.3.0 - '@sigstore/verify': 0.1.0 + '@sigstore/bundle': 2.3.2 + '@sigstore/core': 1.1.0 + '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/sign': 2.3.2 + '@sigstore/tuf': 2.3.4 + '@sigstore/verify': 1.2.1 transitivePeerDependencies: - supports-color @@ -19393,13 +19439,13 @@ snapshots: sirv@2.0.4: dependencies: - '@polka/url': 1.0.0-next.24 + '@polka/url': 1.0.0-next.28 mrmime: 2.0.0 totalist: 3.0.1 sirv@3.0.0: dependencies: - '@polka/url': 1.0.0-next.24 + '@polka/url': 1.0.0-next.28 mrmime: 2.0.0 totalist: 3.0.1 @@ -19415,45 +19461,47 @@ snapshots: smart-buffer@4.2.0: {} - socket.io-adapter@2.5.2: + socket.io-adapter@2.5.5: dependencies: - ws: 8.11.0 + debug: 4.3.7(supports-color@8.1.1) + ws: 8.17.1 transitivePeerDependencies: - bufferutil + - supports-color - utf-8-validate socket.io-parser@4.2.4: dependencies: - '@socket.io/component-emitter': 3.1.0 + '@socket.io/component-emitter': 3.1.2 debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - socket.io@4.7.4: + socket.io@4.8.1: dependencies: accepts: 1.3.8 base64id: 2.0.0 cors: 2.8.5 debug: 4.3.7(supports-color@8.1.1) - engine.io: 6.5.4 - socket.io-adapter: 2.5.2 + engine.io: 6.6.2 + socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - socks-proxy-agent@8.0.2: + socks-proxy-agent@8.0.4: dependencies: - agent-base: 7.1.0 + agent-base: 7.1.1 debug: 4.3.7(supports-color@8.1.1) - socks: 2.7.1 + socks: 2.8.3 transitivePeerDependencies: - supports-color - socks@2.7.1: + socks@2.8.3: dependencies: - ip: 2.0.0 + ip-address: 9.0.5 smart-buffer: 4.2.0 sort-keys@2.0.0: @@ -19488,21 +19536,21 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-license-ids: 3.0.20 - spdx-exceptions@2.4.0: {} + spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: - spdx-exceptions: 2.4.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 spdx-expression-parse@4.0.0: dependencies: - spdx-exceptions: 2.4.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 - spdx-license-ids@3.0.16: {} + spdx-license-ids@3.0.20: {} split2@3.2.2: dependencies: @@ -19514,6 +19562,8 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + ssri@10.0.6: dependencies: minipass: 7.1.2 @@ -19543,11 +19593,11 @@ snapshots: strict-event-emitter@0.5.1: {} - string-replace-loader@3.1.0(webpack@5.96.1): + string-replace-loader@3.1.0(webpack@5.97.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) string-width@4.2.3: dependencies: @@ -19565,33 +19615,33 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 string.prototype.matchall@4.0.11: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 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 + gopd: 1.1.0 + has-symbols: 1.1.0 internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 + regexp.prototype.flags: 1.5.3 set-function-name: 2.0.2 side-channel: 1.0.6 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.5 es-object-atoms: 1.0.0 string.prototype.trimend@1.0.8: @@ -19622,7 +19672,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -19670,7 +19720,7 @@ snapshots: stylis-plugin-rtl@2.1.1(stylis@4.3.4): dependencies: - cssjanus: 2.1.0 + cssjanus: 2.3.0 stylis: 4.3.4 stylis@4.2.0: {} @@ -19683,7 +19733,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 10.3.10 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -19714,10 +19764,10 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.9.1: + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.2 + tslib: 2.8.1 tapable@0.1.10: {} @@ -19742,20 +19792,20 @@ snapshots: temp-dir@1.0.0: {} - terser-webpack-plugin@5.3.10(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack@5.96.1): + terser-webpack-plugin@5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack@5.97.1): dependencies: '@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.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + terser: 5.36.0 + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) optionalDependencies: - '@swc/core': 1.7.35(@swc/helpers@0.5.5) + '@swc/core': 1.9.3(@swc/helpers@0.5.5) - terser@5.27.0: + terser@5.36.0: dependencies: - '@jridgewell/source-map': 0.3.5 + '@jridgewell/source-map': 0.3.6 acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -19803,12 +19853,18 @@ snapshots: fdir: 6.4.2(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.1: {} + tinypool@1.0.2: {} tinyrainbow@1.2.0: {} tinyspy@3.0.2: {} + tldts-core@6.1.65: {} + + tldts@6.1.65: + dependencies: + tldts-core: 6.1.65 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -19825,11 +19881,15 @@ snapshots: tough-cookie@4.1.4: dependencies: - psl: 1.9.0 + psl: 1.15.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 + tough-cookie@5.0.0: + dependencies: + tldts: 6.1.65 + tr46@0.0.3: {} tr46@5.0.0: @@ -19846,7 +19906,7 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.3.0(typescript@5.7.2): + ts-api-utils@1.4.3(typescript@5.7.2): dependencies: typescript: 5.7.2 @@ -19867,20 +19927,22 @@ snapshots: tslib@2.6.2: {} + tslib@2.8.1: {} + tsscmp@1.0.6: {} tsx@4.19.2: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.7.5 + get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 - tuf-js@2.2.0: + tuf-js@2.2.1: dependencies: - '@tufjs/models': 2.0.0 + '@tufjs/models': 2.0.1 debug: 4.3.7(supports-color@8.1.1) - make-fetch-happen: 13.0.0 + make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color @@ -19912,7 +19974,7 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.26.1: {} + type-fest@4.30.0: {} type-is@1.6.18: dependencies: @@ -19935,27 +19997,28 @@ snapshots: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 + gopd: 1.1.0 + has-proto: 1.1.0 is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.3: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 + gopd: 1.1.0 + has-proto: 1.1.0 is-typed-array: 1.1.13 + reflect.getprototypeof: 1.0.7 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 + gopd: 1.1.0 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.7 typedarray-to-buffer@3.1.5: dependencies: @@ -19965,19 +20028,19 @@ snapshots: typescript@5.7.2: {} - ua-parser-js@0.7.37: {} + ua-parser-js@0.7.39: {} uc.micro@2.1.0: {} - uglify-js@3.17.4: + uglify-js@3.19.3: optional: true 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 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.0 undici-types@6.19.8: {} @@ -19985,14 +20048,14 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - unicode-canonical-property-names-ecmascript@2.0.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-canonical-property-names-ecmascript: 2.0.1 unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.1.0: {} + unicode-match-property-value-ecmascript@2.2.0: {} unicode-property-aliases-ecmascript@2.1.0: {} @@ -20064,10 +20127,10 @@ snapshots: upath@2.0.1: {} - update-browserslist-db@1.1.0(browserslist@4.24.0): + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.24.0 - escalade: 3.1.2 + browserslist: 4.24.2 + escalade: 3.2.0 picocolors: 1.1.1 update-check@1.5.4: @@ -20088,7 +20151,7 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-sync-external-store@1.2.2(react@18.3.1): + use-sync-external-store@1.4.0(react@18.3.1): dependencies: react: 18.3.1 @@ -20102,7 +20165,7 @@ snapshots: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 utila@0.4.0: {} @@ -20110,11 +20173,13 @@ snapshots: uuid@10.0.0: {} + uuid@11.0.3: {} + uuid@8.3.2: {} uuid@9.0.1: {} - v8-to-istanbul@9.2.0: + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 @@ -20143,65 +20208,67 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.1.5(@types/node@20.17.7)(terser@5.27.0): + vite-node@2.1.8(@types/node@20.17.9)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.3.7(supports-color@8.1.1) es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.3.4(@types/node@20.17.7)(terser@5.27.0) + vite: 5.4.11(@types/node@20.17.9)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite@5.3.4(@types/node@20.17.7)(terser@5.27.0): + vite@5.4.11(@types/node@20.17.9)(terser@5.36.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.18.1 + rollup: 4.28.0 optionalDependencies: - '@types/node': 20.17.7 + '@types/node': 20.17.9 fsevents: 2.3.3 - terser: 5.27.0 + terser: 5.36.0 - vitest@2.1.5(@types/node@20.17.7)(@vitest/browser@2.1.5)(@vitest/ui@2.1.5)(jsdom@24.1.3)(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(terser@5.27.0): + vitest@2.1.8(@types/node@20.17.9)(@vitest/browser@2.1.8)(@vitest/ui@2.1.8)(jsdom@25.0.1)(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(terser@5.36.0): dependencies: - '@vitest/expect': 2.1.5 - '@vitest/mocker': 2.1.5(msw@2.6.5(@types/node@20.17.7)(typescript@5.7.2))(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0)) - '@vitest/pretty-format': 2.1.5 - '@vitest/runner': 2.1.5 - '@vitest/snapshot': 2.1.5 - '@vitest/spy': 2.1.5 - '@vitest/utils': 2.1.5 + '@vitest/expect': 2.1.8 + '@vitest/mocker': 2.1.8(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2))(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0)) + '@vitest/pretty-format': 2.1.8 + '@vitest/runner': 2.1.8 + '@vitest/snapshot': 2.1.8 + '@vitest/spy': 2.1.8 + '@vitest/utils': 2.1.8 chai: 5.1.2 debug: 4.3.7(supports-color@8.1.1) expect-type: 1.1.0 - magic-string: 0.30.12 + magic-string: 0.30.14 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.1 - tinypool: 1.0.1 + tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.3.4(@types/node@20.17.7)(terser@5.27.0) - vite-node: 2.1.5(@types/node@20.17.7)(terser@5.27.0) + vite: 5.4.11(@types/node@20.17.9)(terser@5.36.0) + vite-node: 2.1.8(@types/node@20.17.9)(terser@5.36.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.17.7 - '@vitest/browser': 2.1.5(@types/node@20.17.7)(playwright@1.48.2)(typescript@5.7.2)(vite@5.3.4(@types/node@20.17.7)(terser@5.27.0))(vitest@2.1.5) - '@vitest/ui': 2.1.5(vitest@2.1.5) - jsdom: 24.1.3 + '@types/node': 20.17.9 + '@vitest/browser': 2.1.8(@types/node@20.17.9)(playwright@1.49.0)(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.9)(terser@5.36.0))(vitest@2.1.8) + '@vitest/ui': 2.1.8(vitest@2.1.8) + jsdom: 25.0.1 transitivePeerDependencies: - less - lightningcss - msw - sass + - sass-embedded - stylus - sugarss - supports-color @@ -20215,7 +20282,7 @@ snapshots: walk-up-path@3.0.1: {} - watchpack@2.4.1: + watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -20232,7 +20299,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 acorn: 8.14.0 - acorn-walk: 8.3.2 + acorn-walk: 8.3.4 commander: 7.2.0 debounce: 1.2.1 escape-string-regexp: 4.0.0 @@ -20241,26 +20308,26 @@ snapshots: opener: 1.5.2 picocolors: 1.1.1 sirv: 2.0.4 - ws: 7.5.9 + ws: 7.5.10 transitivePeerDependencies: - bufferutil - utf-8-validate - webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1): + webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1))(webpack@5.96.1) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1))(webpack@5.96.1) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1))(webpack@5.96.1) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1))(webpack@5.97.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1))(webpack@5.97.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1))(webpack@5.97.1) colorette: 2.0.20 commander: 10.0.1 - cross-spawn: 7.0.3 - envinfo: 7.13.0 + cross-spawn: 7.0.6 + envinfo: 7.14.0 fastest-levenshtein: 1.0.16 - import-local: 3.1.0 + import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)) + webpack: 5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)) webpack-merge: 5.10.0 optionalDependencies: webpack-bundle-analyzer: 4.10.2 @@ -20277,16 +20344,16 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.96.1(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1)): + webpack@5.97.1(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.14.0 - browserslist: 4.24.0 - chrome-trace-event: 1.0.3 + browserslist: 4.24.2 + chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 eslint-scope: 5.1.1 @@ -20299,11 +20366,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.7.35(@swc/helpers@0.5.5))(webpack@5.96.1) - watchpack: 2.4.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.5))(webpack@5.97.1) + watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.96.1) + webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.97.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -20325,44 +20392,45 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.0: 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 + is-bigint: 1.1.0 + is-boolean-object: 1.2.0 + is-number-object: 1.1.0 + is-string: 1.1.0 + is-symbol: 1.1.0 - which-builtin-type@1.1.3: + which-builtin-type@1.2.0: dependencies: + call-bind: 1.0.7 function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 + is-finalizationregistry: 1.1.0 is-generator-function: 1.0.10 - is-regex: 1.1.4 + is-regex: 1.2.0 is-weakref: 1.0.2 isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.15 + which-boxed-primitive: 1.1.0 + which-collection: 1.0.2 + which-typed-array: 1.1.16 - which-collection@1.0.1: + which-collection@1.0.2: dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 which-module@2.0.1: {} - which-typed-array@1.1.15: + which-typed-array@1.1.16: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.1.0 has-tostringtag: 1.0.2 which@1.3.1: @@ -20451,9 +20519,9 @@ snapshots: type-fest: 0.4.1 write-json-file: 3.2.0 - ws@7.5.9: {} + ws@7.5.10: {} - ws@8.11.0: {} + ws@8.17.1: {} ws@8.18.0: {} @@ -20514,7 +20582,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -20524,7 +20592,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -20533,11 +20601,11 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} + yocto-queue@1.1.1: {} yoctocolors-cjs@2.1.2: {} - yoctocolors@2.0.2: {} + yoctocolors@2.1.1: {} zip-stream@4.1.1: dependencies: @@ -20545,7 +20613,7 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-validation-error@3.3.0(zod@3.23.8): + zod-validation-error@3.4.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/renovate.json b/renovate.json index 3f11d78f51a84..6e01cb4e09337 100644 --- a/renovate.json +++ b/renovate.json @@ -41,14 +41,7 @@ }, { "groupName": "React", - "matchPackageNames": [ - "react", - "react-dom", - "react-is", - "react-test-renderer", - "@types/react", - "@types/react-dom" - ] + "matchPackageNames": ["react", "react-dom", "react-is", "@types/react", "@types/react-dom"] }, { "groupName": "React router", @@ -109,7 +102,7 @@ }, { "groupName": "Playwright", - "matchPackageNames": ["playwright", "@playwright/test"] + "matchPackageNames": ["playwright", "@playwright/test", "mcr.microsoft.com/playwright"] }, { "matchDepTypes": ["action"], diff --git a/scripts/releaseChangelog.mjs b/scripts/releaseChangelog.mjs index b7c47b24b268c..35cbcbb70e05d 100644 --- a/scripts/releaseChangelog.mjs +++ b/scripts/releaseChangelog.mjs @@ -182,6 +182,7 @@ async function main(argv) { const chartsCommits = []; const chartsProCommits = []; const treeViewCommits = []; + const treeViewProCommits = []; const coreCommits = []; const docsCommits = []; const otherCommits = []; @@ -220,10 +221,15 @@ async function main(argv) { chartsCommits.push(commitItem); break; case 'TreeView': + case 'RichTreeView': case 'tree view': case 'TreeItem': treeViewCommits.push(commitItem); break; + case 'RichTreeViewPro': + case 'tree view pro': + treeViewProCommits.push(commitItem); + break; case 'docs': docsCommits.push(commitItem); break; @@ -367,9 +373,13 @@ Same changes as in \`@mui/x-charts@__VERSION__\`${chartsProCommits.length > 0 ? ${logChangelogSection(chartsProCommits)}${chartsProCommits.length > 0 ? '\n' : ''} ### Tree View -#### \`@mui/x-tree-view@__VERSION__\` +#### \`@mui/x-tree-view@__VERSION__\` +${logChangelogSection(treeViewProCommits) || `No changes since \`@mui/x-tree-view-pro@${lastRelease}\`.`} + +#### \`@mui/x-tree-view-pro@__VERSION__\` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan') -${logChangelogSection(treeViewCommits) || `No changes since \`@mui/x-tree-view@${lastRelease}\`.`} +Same changes as in \`@mui/x-tree-view@__VERSION__\`${treeViewProCommits.length > 0 ? ', plus:\n' : '.'} +${logChangelogSection(treeViewProCommits)}${treeViewProCommits.length > 0 ? '\n' : ''} ${logChangelogSection(codemodCommits, `### \`@mui/x-codemod@__VERSION__\``)} ${logChangelogSection(docsCommits, '### Docs')} ${logChangelogSection(coreCommits, '### Core')} diff --git a/scripts/x-data-grid-premium.exports.json b/scripts/x-data-grid-premium.exports.json index eb7d7359fef10..99ca439203b82 100644 --- a/scripts/x-data-grid-premium.exports.json +++ b/scripts/x-data-grid-premium.exports.json @@ -406,6 +406,7 @@ { "name": "GridLeafColumn", "kind": "Interface" }, { "name": "GridLeafNode", "kind": "Interface" }, { "name": "GridListColDef", "kind": "TypeAlias" }, + { "name": "gridListColumnSelector", "kind": "Variable" }, { "name": "GridLoadIcon", "kind": "Variable" }, { "name": "GridLoadingOverlay", "kind": "Variable" }, { "name": "GridLoadingOverlayProps", "kind": "Interface" }, @@ -536,7 +537,6 @@ { "name": "GridRowProps", "kind": "Interface" }, { "name": "GridRowReorderCell", "kind": "Function" }, { "name": "GridRowScrollEndParams", "kind": "Interface" }, - { "name": "gridRowsDataRowIdToIdLookupSelector", "kind": "Variable" }, { "name": "GridRowSelectionApi", "kind": "Interface" }, { "name": "GridRowSelectionCheckboxParams", "kind": "Interface" }, { "name": "GridRowSelectionModel", "kind": "TypeAlias" }, diff --git a/scripts/x-data-grid-pro.exports.json b/scripts/x-data-grid-pro.exports.json index a7af2165644f8..71add8c10f94f 100644 --- a/scripts/x-data-grid-pro.exports.json +++ b/scripts/x-data-grid-pro.exports.json @@ -369,6 +369,7 @@ { "name": "GridLeafColumn", "kind": "Interface" }, { "name": "GridLeafNode", "kind": "Interface" }, { "name": "GridListColDef", "kind": "TypeAlias" }, + { "name": "gridListColumnSelector", "kind": "Variable" }, { "name": "GridLoadIcon", "kind": "Variable" }, { "name": "GridLoadingOverlay", "kind": "Variable" }, { "name": "GridLoadingOverlayProps", "kind": "Interface" }, @@ -488,7 +489,6 @@ { "name": "GridRowProps", "kind": "Interface" }, { "name": "GridRowReorderCell", "kind": "Function" }, { "name": "GridRowScrollEndParams", "kind": "Interface" }, - { "name": "gridRowsDataRowIdToIdLookupSelector", "kind": "Variable" }, { "name": "GridRowSelectionApi", "kind": "Interface" }, { "name": "GridRowSelectionCheckboxParams", "kind": "Interface" }, { "name": "GridRowSelectionModel", "kind": "TypeAlias" }, diff --git a/scripts/x-data-grid.exports.json b/scripts/x-data-grid.exports.json index d5bad6c0b298e..34314a1054329 100644 --- a/scripts/x-data-grid.exports.json +++ b/scripts/x-data-grid.exports.json @@ -331,6 +331,7 @@ { "name": "GridLeafColumn", "kind": "Interface" }, { "name": "GridLeafNode", "kind": "Interface" }, { "name": "GridListColDef", "kind": "TypeAlias" }, + { "name": "gridListColumnSelector", "kind": "Variable" }, { "name": "GridLoadIcon", "kind": "Variable" }, { "name": "GridLoadingOverlay", "kind": "Variable" }, { "name": "GridLoadingOverlayProps", "kind": "Interface" }, @@ -438,7 +439,6 @@ { "name": "GridRowProApi", "kind": "Interface" }, { "name": "GridRowProPrivateApi", "kind": "Interface" }, { "name": "GridRowProps", "kind": "Interface" }, - { "name": "gridRowsDataRowIdToIdLookupSelector", "kind": "Variable" }, { "name": "GridRowSelectionApi", "kind": "Interface" }, { "name": "GridRowSelectionCheckboxParams", "kind": "Interface" }, { "name": "GridRowSelectionModel", "kind": "TypeAlias" }, diff --git a/scripts/x-date-pickers-pro.exports.json b/scripts/x-date-pickers-pro.exports.json index 1ea478a0b8c3f..36b6475908895 100644 --- a/scripts/x-date-pickers-pro.exports.json +++ b/scripts/x-date-pickers-pro.exports.json @@ -157,6 +157,8 @@ { "name": "ExportedUseClearableFieldProps", "kind": "Interface" }, { "name": "extractValidationProps", "kind": "Variable" }, { "name": "FieldFormatTokenMap", "kind": "TypeAlias" }, + { "name": "FieldOwnerState", "kind": "Interface" }, + { "name": "FieldRangeSection", "kind": "Interface" }, { "name": "FieldRef", "kind": "Interface" }, { "name": "FieldSection", "kind": "Interface" }, { "name": "FieldSectionContentType", "kind": "TypeAlias" }, @@ -186,6 +188,7 @@ { "name": "getTimeClockUtilityClass", "kind": "Function" }, { "name": "getYearCalendarUtilityClass", "kind": "Function" }, { "name": "InferError", "kind": "TypeAlias" }, + { "name": "InferFieldSection", "kind": "TypeAlias" }, { "name": "LocalizationProvider", "kind": "Variable" }, { "name": "LocalizationProviderProps", "kind": "Interface" }, { "name": "LocalizedComponent", "kind": "TypeAlias" }, @@ -337,7 +340,6 @@ { "name": "PickerValidDateLookup", "kind": "Interface" }, { "name": "PickerValueType", "kind": "TypeAlias" }, { "name": "PropsFromSlot", "kind": "TypeAlias" }, - { "name": "RangeFieldSection", "kind": "Interface" }, { "name": "RangeFieldSeparatorProps", "kind": "Interface" }, { "name": "RangePosition", "kind": "TypeAlias" }, { "name": "renderDateRangeViewCalendar", "kind": "Variable" }, diff --git a/scripts/x-date-pickers.exports.json b/scripts/x-date-pickers.exports.json index 0a7b338d04d4c..60cb4180bd3c7 100644 --- a/scripts/x-date-pickers.exports.json +++ b/scripts/x-date-pickers.exports.json @@ -105,6 +105,7 @@ { "name": "ExportedUseClearableFieldProps", "kind": "Interface" }, { "name": "extractValidationProps", "kind": "Variable" }, { "name": "FieldFormatTokenMap", "kind": "TypeAlias" }, + { "name": "FieldOwnerState", "kind": "Interface" }, { "name": "FieldRef", "kind": "Interface" }, { "name": "FieldSection", "kind": "Interface" }, { "name": "FieldSectionContentType", "kind": "TypeAlias" }, @@ -125,6 +126,7 @@ { "name": "getTimeClockUtilityClass", "kind": "Function" }, { "name": "getYearCalendarUtilityClass", "kind": "Function" }, { "name": "InferError", "kind": "TypeAlias" }, + { "name": "InferFieldSection", "kind": "TypeAlias" }, { "name": "LocalizationProvider", "kind": "Variable" }, { "name": "LocalizationProviderProps", "kind": "Interface" }, { "name": "LocalizedComponent", "kind": "TypeAlias" }, diff --git a/test/karma.conf.js b/test/karma.conf.js index 87070fd88d443..7b4516a71b7e6 100644 --- a/test/karma.conf.js +++ b/test/karma.conf.js @@ -28,6 +28,12 @@ module.exports = function setKarmaConfig(config) { served: true, included: true, }, + { + pattern: 'test/karma.datagrid.tests.js', + watched: true, + served: true, + included: true, + }, ], plugins: (process.env.PARALLEL === 'true' ? ['karma-parallel'] : []).concat([ 'karma-mocha', @@ -47,6 +53,7 @@ module.exports = function setKarmaConfig(config) { port: 9876, preprocessors: { 'test/karma.tests.js': ['webpack', 'sourcemap'], + 'test/karma.datagrid.tests.js': ['webpack', 'sourcemap'], }, reporters: ['dots'], webpack: { @@ -97,7 +104,7 @@ module.exports = function setKarmaConfig(config) { // to mimic "desktop" environment more correctly we force blink to have `pointer: fine` support // this allows correct pickers behavior, where their rendering depends on this condition // https://github.com/microsoft/playwright/issues/7769#issuecomment-1205106311 - '--blink-settings=primaryPointerType=4', + '--blink-settings=primaryPointerType=4,primaryHoverType=2', // increasing default `800x600` size to certain window sizing cases to consider browser as "mobile" // i.e.: date time pickers do check height > 667 '--window-size=1000,800', diff --git a/test/karma.datagrid.tests.js b/test/karma.datagrid.tests.js new file mode 100644 index 0000000000000..941ad1765d8e0 --- /dev/null +++ b/test/karma.datagrid.tests.js @@ -0,0 +1,25 @@ +/* eslint-env mocha */ +import '@mui/internal-test-utils/setupKarma'; + +import './utils/init'; +import { createXMochaHooks } from './utils/mochaHooks'; + +const mochaHooks = createXMochaHooks(); + +beforeEach(function beforeEachHook() { + mochaHooks.beforeEach.forEach((mochaHook) => { + mochaHook.call(this); + }); +}); + +afterEach(function beforeEachHook() { + mochaHooks.afterEach.forEach((mochaHook) => { + mochaHook.call(this); + }); +}); + +const packagesContext = require.context('../packages', true, /\.test\.tsx$/); +packagesContext + .keys() + .filter((key) => key.includes('x-data-grid')) + .forEach(packagesContext); diff --git a/test/karma.tests.js b/test/karma.tests.js index e041b5849b8cd..2d2401669a76e 100644 --- a/test/karma.tests.js +++ b/test/karma.tests.js @@ -19,4 +19,7 @@ afterEach(function beforeEachHook() { }); const packagesContext = require.context('../packages', true, /\.test\.tsx$/); -packagesContext.keys().forEach(packagesContext); +packagesContext + .keys() + .filter((key) => !key.includes('x-data-grid')) + .forEach(packagesContext); diff --git a/test/package.json b/test/package.json index d212de622c4b8..a1952c65ac15f 100644 --- a/test/package.json +++ b/test/package.json @@ -7,9 +7,9 @@ }, "devDependencies": { "@babel/runtime": "^7.26.0", - "@emotion/cache": "^11.13.1", - "@emotion/react": "^11.13.3", - "@mui/material": "^5.16.7", + "@emotion/cache": "^11.13.5", + "@emotion/react": "^11.13.5", + "@mui/material": "^5.16.9", "@mui/x-charts": "workspace:*", "@mui/x-charts-pro": "workspace:*", "@mui/x-charts-vendor": "workspace:*", @@ -18,13 +18,13 @@ "@mui/x-date-pickers": "workspace:*", "@mui/x-date-pickers-pro": "workspace:*", "@mui/x-license": "workspace:*", - "@playwright/test": "^1.44.1", + "@playwright/test": "^1.49.0", "@react-spring/web": "^9.7.5", "@types/chai": "^4.3.20", "@types/karma": "^6.3.9", "@types/moment-jalaali": "^0.7.9", - "@types/prop-types": "^15.7.13", - "@types/react": "^18.3.12", + "@types/prop-types": "^15.7.14", + "@types/react": "^18.3.14", "@types/semver": "^7.5.8", "chai": "^4.5.0", "dayjs": "^1.11.13", @@ -33,7 +33,7 @@ "prop-types": "^15.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router-dom": "^6.27.0", + "react-router-dom": "^6.28.0", "semver": "^7.6.3", "stylis": "^4.3.4", "stylis-plugin-rtl": "^2.1.1" diff --git a/test/performance-charts/package.json b/test/performance-charts/package.json index 330b0cb2b6713..cd87d8c5f978a 100644 --- a/test/performance-charts/package.json +++ b/test/performance-charts/package.json @@ -8,19 +8,19 @@ }, "devDependencies": { "@codspeed/vitest-plugin": "^3.1.1", - "@emotion/react": "^11.13.3", + "@emotion/react": "^11.13.5", "@mui/x-charts": "workspace:*", "@mui/x-charts-pro": "workspace:*", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.0.1", + "@testing-library/react": "^16.1.0", "@testing-library/user-event": "^14.5.2", - "@vitejs/plugin-react": "^4.3.3", - "@vitejs/plugin-react-swc": "^3.7.1", - "@vitest/browser": "2.1.5", - "@vitest/ui": "2.1.5", - "jsdom": "^24.1.3", + "@vitejs/plugin-react": "^4.3.4", + "@vitejs/plugin-react-swc": "^3.7.2", + "@vitest/browser": "2.1.8", + "@vitest/ui": "2.1.8", + "jsdom": "^25.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "vitest": "2.1.5" + "vitest": "2.1.8" } } diff --git a/test/regressions/index.test.ts b/test/regressions/index.test.ts index 4525f30c908e3..472ba8ee836c8 100644 --- a/test/regressions/index.test.ts +++ b/test/regressions/index.test.ts @@ -17,13 +17,15 @@ const isMaterialUIv6 = materialPackageJson.version.startsWith('6.'); const timeSensitiveSuites = ['ColumnAutosizingAsync', 'DensitySelectorGrid']; const isConsoleWarningIgnored = (msg?: string) => { - if ( - msg && + const isMuiV6Error = isMaterialUIv6 && - msg.startsWith( + msg?.startsWith( 'MUI: The Experimental_CssVarsProvider component has been ported into ThemeProvider.', - ) - ) { + ); + + const isReactRouterFlagsError = msg?.includes('React Router Future Flag Warning'); + + if (isMuiV6Error || isReactRouterFlagsError) { return true; } return false; @@ -34,8 +36,11 @@ async function main() { const screenshotDir = path.resolve(__dirname, './screenshots/chrome'); const browser = await chromium.launch({ - args: ['--font-render-hinting=none'], - // otherwise the loaded google Roboto font isn't applied + args: [ + // We could add the hide-scrollbars flag, which should improve argos + // flaky tests based on the scrollbars. + // '--hide-scrollbars', + ], headless: false, }); // reuse viewport from `vrtest` @@ -114,6 +119,10 @@ async function main() { const pathURL = route.replace(baseUrl, ''); it(`creates screenshots of ${pathURL}`, async function test() { + // Move cursor offscreen to not trigger unwanted hover effects. + // This needs to be done before the navigation to avoid hover and mouse enter/leave effects. + await page.mouse.move(0, 0); + // With the playwright inspector we might want to call `page.pause` which would lead to a timeout. if (process.env.PWDEBUG) { this.timeout(0); @@ -132,8 +141,6 @@ async function main() { await page.reload(); await navigateToTest(index + 1); } - // Move cursor offscreen to not trigger unwanted hover effects. - await page.mouse.move(0, 0); const screenshotPath = path.resolve(screenshotDir, `${route.replace(baseUrl, '.')}.png`); await fse.ensureDir(path.dirname(screenshotPath)); diff --git a/test/utils/pickers/describeGregorianAdapter/testLocalization.ts b/test/utils/pickers/describeGregorianAdapter/testLocalization.ts index a63d1e0cf851d..a36a73198d9b3 100644 --- a/test/utils/pickers/describeGregorianAdapter/testLocalization.ts +++ b/test/utils/pickers/describeGregorianAdapter/testLocalization.ts @@ -20,7 +20,7 @@ export const testLocalization: DescribeGregorianAdapterTestSuite = ({ adapter }) expandedFormat === formatString || (adapter.lib === 'luxon' && formatString === 'ccccc') ) { - // Luxon format 'ccccc' is not supported by the field components since multiple day can have the same one-letter value (e.g: Tuesday and Thursday). + // Luxon format 'ccccc' is not supported by the field components since multiple day can have the same one-letter value (for example: Tuesday and Thursday). // It is used in the calendar header to display the day of the weeks. // Format 'ccccc' is not supported for the field fomrat since multiple day can have the same short // It's used to display calendar days. diff --git a/test/utils/pickers/describeValue/describeValue.tsx b/test/utils/pickers/describeValue/describeValue.tsx index 766fe523f9d0a..7565a92501cfa 100644 --- a/test/utils/pickers/describeValue/describeValue.tsx +++ b/test/utils/pickers/describeValue/describeValue.tsx @@ -1,6 +1,10 @@ import * as React from 'react'; import createDescribe from '@mui/internal-test-utils/createDescribe'; -import { BasePickerInputProps, UsePickerValueNonStaticProps } from '@mui/x-date-pickers/internals'; +import { + BasePickerInputProps, + PickerValidValue, + UsePickerValueNonStaticProps, +} from '@mui/x-date-pickers/internals'; import { buildFieldInteractions, BuildFieldInteractionsResponse } from 'test/utils/pickers'; import { PickerComponentFamily } from '../describe.types'; import { DescribeValueOptions, DescribeValueTestSuite } from './describeValue.types'; @@ -16,7 +20,7 @@ const TEST_SUITES: DescribeValueTestSuite[] = [ testShortcuts, ]; -function innerDescribeValue( +function innerDescribeValue( ElementToTest: React.FunctionComponent, getOptions: () => DescribeValueOptions, ) { @@ -68,19 +72,24 @@ function innerDescribeValue( } TEST_SUITES.forEach((testSuite) => { - testSuite(WrappedElementToTest, { ...options, renderWithProps }); + const typedTestSuite = testSuite as DescribeValueTestSuite; + typedTestSuite(WrappedElementToTest, { ...options, renderWithProps }); }); } -type P = [ +type P = [ React.FunctionComponent, () => DescribeValueOptions, ]; type DescribeValue = { - (...args: P): void; - skip: (...args: P) => void; - only: (...args: P) => void; + (...args: P): void; + skip: ( + ...args: P + ) => void; + only: ( + ...args: P + ) => void; }; /** diff --git a/test/utils/pickers/describeValue/describeValue.types.ts b/test/utils/pickers/describeValue/describeValue.types.ts index 27332ec2b7192..c1cb3b358d3fe 100644 --- a/test/utils/pickers/describeValue/describeValue.types.ts +++ b/test/utils/pickers/describeValue/describeValue.types.ts @@ -1,5 +1,6 @@ import * as React from 'react'; import { createRenderer, MuiRenderResult } from '@mui/internal-test-utils/createRenderer'; +import { InferNonNullablePickerValue, PickerValidValue } from '@mui/x-date-pickers/internals'; import { BuildFieldInteractionsResponse, FieldPressCharacter, @@ -8,11 +9,14 @@ import { } from 'test/utils/pickers'; import { PickerComponentFamily } from '../describe.types'; -interface DescribeValueBaseOptions { +interface DescribeValueBaseOptions< + TValue extends PickerValidValue, + C extends PickerComponentFamily, +> { componentFamily: C; render: (node: React.ReactElement) => MuiRenderResult; assertRenderedValue: (expectedValue: TValue) => void; - values: [TValue, TValue]; + values: [InferNonNullablePickerValue, InferNonNullablePickerValue]; emptyValue: TValue; defaultProps?: object; // TODO: Export `Clock` from monorepo @@ -21,12 +25,12 @@ interface DescribeValueBaseOptions { export type DescribeValueOptions< C extends PickerComponentFamily, - TValue, + TValue extends PickerValidValue, > = DescribeValueBaseOptions & (C extends 'picker' ? OpenPickerParams & { setNewValue: ( - value: TValue, + value: InferNonNullablePickerValue, options: { selectSection: FieldSectionSelector; pressKey: FieldPressCharacter; @@ -34,7 +38,7 @@ export type DescribeValueOptions< applySameValue?: boolean; setEndDate?: boolean; }, - ) => TValue; + ) => InferNonNullablePickerValue; } : { setNewValue: ( @@ -43,7 +47,10 @@ export type DescribeValueOptions< ) => TValue; }); -export type DescribeValueTestSuite = ( +export type DescribeValueTestSuite< + TValue extends PickerValidValue, + C extends PickerComponentFamily, +> = ( ElementToTest: React.FunctionComponent, options: DescribeValueOptions & { renderWithProps: BuildFieldInteractionsResponse['renderWithProps']; diff --git a/test/utils/pickers/describeValue/testPickerActionBar.tsx b/test/utils/pickers/describeValue/testPickerActionBar.tsx index c223c52d2331c..7497f806866c1 100644 --- a/test/utils/pickers/describeValue/testPickerActionBar.tsx +++ b/test/utils/pickers/describeValue/testPickerActionBar.tsx @@ -2,6 +2,7 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; import { fireEvent, screen } from '@mui/internal-test-utils'; +import { PickerRangeValue } from '@mui/x-date-pickers/internals'; import { adapterToUse, getExpectedOnChangeCount, @@ -106,7 +107,7 @@ export const testPickerActionBar: DescribeValueTestSuite = ( getExpectedOnChangeCount(componentFamily, pickerParams) + 1, ); if (isRangeType) { - values[0].forEach((value, index) => { + (values[0] as PickerRangeValue).forEach((value, index) => { expect(onChange.lastCall.args[0][index]).toEqualDateTime(value); }); } else { diff --git a/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx b/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx index 9896bd8da9473..8a5601814ce2f 100644 --- a/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx +++ b/test/utils/pickers/describeValue/testPickerOpenCloseLifeCycle.tsx @@ -2,11 +2,12 @@ import * as React from 'react'; import { expect } from 'chai'; import { spy } from 'sinon'; import { fireEvent, screen } from '@mui/internal-test-utils'; +import { PickerRangeValue, PickerValidValue } from '@mui/x-date-pickers/internals'; import { getExpectedOnChangeCount, getFieldInputRoot, openPicker } from 'test/utils/pickers'; import { DescribeValueTestSuite } from './describeValue.types'; import { fireUserEvent } from '../../fireUserEvent'; -export const testPickerOpenCloseLifeCycle: DescribeValueTestSuite = ( +export const testPickerOpenCloseLifeCycle: DescribeValueTestSuite = ( ElementToTest, options, ) => { @@ -78,7 +79,7 @@ export const testPickerOpenCloseLifeCycle: DescribeValueTestSuite selectSection, pressKey, }); - newValue.forEach((value, index) => { + (newValue as PickerRangeValue).forEach((value, index) => { expect(onChange.lastCall.args[0][index]).toEqualDateTime(value); }); } else { @@ -136,7 +137,7 @@ export const testPickerOpenCloseLifeCycle: DescribeValueTestSuite selectSection, pressKey, }); - newValue.forEach((value, index) => { + (newValue as PickerRangeValue).forEach((value, index) => { expect(onChange.lastCall.args[0][index]).toEqualDateTime(value); }); } else { @@ -212,7 +213,7 @@ export const testPickerOpenCloseLifeCycle: DescribeValueTestSuite selectSection, pressKey, }); - newValue.forEach((value, index) => { + (newValue as PickerRangeValue).forEach((value, index) => { expect(onChange.lastCall.args[0][index]).toEqualDateTime(value); }); } else { @@ -235,7 +236,7 @@ export const testPickerOpenCloseLifeCycle: DescribeValueTestSuite selectSection, pressKey, }); - newValueBis.forEach((value, index) => { + (newValueBis as PickerRangeValue).forEach((value, index) => { expect(onChange.lastCall.args[0][index]).toEqualDateTime(value); }); } else { @@ -277,7 +278,7 @@ export const testPickerOpenCloseLifeCycle: DescribeValueTestSuite expect(onChange.callCount).to.equal(getExpectedOnChangeCount(componentFamily, pickerParams)); expect(onAccept.callCount).to.equal(1); if (isRangeType) { - newValue.forEach((value, index) => { + (newValue as PickerRangeValue).forEach((value, index) => { expect(onChange.lastCall.args[0][index]).toEqualDateTime(value); }); } else { diff --git a/test/utils/pickers/fields.tsx b/test/utils/pickers/fields.tsx index 5b552398c467b..052d39f1e032a 100644 --- a/test/utils/pickers/fields.tsx +++ b/test/utils/pickers/fields.tsx @@ -2,9 +2,10 @@ import * as React from 'react'; import { expect } from 'chai'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { createRenderer, screen, act, fireEvent } from '@mui/internal-test-utils'; -import { FieldRef, FieldSection, FieldSectionType } from '@mui/x-date-pickers/models'; +import { FieldRef, FieldSectionType } from '@mui/x-date-pickers/models'; import { pickersSectionListClasses } from '@mui/x-date-pickers/PickersSectionList'; import { pickersInputBaseClasses } from '@mui/x-date-pickers/PickersTextField'; +import { PickerValue } from '@mui/x-date-pickers/internals'; import { fireUserEvent } from '../fireUserEvent'; import { expectFieldValueV7, expectFieldValueV6 } from './assertions'; @@ -88,10 +89,10 @@ export const buildFieldInteractions =

({ props, { hook, componentFamily = 'field', direction = 'ltr' } = {}, ) => { - let fieldRef: React.RefObject> = { current: null }; + let fieldRef: React.RefObject> = { current: null }; function WrappedComponent(propsFromRender: any) { - fieldRef = React.useRef>(null); + fieldRef = React.useRef>(null); const hookResult = hook?.(propsFromRender); const allProps = {