From 1bcdd71a26894a27757b0b87cfdd4b0354298964 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 20:54:53 +0000 Subject: [PATCH 001/230] Update thollander/actions-comment-pull-request action to v3 --- .github/workflows/__job_messages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/__job_messages.yml b/.github/workflows/__job_messages.yml index db39f1dca2..c61bae4c67 100644 --- a/.github/workflows/__job_messages.yml +++ b/.github/workflows/__job_messages.yml @@ -57,7 +57,7 @@ jobs: echo "EOF" >> $GITHUB_ENV - name: Push comment to Pull Request 🔼 - uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0 + uses: thollander/actions-comment-pull-request@e2c37e53a7d2227b61585343765f73a9ca57eda9 # v3.0.0 if: ${{ inputs.comment && steps.compose.conclusion == 'success' }} with: GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }} From 33663d4b73cc641ae7c24522141730c28de30284 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 14 Oct 2024 12:29:15 -0400 Subject: [PATCH 002/230] Rollback to dompurify v2 for legacy support --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ebb47e5c3..8bf87c139c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "classnames": "2.5.1", "core-js": "3.38.1", "date-fns": "2.30.0", - "dompurify": "3.0.1", + "dompurify": "2.5.7", "epubjs": "0.3.93", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", @@ -10191,9 +10191,9 @@ ] }, "node_modules/dompurify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.1.tgz", - "integrity": "sha512-60tsgvPKwItxZZdfLmamp0MTcecCta3avOhsLgPZ0qcWt96OasFfhkeIRbJ6br5i0fQawT1/RBGB5L58/Jpwuw==" + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.7.tgz", + "integrity": "sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q==" }, "node_modules/domutils": { "version": "1.7.0", @@ -32794,9 +32794,9 @@ } }, "dompurify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.1.tgz", - "integrity": "sha512-60tsgvPKwItxZZdfLmamp0MTcecCta3avOhsLgPZ0qcWt96OasFfhkeIRbJ6br5i0fQawT1/RBGB5L58/Jpwuw==" + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.7.tgz", + "integrity": "sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q==" }, "domutils": { "version": "1.7.0", diff --git a/package.json b/package.json index 664ad179c4..536717b049 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "classnames": "2.5.1", "core-js": "3.38.1", "date-fns": "2.30.0", - "dompurify": "3.0.1", + "dompurify": "2.5.7", "epubjs": "0.3.93", "escape-html": "1.0.3", "fast-text-encoding": "1.0.6", From d9ad1bdd5e11020091c2764f7a81bb8a87e9c6d2 Mon Sep 17 00:00:00 2001 From: Habibur Rahman Date: Mon, 14 Oct 2024 14:56:24 +0000 Subject: [PATCH 003/230] Translated using Weblate (Bengali (Bangladesh)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/bn_BD/ --- src/strings/bn_BD.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/bn_BD.json b/src/strings/bn_BD.json index c7a4e8f65e..8c62424b6b 100644 --- a/src/strings/bn_BD.json +++ b/src/strings/bn_BD.json @@ -331,5 +331,10 @@ "AllowContentWithTagsHelp": "শুধুমাত্র নির্দিষ্ট ট্যাগগুলির মধ্যে অন্তত একটি সহ মিডিয়া দেখান।", "Alternate": "বিকল্প", "AllowSubtitleManagement": "এই ব্যবহারকারীকে সাবটাইটেল সম্পাদনা করার অনুমতি দিন", - "AllowFmp4TranscodingContainerHelp": "HEVC এবং HDR বিষয়বস্তু সক্ষম করতে এই টিউনারটির জন্য fMP4 ট্রান্সকোডিং কন্টেইনারকে অনুমতি দিন। সমস্ত টিউনার এই ধারকটির সাথে সামঞ্জস্যপূর্ণ নয়৷ আপনি যদি প্লেব্যাক সমস্যা অনুভব করেন তবে এটি অক্ষম করুন।" + "AllowFmp4TranscodingContainerHelp": "HEVC এবং HDR বিষয়বস্তু সক্ষম করতে এই টিউনারটির জন্য fMP4 ট্রান্সকোডিং কন্টেইনারকে অনুমতি দিন। সমস্ত টিউনার এই ধারকটির সাথে সামঞ্জস্যপূর্ণ নয়৷ আপনি যদি প্লেব্যাক সমস্যা অনুভব করেন তবে এটি অক্ষম করুন।", + "AllowStreamSharingHelp": "জেলিফিনকে টিউনার থেকে mpegts স্ট্রীম ডুপ্লিকেট করার অনুমতি দিন এবং এই ডুপ্লিকেট স্ট্রীমটি ক্লায়েন্টদের সাথে শেয়ার করুন।যখন টিউনারে মোট স্ট্রিম গণনা সীমাবদ্ধ থাকে কিন্তু প্লেব্যাকের সমস্যাও হতে পারে তখন এটি উপযোগী।", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "ট্রান্সকোডিং ট্রিগার হলে সমস্ত সাবটাইটেল বার্ন করুন। এটি কম ট্রান্সকোডিং গতির খরচে ট্রান্সকোডিংয়ের পরে সাবটাইটেল সিঙ্ক্রোনাইজেশন নিশ্চিত করে।এটি কম ট্রান্সকোডিং গতির খরচে ট্রান্সকোডিংয়ের পরে সাবটাইটেল সিঙ্ক্রোনাইজেশন নিশ্চিত করে।", + "AlternateDVD": "বিকল্প DVD", + "LabelThrottleDelaySeconds": "থ্রটল পরে", + "AlwaysBurnInSubtitleWhenTranscoding": "ট্রান্সকোড করার সময় সর্বদা সাবটাইটেল বার্ন করুন" } From 016fc1fdba7206c61e2a279b4eed980a9ae097cf Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 14 Oct 2024 13:20:52 -0400 Subject: [PATCH 004/230] Disable dompurify major updates from renovate --- .github/renovate.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/renovate.json b/.github/renovate.json index 200d5e43e7..2fc0eb8728 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -10,6 +10,11 @@ "followTag": "unstable", "minimumReleaseAge": null, "schedule": [ "after 7:00 am" ] + }, + { + "matchPackageNames": ["dompurify"], + "matchUpdateTypes": ["major"], + "enabled": false } ] } From 7c9d56f0f8db07b07da8266a3ea922f41ee926d2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:45:52 +0000 Subject: [PATCH 005/230] Update dependency @jellyfin/sdk to v0.0.0-unstable.202410140501 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8bf87c139c..bac17d45cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410130501", + "@jellyfin/sdk": "0.0.0-unstable.202410140501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", @@ -5062,9 +5062,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202410130501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410130501.tgz", - "integrity": "sha512-+JUq2p0kvZVfBSg3TSoLfSwrPaMX6d0GY/6XbTXfJ9h6p80mmCCnZXR5cyRTFhfZSxDuvZ36R/i1p5kiukXFMw==", + "version": "0.0.0-unstable.202410140501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410140501.tgz", + "integrity": "sha512-3Qd7Zg7jC+q7TgWmWPXUL8g67TjKMbT8CyYo99Kzj9BbuvY33hHXsju/KIVx3B2tfPXzfBawso44g51zlJ5rwQ==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -29284,9 +29284,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202410130501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410130501.tgz", - "integrity": "sha512-+JUq2p0kvZVfBSg3TSoLfSwrPaMX6d0GY/6XbTXfJ9h6p80mmCCnZXR5cyRTFhfZSxDuvZ36R/i1p5kiukXFMw==", + "version": "0.0.0-unstable.202410140501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410140501.tgz", + "integrity": "sha512-3Qd7Zg7jC+q7TgWmWPXUL8g67TjKMbT8CyYo99Kzj9BbuvY33hHXsju/KIVx3B2tfPXzfBawso44g51zlJ5rwQ==", "requires": {} }, "@jridgewell/gen-mapping": { diff --git a/package.json b/package.json index 536717b049..a16e6d4700 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410130501", + "@jellyfin/sdk": "0.0.0-unstable.202410140501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", From 949df873d1c72dbb8b58a2f1c8d8999056b279eb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 18:05:27 +0000 Subject: [PATCH 006/230] Update github/codeql-action action to v3.26.13 --- .github/workflows/__codeql.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/__codeql.yml b/.github/workflows/__codeql.yml index e8de9337de..adfdb3bdc3 100644 --- a/.github/workflows/__codeql.yml +++ b/.github/workflows/__codeql.yml @@ -26,15 +26,15 @@ jobs: show-progress: false - name: Initialize CodeQL 🛠️ - uses: github/codeql-action/init@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 + uses: github/codeql-action/init@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 with: queries: security-and-quality languages: ${{ matrix.language }} - name: Autobuild 📦 - uses: github/codeql-action/autobuild@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 + uses: github/codeql-action/autobuild@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 - name: Perform CodeQL Analysis 🧪 - uses: github/codeql-action/analyze@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 + uses: github/codeql-action/analyze@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 with: category: '/language:${{matrix.language}}' From 12995545b9cdccab91b8007b3ce6841ecc0b440c Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Mon, 23 Sep 2024 02:53:44 +0300 Subject: [PATCH 007/230] Refactoring Section Container --- .../library/GenresItemsContainer.tsx | 31 ++-- .../library/GenresSectionContainer.tsx | 11 +- .../components/library/ItemsView.tsx | 2 +- .../library/ProgramsSectionView.tsx | 36 +++-- .../components/library/SectionContainer.tsx | 65 -------- .../library/SuggestionsSectionView.tsx | 30 ++-- .../components/library/UpcomingView.tsx | 67 ++++---- src/components/common/NoItemsMessage.tsx | 10 +- src/components/common/SectionContainer.tsx | 145 ++++++++++++++++++ .../emby-itemscontainer/ItemsContainer.tsx | 5 +- src/elements/emby-scroller/Scroller.tsx | 38 ++--- 11 files changed, 257 insertions(+), 183 deletions(-) delete mode 100644 src/apps/experimental/components/library/SectionContainer.tsx create mode 100644 src/components/common/SectionContainer.tsx diff --git a/src/apps/experimental/components/library/GenresItemsContainer.tsx b/src/apps/experimental/components/library/GenresItemsContainer.tsx index de7f5b5348..ee77eeef2a 100644 --- a/src/apps/experimental/components/library/GenresItemsContainer.tsx +++ b/src/apps/experimental/components/library/GenresItemsContainer.tsx @@ -2,7 +2,7 @@ import type { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/bas import type { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; import React, { FC } from 'react'; import { useGetGenres } from 'hooks/useFetchItems'; -import globalize from 'lib/globalize'; +import NoItemsMessage from 'components/common/NoItemsMessage'; import Loading from 'components/loading/LoadingComponent'; import GenresSectionContainer from './GenresSectionContainer'; import type { ParentId } from 'types/library'; @@ -25,27 +25,18 @@ const GenresItemsContainer: FC = ({ } if (!genresResult?.Items?.length) { - return ( -
-

{globalize.translate('MessageNothingHere')}

-

{globalize.translate('MessageNoGenresAvailable')}

-
- ); + return ; } - return ( - <> - {genresResult.Items.map((genre) => ( - - ))} - - ); + return genresResult.Items.map((genre) => ( + + )); }; export default GenresItemsContainer; diff --git a/src/apps/experimental/components/library/GenresSectionContainer.tsx b/src/apps/experimental/components/library/GenresSectionContainer.tsx index 0cef257a88..08083ac620 100644 --- a/src/apps/experimental/components/library/GenresSectionContainer.tsx +++ b/src/apps/experimental/components/library/GenresSectionContainer.tsx @@ -8,7 +8,7 @@ import React, { type FC } from 'react'; import { useGetItems } from 'hooks/useFetchItems'; import Loading from 'components/loading/LoadingComponent'; import { appRouter } from 'components/router/appRouter'; -import SectionContainer from './SectionContainer'; +import SectionContainer from 'components/common/SectionContainer'; import { CardShape } from 'utils/card'; import type { ParentId } from 'types/library'; import type { ItemDto } from 'types/base/models/item-dto'; @@ -59,9 +59,12 @@ const GenresSectionContainer: FC = ({ } return = ({ const getItems = useCallback(() => { if (!itemsResult?.Items?.length) { - return ; + return ; } if (libraryViewSettings.ViewMode === ViewMode.ListView) { diff --git a/src/apps/experimental/components/library/ProgramsSectionView.tsx b/src/apps/experimental/components/library/ProgramsSectionView.tsx index 33accce51b..4217720e73 100644 --- a/src/apps/experimental/components/library/ProgramsSectionView.tsx +++ b/src/apps/experimental/components/library/ProgramsSectionView.tsx @@ -3,7 +3,8 @@ import { useGetProgramsSectionsWithItems, useGetTimers } from 'hooks/useFetchIte import { appRouter } from 'components/router/appRouter'; import globalize from 'lib/globalize'; import Loading from 'components/loading/LoadingComponent'; -import SectionContainer from './SectionContainer'; +import NoItemsMessage from 'components/common/NoItemsMessage'; +import SectionContainer from 'components/common/SectionContainer'; import { CardShape } from 'utils/card'; import type { ParentId } from 'types/library'; import type { Section, SectionType } from 'types/sections'; @@ -30,14 +31,7 @@ const ProgramsSectionView: FC = ({ } if (!sectionsWithItems?.length && !upcomingRecordings?.length) { - return ( -
-

{globalize.translate('MessageNothingHere')}

-

- {globalize.translate('MessageNoItemsAvailable')} -

-
- ); + return ; } const getRouteUrl = (section: Section) => { @@ -58,23 +52,33 @@ const ProgramsSectionView: FC = ({ {sectionsWithItems?.map(({ section, items }) => ( - ))} {upcomingRecordings?.map((group) => ( void; -} - -const SectionContainer: FC = ({ - sectionTitle, - url, - items, - cardOptions, - reloadItems -}) => { - return ( -
-
- {url && items.length > 5 ? ( - -

- {sectionTitle} -

- -
- ) : ( -

- {sectionTitle} -

- )} -
- - - - - - -
- ); -}; - -export default SectionContainer; diff --git a/src/apps/experimental/components/library/SuggestionsSectionView.tsx b/src/apps/experimental/components/library/SuggestionsSectionView.tsx index 9dc480e98c..c036451e7f 100644 --- a/src/apps/experimental/components/library/SuggestionsSectionView.tsx +++ b/src/apps/experimental/components/library/SuggestionsSectionView.tsx @@ -8,7 +8,8 @@ import { import { appRouter } from 'components/router/appRouter'; import globalize from 'lib/globalize'; import Loading from 'components/loading/LoadingComponent'; -import SectionContainer from './SectionContainer'; +import NoItemsMessage from 'components/common/NoItemsMessage'; +import SectionContainer from '../../../../components/common/SectionContainer'; import { CardShape } from 'utils/card'; import type { ParentId } from 'types/library'; import type { Section, SectionType } from 'types/sections'; @@ -38,12 +39,7 @@ const SuggestionsSectionView: FC = ({ } if (!sectionsWithItems?.length && !movieRecommendationsItems?.length) { - return ( -
-

{globalize.translate('MessageNothingHere')}

-

{globalize.translate('MessageNoItemsAvailable')}

-
- ); + return ; } const getRouteUrl = (section: Section) => { @@ -96,9 +92,14 @@ const SuggestionsSectionView: FC = ({ {sectionsWithItems?.map(({ section, items }) => ( = ({ = ({ parentId }) => { - const { isLoading, data: groupsUpcomingEpisodes } = useGetGroupsUpcomingEpisodes(parentId); + const { isLoading, data: groupsUpcomingEpisodes } = + useGetGroupsUpcomingEpisodes(parentId); if (isLoading) return ; - return ( - - {!groupsUpcomingEpisodes?.length ? ( -
-

{globalize.translate('MessageNothingHere')}

-

- {globalize.translate( - 'MessagePleaseEnsureInternetMetadata' - )} -

-
- ) : ( - groupsUpcomingEpisodes?.map((group) => ( - - )) - )} -
- ); + if (!groupsUpcomingEpisodes?.length) { + return ; + } + + return groupsUpcomingEpisodes?.map((group) => ( + + )); }; export default UpcomingView; diff --git a/src/components/common/NoItemsMessage.tsx b/src/components/common/NoItemsMessage.tsx index 1098039e55..9f02703b96 100644 --- a/src/components/common/NoItemsMessage.tsx +++ b/src/components/common/NoItemsMessage.tsx @@ -4,19 +4,19 @@ import Typography from '@mui/material/Typography'; import globalize from 'lib/globalize'; interface NoItemsMessageProps { - noItemsMessage?: string; + message?: string; } const NoItemsMessage: FC = ({ - noItemsMessage = 'MessageNoItemsAvailable' + message = 'MessageNoItemsAvailable' }) => { return ( - + {globalize.translate('MessageNothingHere')} - - {globalize.translate(noItemsMessage)} + + {globalize.translate(message)} ); diff --git a/src/components/common/SectionContainer.tsx b/src/components/common/SectionContainer.tsx new file mode 100644 index 0000000000..3b5af60640 --- /dev/null +++ b/src/components/common/SectionContainer.tsx @@ -0,0 +1,145 @@ +import React, { type FC, type PropsWithChildren } from 'react'; +import Box from '@mui/material/Box'; +import Link from '@mui/material/Link'; +import Typography from '@mui/material/Typography'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import classNames from 'classnames'; +import ItemsContainer, { + type ItemsContainerProps +} from 'elements/emby-itemscontainer/ItemsContainer'; +import Scroller, { type ScrollerProps } from 'elements/emby-scroller/Scroller'; +import Cards from 'components/cardbuilder/Card/Cards'; +import Lists from 'components/listview/List/Lists'; +import type { CardOptions } from 'types/cardOptions'; +import type { ListOptions } from 'types/listOptions'; +import type { ItemDto } from 'types/base/models/item-dto'; + +interface SectionHeaderProps { + className?: string; + itemsLength?: number; + url?: string; + title: string; +} + +const SectionHeader: FC = ({ + title, + className, + itemsLength = 0, + url +}) => { + const sectionHeaderClass = classNames( + 'sectionTitleContainer sectionTitleContainer-cards', + 'padded-left', + className + ); + + return ( + + {url && itemsLength > 5 ? ( + + + {title} + + + + ) : ( + + {title} + + )} + + ); +}; + +interface SectionContainerProps { + className?: string; + items?: ItemDto[]; + sectionHeaderProps?: Omit; + scrollerProps?: ScrollerProps; + itemsContainerProps?: ItemsContainerProps; + isListMode?: boolean; + isScrollerMode?: boolean; + noPadding?: boolean; + cardOptions?: CardOptions; + listOptions?: ListOptions; +} + +const SectionContainer: FC> = ({ + className, + sectionHeaderProps, + scrollerProps, + itemsContainerProps, + isListMode = false, + isScrollerMode = true, + noPadding = false, + items = [], + cardOptions = {}, + listOptions = {}, + children +}) => { + const sectionClass = classNames('verticalSection', className); + + const renderItems = () => { + if (React.isValidElement(children)) { + return children; + } + + if (isListMode && !isScrollerMode) { + return ; + } else { + return ; + } + }; + + const content = ( + + {renderItems()} + + ); + + return ( + + {sectionHeaderProps?.title && ( + + )} + {isScrollerMode && !isListMode ? ( + + {content} + + ) : ( + content + )} + + ); +}; + +export default SectionContainer; diff --git a/src/elements/emby-itemscontainer/ItemsContainer.tsx b/src/elements/emby-itemscontainer/ItemsContainer.tsx index b247d63a6c..04a90a06a5 100644 --- a/src/elements/emby-itemscontainer/ItemsContainer.tsx +++ b/src/elements/emby-itemscontainer/ItemsContainer.tsx @@ -36,7 +36,7 @@ function getShortcutOptions() { }; } -interface ItemsContainerProps { +export interface ItemsContainerProps { className?: string; isContextMenuEnabled?: boolean; isMultiSelectEnabled?: boolean; @@ -136,14 +136,13 @@ const ItemsContainer: FC> = ({ } if (!itemId) throw new Error('null itemId'); - if (!newIndex) throw new Error('null newIndex'); try { loading.show(); await playlistsMoveItemMutation({ playlistId, itemId, - newIndex + newIndex: newIndex || 0 }); loading.hide(); } catch (error) { diff --git a/src/elements/emby-scroller/Scroller.tsx b/src/elements/emby-scroller/Scroller.tsx index 666935d66e..d50d4d61b6 100644 --- a/src/elements/emby-scroller/Scroller.tsx +++ b/src/elements/emby-scroller/Scroller.tsx @@ -9,7 +9,7 @@ import ScrollerFactory from 'lib/scroller'; import ScrollButtons from '../emby-scrollbuttons/ScrollButtons'; import './emby-scroller.scss'; -interface ScrollerProps { +export interface ScrollerProps { className?: string; isHorizontalEnabled?: boolean; isMouseWheelEnabled?: boolean; @@ -23,14 +23,14 @@ interface ScrollerProps { const Scroller: FC> = ({ className, - isHorizontalEnabled, - isMouseWheelEnabled, - isCenterFocusEnabled, - isScrollButtonsEnabled, - isSkipFocusWhenVisibleEnabled, - isScrollEventEnabled, - isHideScrollbarEnabled, - isAllowNativeSmoothScrollEnabled, + isHorizontalEnabled = true, + isMouseWheelEnabled = false, + isCenterFocusEnabled = false, + isScrollButtonsEnabled = true, + isSkipFocusWhenVisibleEnabled = false, + isScrollEventEnabled = false, + isHideScrollbarEnabled = false, + isAllowNativeSmoothScrollEnabled = false, children }) => { const [scrollRef, size] = useElementSize(); @@ -158,27 +158,23 @@ const Scroller: FC> = ({ return; } - const horizontal = isHorizontalEnabled !== false; - const scrollbuttons = isScrollButtonsEnabled !== false; - const mousewheel = isMouseWheelEnabled !== false; - - const enableScrollButtons = layoutManager.desktop && horizontal && scrollbuttons; + const enableScrollButtons = layoutManager.desktop && isHorizontalEnabled && isScrollButtonsEnabled; const options = { - horizontal: horizontal, + horizontal: isHorizontalEnabled, mouseDragging: 1, - mouseWheel: mousewheel, + mouseWheel: isMouseWheelEnabled, touchDragging: 1, slidee: scrollRef.current?.querySelector('.scrollSlider'), scrollBy: 200, - speed: horizontal ? 270 : 240, + speed: isHorizontalEnabled ? 270 : 240, elasticBounds: 1, dragHandle: 1, autoImmediate: true, - skipSlideToWhenVisible: isSkipFocusWhenVisibleEnabled === true, - dispatchScrollEvent: enableScrollButtons || isScrollEventEnabled === true, - hideScrollbar: enableScrollButtons || isHideScrollbarEnabled === true, - allowNativeSmoothScroll: isAllowNativeSmoothScrollEnabled === true && !enableScrollButtons, + skipSlideToWhenVisible: isSkipFocusWhenVisibleEnabled, + dispatchScrollEvent: enableScrollButtons || isScrollEventEnabled, + hideScrollbar: enableScrollButtons || isHideScrollbarEnabled, + allowNativeSmoothScroll: isAllowNativeSmoothScrollEnabled && !enableScrollButtons, allowNativeScroll: !enableScrollButtons, forceHideScrollbars: enableScrollButtons, // In edge, with the native scroll, the content jumps around when hovering over the buttons From 47995ae9a1a5bec99aaa20e37e61043e57e4fc6a Mon Sep 17 00:00:00 2001 From: grafixeyehero Date: Mon, 23 Sep 2024 22:30:20 +0300 Subject: [PATCH 008/230] apply suggestion Co-authored-by: Bill Thornton --- .../experimental/components/library/ProgramsSectionView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/experimental/components/library/ProgramsSectionView.tsx b/src/apps/experimental/components/library/ProgramsSectionView.tsx index 4217720e73..d1a7bfdb8a 100644 --- a/src/apps/experimental/components/library/ProgramsSectionView.tsx +++ b/src/apps/experimental/components/library/ProgramsSectionView.tsx @@ -78,7 +78,7 @@ const ProgramsSectionView: FC = ({ queryKey: ['Timers'], reloadItems: refetch }} - items={group.timerInfo } + items={group.timerInfo} cardOptions={{ queryKey: ['Timers'], shape: CardShape.BackdropOverflow, From 1eb5667d0e5bec249227e5d6ed61e89c2009d0be Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:43:38 +0000 Subject: [PATCH 009/230] Update dependency @jellyfin/sdk to v0.0.0-unstable.202410150501 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index bac17d45cd..1e9f554c41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410140501", + "@jellyfin/sdk": "0.0.0-unstable.202410150501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", @@ -5062,9 +5062,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202410140501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410140501.tgz", - "integrity": "sha512-3Qd7Zg7jC+q7TgWmWPXUL8g67TjKMbT8CyYo99Kzj9BbuvY33hHXsju/KIVx3B2tfPXzfBawso44g51zlJ5rwQ==", + "version": "0.0.0-unstable.202410150501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410150501.tgz", + "integrity": "sha512-lFjr36t6aw2c+4qpxIHNFXS/o+yHNqdKrwdV27KkA9X+vKr6CAvlVH2s3DwCy9tEYaPHHgn2MBJbah2OpYpHmw==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -29284,9 +29284,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202410140501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410140501.tgz", - "integrity": "sha512-3Qd7Zg7jC+q7TgWmWPXUL8g67TjKMbT8CyYo99Kzj9BbuvY33hHXsju/KIVx3B2tfPXzfBawso44g51zlJ5rwQ==", + "version": "0.0.0-unstable.202410150501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410150501.tgz", + "integrity": "sha512-lFjr36t6aw2c+4qpxIHNFXS/o+yHNqdKrwdV27KkA9X+vKr6CAvlVH2s3DwCy9tEYaPHHgn2MBJbah2OpYpHmw==", "requires": {} }, "@jridgewell/gen-mapping": { diff --git a/package.json b/package.json index a16e6d4700..b2a2d1b7d7 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410140501", + "@jellyfin/sdk": "0.0.0-unstable.202410150501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", From 4d9ad8381fe8a11cdf3e9589228241c35366ff7f Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 15 Oct 2024 11:44:14 -0400 Subject: [PATCH 010/230] Add hack to prevent rerendering legacy views in development --- src/components/viewManager/ViewManagerPage.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/viewManager/ViewManagerPage.tsx b/src/components/viewManager/ViewManagerPage.tsx index 72c05511b7..ada011a365 100644 --- a/src/components/viewManager/ViewManagerPage.tsx +++ b/src/components/viewManager/ViewManagerPage.tsx @@ -1,5 +1,5 @@ import { Action } from 'history'; -import { FunctionComponent, useEffect } from 'react'; +import { FunctionComponent, useEffect, useRef } from 'react'; import { useLocation, useNavigationType } from 'react-router-dom'; import globalize from 'lib/globalize'; @@ -58,6 +58,13 @@ const ViewManagerPage: FunctionComponent = ({ isThemeMediaSupported = false, transition }) => { + /** + * HACK: This is a hack to workaround intentional behavior in React strict mode when running in development. + * Legacy views will break if loaded twice so we need to avoid that. This will likely stop working in React 19. + * refs: https://stackoverflow.com/a/72238236 + */ + const isLoaded = useRef(false); + const location = useLocation(); const navigationType = useNavigationType(); @@ -91,9 +98,13 @@ const ViewManagerPage: FunctionComponent = ({ }); }; - loadPage(); + if (!isLoaded.current) loadPage(); + + return () => { + isLoaded.current = true; + }; }, - // location.state and navigationType are NOT included as dependencies here since dialogs will update state while the current view stays the same + // location.state and navigationType are NOT included as dependencies here since dialogs will update state while the current view stays the same // eslint-disable-next-line react-hooks/exhaustive-deps [ controller, From f57c089ae27c9c86dec9eb7639454a4d3164f13b Mon Sep 17 00:00:00 2001 From: Bas <44002186+854562@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:34:34 +0000 Subject: [PATCH 011/230] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index fa4749b51f..d80999d8ea 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -221,7 +221,7 @@ "HeaderAdmin": "Beheer", "HeaderAlbumArtists": "Albumartiesten", "HeaderAlert": "Waarschuwing", - "HeaderAllowMediaDeletionFrom": "Media verwijderen toestaan van", + "HeaderAllowMediaDeletionFrom": "Media verwijderen toestaan uit", "HeaderApiKey": "API-sleutel", "HeaderApiKeys": "API-sleutels", "HeaderApiKeysHelp": "Externe applicaties zijn verplicht om een API-sleutel te hebben om te communiceren met de server. Sleutels kunnen verkregen worden door in te loggen met een Jellyfin-account, of door er handmatig een te verlenen.", @@ -1244,7 +1244,7 @@ "LabelLibraryPageSize": "Paginagrootte bibliotheek", "LabelDroppedFrames": "Verloren frames", "LabelDeinterlaceMethod": "Methode voor de-interliniëring", - "LabelCorruptedFrames": "Corrupte frames", + "LabelCorruptedFrames": "Beschadigde frames", "HeaderNavigation": "Navigatie", "Episode": "Aflevering", "Season": "Seizoen", @@ -1442,7 +1442,7 @@ "PreferFmp4HlsContainerHelp": "Gebruik fMP4 als de standaardcontainer voor HLS, waardoor direct streamen van HEVC- en AV1-inhoud op ondersteunde apparaten mogelijk wordt.", "PreferFmp4HlsContainer": "fMP4-HLS-mediacontainer verkiezen", "LabelSyncPlayInfo": "SyncPlay-informatie", - "LabelOriginalMediaInfo": "Oorspronkelijke media-informatie", + "LabelOriginalMediaInfo": "Informatie oorspronkelijke media", "LabelRemuxingInfo": "Remux-informatie", "LabelDirectStreamingInfo": "Informatie direct streamen", "LabelTranscodingInfo": "Transcoderingsinformatie", @@ -1453,7 +1453,7 @@ "RemuxHelp1": "De media bevindt zich in een niet-ondersteunde bestandscontainer (MKV, AVI, WMV, etc.), maar zowel de beeld- als geluidsstream zijn compatibel met het apparaat. De media zal direct zonder kwaliteitsverlies verpakt worden voordat deze naar het apparaat wordt gestuurd.", "Remuxing": "Remuxen", "AspectRatioFill": "Vullen", - "AspectRatioCover": "Hoes", + "AspectRatioCover": "Bijsnijden", "PluginFromRepo": "{0} uit repository {1}", "LabelUDPPortRangeHelp": "Beperk Jellyfin om dit poortbereik te gebruiken bij het maken van UDP-verbindingen. (Standaard is 1024 - 65535).
Opmerking: voor bepaalde functies zijn vaste poorten vereist die mogelijk buiten dit bereik vallen.", "LabelUDPPortRange": "UDP-communicatiebereik", @@ -1900,7 +1900,7 @@ "LabelSelectPreferredTranscodeVideoCodec": "Gewenste beeldcodec voor transcoderen", "SelectPreferredTranscodeVideoCodecHelp": "Selecteer de gewenste beeldcodec om naartoe te transcoderen. Als de voorkeurscodec niet wordt ondersteund, gebruikt de server de beste codec die wel beschikbaar is.", "HeaderNextItem": "Volgende {0}", - "HeaderNextItemPlayingInValue": "Volgende {0} afspelen over {1}", + "HeaderNextItemPlayingInValue": "Volgende {0} over {1}", "LabelEnablePlugin": "Plug-in inschakelen", "LabelInstalled": "Geïnstalleerd", "LabelNotInstalled": "Niet geïnstalleerd", From a133a33a00e48af088ce6ef3b9bd89ffc4fe95c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20TISON?= <13355624+Airthee@users.noreply.github.com> Date: Tue, 15 Oct 2024 22:22:10 +0200 Subject: [PATCH 012/230] Add unit tests for utils (#5412) * add unit tests for Card utils * add unit tests for DateFnsLocale utils * fix lint * add unit tests for Events utils * fix lint * fix lint --- src/utils/card.test.ts | 37 ++++++++++++++ src/utils/dateFnsLocale.test.ts | 58 +++++++++++++++++++++ src/utils/events.test.ts | 89 +++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 src/utils/card.test.ts create mode 100644 src/utils/dateFnsLocale.test.ts create mode 100644 src/utils/events.test.ts diff --git a/src/utils/card.test.ts b/src/utils/card.test.ts new file mode 100644 index 0000000000..1e23612061 --- /dev/null +++ b/src/utils/card.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, it } from 'vitest'; +import * as card from './card'; + +describe('Utils: card', () => { + describe('Function: getSquareShape', () => { + it('Should return "overflowSquare"', () => { + const result = card.getSquareShape(true); + expect(result).toEqual('overflowSquare'); + }); + it('Should return "square"', () => { + const result = card.getSquareShape(false); + expect(result).toEqual('square'); + }); + }); + + describe('Function: getBackdropShape', () => { + it('Should return "overflowBackdrop"', () => { + const result = card.getBackdropShape(true); + expect(result).toEqual('overflowBackdrop'); + }); + it('Should return "backdrop"', () => { + const result = card.getBackdropShape(false); + expect(result).toEqual('backdrop'); + }); + }); + + describe('Function: getPortraitShape', () => { + it('Should return "overflowPortrait"', () => { + const result = card.getPortraitShape(true); + expect(result).toEqual('overflowPortrait'); + }); + it('Should return "portrait"', () => { + const result = card.getPortraitShape(false); + expect(result).toEqual('portrait'); + }); + }); +}); diff --git a/src/utils/dateFnsLocale.test.ts b/src/utils/dateFnsLocale.test.ts new file mode 100644 index 0000000000..aad7979f96 --- /dev/null +++ b/src/utils/dateFnsLocale.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, it } from 'vitest'; +import * as dateFnsLocale from './dateFnsLocale'; + +describe('Utils: dateFnsLocale', () => { + describe('Function: getLocale', () => { + it('Should return "en-US" by default', () => { + const { code } = dateFnsLocale.getLocale(); + expect(code).toEqual('en-US'); + }); + }); + + describe('Function: getLocaleWithSuffix', () => { + it('Should return "en-US" by default with addSuffix to true', () => { + const { addSuffix, locale } = dateFnsLocale.getLocaleWithSuffix(); + + expect(addSuffix).toEqual(true); + expect(locale.code).toEqual('en-US'); + }); + }); + + describe('Function: updateLocale', () => { + it('Should import "fr-ca" locale', async () => { + const expectedCode = 'fr-CA'; + + await dateFnsLocale.updateLocale('fr-ca'); + const { code } = dateFnsLocale.getLocale(); + const { locale: localeWithSuffix } = + dateFnsLocale.getLocaleWithSuffix(); + + expect(code).toEqual(expectedCode); + expect(localeWithSuffix.code).toEqual(expectedCode); + }); + + it('Should import "fr" locale', async () => { + const expectedCode = 'fr'; + + await dateFnsLocale.updateLocale('fr-fr'); + const { code } = dateFnsLocale.getLocale(); + const { locale: localeWithSuffix } = + dateFnsLocale.getLocaleWithSuffix(); + + expect(code).toEqual(expectedCode); + expect(localeWithSuffix.code).toEqual(expectedCode); + }); + + it('Should import "en-US" locale if given locale is not found', async () => { + const expectedCode = 'en-US'; + + await dateFnsLocale.updateLocale('unknown-unknown'); + const { code } = dateFnsLocale.getLocale(); + const { locale: localeWithSuffix } = + dateFnsLocale.getLocaleWithSuffix(); + + expect(code).toEqual(expectedCode); + expect(localeWithSuffix.code).toEqual(expectedCode); + }); + }); +}); diff --git a/src/utils/events.test.ts b/src/utils/events.test.ts new file mode 100644 index 0000000000..66f45561a8 --- /dev/null +++ b/src/utils/events.test.ts @@ -0,0 +1,89 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import eventsUtils from './events'; + +describe('Utils: events', () => { + describe('Method: on', () => { + it('should throw error if object is null', () => { + const call = () => eventsUtils.on(null, 'testEvent', vi.fn()); + + expect(call).toThrowError(new Error('obj cannot be null!')); + }); + + it('should init object callbacks with testEvent type if it does not exist', () => { + const obj = {}; + const callback = vi.fn(); + + eventsUtils.on(obj, 'testEvent', callback); + + expect(obj).toHaveProperty('_callbacks', { + testEvent: [callback] + }); + }); + + it('should add callback to existing object callbacks', () => { + const initialCallback = vi.fn(); + const obj = { + _callbacks: { testEvent: [initialCallback] } + }; + const otherCallback = vi.fn(); + + eventsUtils.on(obj, 'testEvent', otherCallback); + + expect(obj).toHaveProperty('_callbacks', { + testEvent: [initialCallback, otherCallback] + }); + }); + }); + + describe('Method: off', () => { + let obj: object; + let initialCallback: ReturnType; + beforeEach(() => { + initialCallback = vi.fn(); + obj = { + _callbacks: { + testEvent: [initialCallback] + } + }; + }); + + it('should remove existing callbacks', () => { + eventsUtils.off(obj, 'testEvent', initialCallback); + + expect(obj).toHaveProperty('_callbacks', { testEvent: [] }); + }); + it('should not remove callback if it is not registered for the given event', () => { + eventsUtils.off(obj, 'otherEvent', initialCallback); + + expect(obj).toHaveProperty('_callbacks', { + testEvent: [initialCallback], + otherEvent: [] + }); + }); + it('should not remove callback if it is not registered', () => { + const callbackToRemove = vi.fn(); + + eventsUtils.off(obj, 'testEvent', callbackToRemove); + + expect(obj).toHaveProperty('_callbacks', { + testEvent: [initialCallback] + }); + }); + }); + + describe('Method: trigger', () => { + it('should trigger registered callback with given parameters', () => { + const obj = {}; + const callback = vi.fn(); + eventsUtils.on(obj, 'testEvent', callback); + + eventsUtils.trigger(obj, 'testEvent', ['testValue1', 'testValue2']); + + expect(callback).toHaveBeenCalledWith( + { type: 'testEvent' }, + 'testValue1', + 'testValue2' + ); + }); + }); +}); From 97aa44235326a66ded57bebd1ae4aa1826991345 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 15 Oct 2024 16:28:32 -0400 Subject: [PATCH 013/230] Remove check for pre-10.6 server version --- src/apps/dashboard/routes/users/profile.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/apps/dashboard/routes/users/profile.tsx b/src/apps/dashboard/routes/users/profile.tsx index 6e13136290..8605feaf35 100644 --- a/src/apps/dashboard/routes/users/profile.tsx +++ b/src/apps/dashboard/routes/users/profile.tsx @@ -171,9 +171,7 @@ const UserEdit = () => { (user.Policy?.RemoteClientBitrateLimit / 1e6).toLocaleString(undefined, { maximumFractionDigits: 6 }) : ''; (page.querySelector('#txtLoginAttemptsBeforeLockout') as HTMLInputElement).value = String(user.Policy?.LoginAttemptsBeforeLockout) || '-1'; (page.querySelector('#txtMaxActiveSessions') as HTMLInputElement).value = String(user.Policy?.MaxActiveSessions) || '0'; - if (window.ApiClient.isMinServerVersion('10.6.0')) { - (page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value = String(user.Policy?.SyncPlayAccess); - } + (page.querySelector('#selectSyncPlayAccess') as HTMLSelectElement).value = String(user.Policy?.SyncPlayAccess); loading.hide(); }, [loadAuthProviders, loadPasswordResetProviders, loadDeleteFolders ]); From 810e3f2dd2b5e7a2bdb4d5e491fb8a3703c5e0ab Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 15 Oct 2024 16:53:40 -0400 Subject: [PATCH 014/230] Update comment action variable names --- .github/workflows/__job_messages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/__job_messages.yml b/.github/workflows/__job_messages.yml index c61bae4c67..a77a011827 100644 --- a/.github/workflows/__job_messages.yml +++ b/.github/workflows/__job_messages.yml @@ -60,6 +60,6 @@ jobs: uses: thollander/actions-comment-pull-request@e2c37e53a7d2227b61585343765f73a9ca57eda9 # v3.0.0 if: ${{ inputs.comment && steps.compose.conclusion == 'success' }} with: - GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }} + github-token: ${{ secrets.JF_BOT_TOKEN }} message: ${{ env.msg }} - comment_tag: ${{ inputs.marker }} + comment-tag: ${{ inputs.marker }} From 8676ebaf9a6f8fecb4af84b209e1ff739d48bbf7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:58:11 +0000 Subject: [PATCH 015/230] Update dependency hls.js to v1.5.16 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e9f554c41..19185ffab2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "flv.js": "1.6.2", "headroom.js": "0.12.0", "history": "5.3.0", - "hls.js": "1.5.15", + "hls.js": "1.5.16", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.11.0", "jquery": "3.7.1", @@ -13165,9 +13165,9 @@ } }, "node_modules/hls.js": { - "version": "1.5.15", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.15.tgz", - "integrity": "sha512-6cD7xN6bycBHaXz2WyPIaHn/iXFizE5au2yvY5q9aC4wfihxAr16C9fUy4nxh2a3wOw0fEgLRa9dN6wsYjlpNg==", + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.16.tgz", + "integrity": "sha512-+wAWr4aeRq9ODN8/Vgz0Cee1Cw6Ysr7vyEkZJCwOJYNwlld7CNmhKE+dLwfpUO2UuotYLGF0of6UFiN6zA7mig==", "license": "Apache-2.0" }, "node_modules/hoist-non-react-statics": { @@ -35015,9 +35015,9 @@ } }, "hls.js": { - "version": "1.5.15", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.15.tgz", - "integrity": "sha512-6cD7xN6bycBHaXz2WyPIaHn/iXFizE5au2yvY5q9aC4wfihxAr16C9fUy4nxh2a3wOw0fEgLRa9dN6wsYjlpNg==" + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.16.tgz", + "integrity": "sha512-+wAWr4aeRq9ODN8/Vgz0Cee1Cw6Ysr7vyEkZJCwOJYNwlld7CNmhKE+dLwfpUO2UuotYLGF0of6UFiN6zA7mig==" }, "hoist-non-react-statics": { "version": "3.3.2", diff --git a/package.json b/package.json index b2a2d1b7d7..f89705a814 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "flv.js": "1.6.2", "headroom.js": "0.12.0", "history": "5.3.0", - "hls.js": "1.5.15", + "hls.js": "1.5.16", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.11.0", "jquery": "3.7.1", From c40be076f18d5556e719b717f06ce481b129efd8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 00:58:34 +0000 Subject: [PATCH 016/230] Update dependency typescript to v5.6.3 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e9f554c41..bce7ac9227 100644 --- a/package-lock.json +++ b/package-lock.json @@ -121,7 +121,7 @@ "stylelint-order": "6.0.4", "stylelint-scss": "5.3.2", "ts-loader": "9.5.1", - "typescript": "5.6.2", + "typescript": "5.6.3", "vitest": "2.1.2", "webpack": "5.94.0", "webpack-bundle-analyzer": "4.10.2", @@ -25085,9 +25085,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -43221,9 +43221,9 @@ } }, "typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true }, "uc.micro": { diff --git a/package.json b/package.json index b2a2d1b7d7..de09becc5f 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "stylelint-order": "6.0.4", "stylelint-scss": "5.3.2", "ts-loader": "9.5.1", - "typescript": "5.6.2", + "typescript": "5.6.3", "vitest": "2.1.2", "webpack": "5.94.0", "webpack-bundle-analyzer": "4.10.2", From 5059f71fcceae9a9bc93207e9856f170545e47fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 08:25:41 +0000 Subject: [PATCH 017/230] Update dependency @jellyfin/sdk to v0.0.0-unstable.202410160502 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c249bb81ef..d588141d19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410150501", + "@jellyfin/sdk": "0.0.0-unstable.202410160502", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", @@ -5062,9 +5062,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202410150501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410150501.tgz", - "integrity": "sha512-lFjr36t6aw2c+4qpxIHNFXS/o+yHNqdKrwdV27KkA9X+vKr6CAvlVH2s3DwCy9tEYaPHHgn2MBJbah2OpYpHmw==", + "version": "0.0.0-unstable.202410160502", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410160502.tgz", + "integrity": "sha512-RvMrCmFIRNxsh5vvrgfYAbPreMMG0rVga1MRrdAPZqbsQ7fhoVaf2w5MkmABCAO62IAxInnKht8H61XEBfA39g==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -29284,9 +29284,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202410150501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410150501.tgz", - "integrity": "sha512-lFjr36t6aw2c+4qpxIHNFXS/o+yHNqdKrwdV27KkA9X+vKr6CAvlVH2s3DwCy9tEYaPHHgn2MBJbah2OpYpHmw==", + "version": "0.0.0-unstable.202410160502", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410160502.tgz", + "integrity": "sha512-RvMrCmFIRNxsh5vvrgfYAbPreMMG0rVga1MRrdAPZqbsQ7fhoVaf2w5MkmABCAO62IAxInnKht8H61XEBfA39g==", "requires": {} }, "@jridgewell/gen-mapping": { diff --git a/package.json b/package.json index 7ee2bfa472..e350c7cfc7 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410150501", + "@jellyfin/sdk": "0.0.0-unstable.202410160502", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", From 6b57b1fd187c306d2536a822e1b8387efba750e8 Mon Sep 17 00:00:00 2001 From: Roi Gabay Date: Wed, 16 Oct 2024 10:04:20 +0000 Subject: [PATCH 018/230] Translated using Weblate (Hebrew) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/ --- src/strings/he.json | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/strings/he.json b/src/strings/he.json index d45bc79ed9..e3a8674709 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -1353,5 +1353,29 @@ "LabelNoChangelog": "לא סופק תיעוד שינויים לשחרור זה.", "LabelNotInstalled": "לא מותקן", "HeaderMediaSegmentActions": "פעולות על מקטע מדיה", - "LabelMediaSegmentsType": "{0} מקטעים" + "LabelMediaSegmentsType": "{0} מקטעים", + "LabelScreensaverTime": "זמן לשומר מסך", + "HeaderEditPlaylist": "עריכת רשימת ניגון", + "HeaderNewPlaylist": "רשימת ניגון חדשה", + "LabelPleaseRestart": "השינויים יחולו אחרי טעינה מחדש של הדפדפן.", + "LabelPostProcessor": "תוכנת עיבוד-אוחר", + "LabelPostProcessorArguments": "ארגומנטים לשורת הפקודה של תוכנת עיבוד-אוחר", + "LabelPostProcessorArgumentsHelp": "השתמש ב-{path} כמסלול לקובץ ההקלטה.", + "LabelPublicHttpsPort": "מספר פורט HTTPS פומבי", + "LabelPublicHttpsPortHelp": "מספר הפורט הפומבי אשר ימופה לפורט HTTPS המקומי.", + "LabelPublishedServerUri": "כתובות URI של השרת שיפורסמו", + "LabelPublishedServerUriHelp": "דרוס את ה-URI שבשימוש ג'ליפין, בהתבסס על כרטיס הרשת, או כתובת IP של הלקוח. למשל: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, או all=https://jellyfin.example.com", + "LabelParallelImageEncodingLimit": "גבול קידוד תמונות במקביל", + "LabelParallelImageEncodingLimitHelp": "המספר המקסימלי של קידודי תמונות שירוצו במקביל. הגדרה של 0 תבחר ערך בהתאם למספר המעבדים במערכת שלך.", + "LabelPlayDefaultAudioTrack": "ניגון פס הקול הדיפולטי ללא תלות בשפה", + "LabelPublicHttpPortHelp": "מספר הפורט הפומבי אשר ימופה לפורט HTTP המקומי.", + "LabelQsvDevice": "רכיב QSV", + "LabelRecordingPathHelp": "הגדרת מסלול ברירת מחדל לשמירת הקלטות. אם ריק, ייעשה שימוש בתיקיית המידע של השרת.", + "LabelQsvDeviceHelp": "הגדרת רכיב עבור Intel QSV ומערכת מרובת מעבדים גרפיים. בלינוקס, זה יהיה רכיב הרינדור, למשל /dev/dri/renderD128. בווינדוס, זה יהיה אינדקס הרכיב החל מ-0. יש להשאיר ריק אלא אם אתם יודעים מה אתם עושים.", + "LabelRecordingPath": "מסלול הקלטה ברירת מחדל", + "LabelScreensaverTimeHelp": "מספר השניות הנחוץ של חוסר פעילות כדי להפעיל את שומר המסך.", + "LabelRepository": "מאגר", + "LabelSaveTrickplayLocally": "שמירת תמונות trickplay ליד המדיה", + "LabelSaveTrickplayLocallyHelp": "שמירת תמונות trickplay בתיקיית המדיה תשים אותם ליד המדיה שלך למיגרציה וגישה קלה.", + "LabelRemoteClientBitrateLimit": "גבול קצב הזרמת רשת (Mbps)" } From 2a8f502ea717cedc3f3bdb09134e2e2e907a6a57 Mon Sep 17 00:00:00 2001 From: Highlandword9 Date: Wed, 16 Oct 2024 15:40:13 +0000 Subject: [PATCH 019/230] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index 21659dcb72..e856de42cd 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1971,5 +1971,14 @@ "LabelScreensaverTime": "Screensaver Time", "AlwaysBurnInSubtitleWhenTranscoding": "Always burn in subtitle when transcoding", "AlwaysBurnInSubtitleWhenTranscodingHelp": "Burn in all subtitles when transcoding is triggered. This ensures subtitle synchronisation after transcoding at the cost of reduced transcoding speed.", - "LabelScreensaverTimeHelp": "The amount of time in seconds of inactivity required to start the screensaver." + "LabelScreensaverTimeHelp": "The amount of time in seconds of inactivity required to start the screensaver.", + "LabelQsvDevice": "QSV Device", + "HeaderEditPlaylist": "Edit Playlist", + "HeaderNewPlaylist": "New Playlist", + "LabelMediaSegmentsType": "{0} Segments", + "LabelQsvDeviceHelp": "Specify the device for Intel QSV on a multi-GPU system. On Linux, this is the render node, e.g., /dev/dri/renderD128. On Windows, this is the device index starting from 0. Leave blank unless you know what you are doing.", + "MediaSegmentAction.None": "None", + "MediaSegmentAction.Skip": "Skip", + "MediaSegmentType.Commercial": "Ad", + "HeaderMediaSegmentActions": "Media Segment Actions" } From 1e589303fef7d3cf38309db86642e05367f66968 Mon Sep 17 00:00:00 2001 From: dickta Date: Wed, 16 Oct 2024 14:22:39 +0000 Subject: [PATCH 020/230] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index ffa4e680ec..1e0987bb4a 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1906,5 +1906,7 @@ "LabelAudioTagSettings": "Hangcímke-beállítások", "LabelDelimiterWhitelist": "Elválasztók engedélyezési listája", "LabelDelimiterWhitelistHelp": "Elemek, melyek nem lesznek figyelembe véve a címkefelosztásnál. Soronként egy elem.", - "LabelDisableVbrAudioEncoding": "Változó bitsebességű hangfelvétel letiltása" + "LabelDisableVbrAudioEncoding": "Változó bitsebességű hangfelvétel letiltása", + "AlwaysBurnInSubtitleWhenTranscoding": "Mindig égesse be a feliratot átkódoláskor", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Minden felirat beégetése átkódolás aktiválásakor. Ez biztosítja a feliratok szinkronját átkodólás után a kódolás sebességének rovására." } From 2564902573bf71e18d0748a0902e9f162a7963b7 Mon Sep 17 00:00:00 2001 From: Highlandword9 Date: Wed, 16 Oct 2024 15:41:41 +0000 Subject: [PATCH 021/230] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index e856de42cd..06ea9dd8f3 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1980,5 +1980,10 @@ "MediaSegmentAction.None": "None", "MediaSegmentAction.Skip": "Skip", "MediaSegmentType.Commercial": "Ad", - "HeaderMediaSegmentActions": "Media Segment Actions" + "HeaderMediaSegmentActions": "Media Segment Actions", + "MediaSegmentType.Intro": "Intro", + "MediaSegmentType.Outro": "Outro", + "MediaSegmentType.Preview": "Preview", + "MediaSegmentType.Recap": "Recap", + "PlaylistError.UpdateFailed": "Error updating playlist" } From 8b3a02c7277c52f6f220419a9a30d5d995b9c4d9 Mon Sep 17 00:00:00 2001 From: AeRo <48489581+AER00@users.noreply.github.com> Date: Thu, 17 Oct 2024 03:27:10 +0200 Subject: [PATCH 022/230] Fix queue when playing on remote device (partial) (#3381) --- src/components/remotecontrol/remotecontrol.js | 4 + src/plugins/sessionPlayer/plugin.js | 141 +++++++++++++++++- 2 files changed, 138 insertions(+), 7 deletions(-) diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index fa08355039..31b88a8e8e 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -493,6 +493,10 @@ export default function () { function loadPlaylist(context, player) { getPlaylistItems(player).then(function (items) { + if (items.length === 0) { + return; + } + let html = ''; let favoritesEnabled = true; if (layoutManager.mobile) { diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js index 3f9fc1720c..510129d7f1 100644 --- a/src/plugins/sessionPlayer/plugin.js +++ b/src/plugins/sessionPlayer/plugin.js @@ -84,6 +84,58 @@ function unsubscribeFromPlayerUpdates(instance) { } } +async function updatePlaylist(instance, queue) { + const options = { + ids: queue.map(i => i.Id), + serverId: getCurrentApiClient(instance).serverId() + }; + + const result = await playbackManager.getItemsForPlayback(options.serverId, { + Ids: options.ids.join(',') + }); + + const items = await playbackManager.translateItemsForPlayback(result.Items, options); + + for (let i = 0; i < items.length; i++) { + items[i].PlaylistItemId = queue[i].PlaylistItemId; + } + + instance.playlist = items; +} + +function compareQueues(q1, q2) { + if (q1.length !== q2.length) { + return true; + } + + for (let i = 0; i < q1.length; i++) { + if (q1[i].Id !== q2[i].Id || q1[i].PlaylistItemId !== q2[i].PlaylistItemId) { + return true; + } + } + return false; +} + +function updateCurrentQueue(instance, session) { + const current = session.NowPlayingQueue; + if (instance.isUpdatingPlaylist) { + return; + } + + if (instance.lastPlayerData && !compareQueues(current, instance.playlist)) { + return; + } + + instance.isUpdatingPlaylist = true; + + const finish = () => { + instance.isUpdatingPlaylist = false; + instance.isPlaylistRendered = true; + }; + + updatePlaylist(instance, current).then(finish, finish); +} + function processUpdatedSessions(instance, sessions, apiClient) { const serverId = apiClient.serverId(); @@ -103,11 +155,13 @@ function processUpdatedSessions(instance, sessions, apiClient) { normalizeImages(session, apiClient); const eventNames = getChangedEvents(instance.lastPlayerData); + updateCurrentQueue(instance, session); + instance.lastPlayerData = session; - for (let i = 0, length = eventNames.length; i < length; i++) { - Events.trigger(instance, eventNames[i], [session]); - } + eventNames.forEach(eventName => { + Events.trigger(instance, eventName, [session]); + }); } else { instance.lastPlayerData = session; @@ -178,6 +232,8 @@ function normalizeImages(state, apiClient) { } class SessionPlayer { + lastPlaylistItemId; + constructor() { const self = this; @@ -186,6 +242,10 @@ class SessionPlayer { this.isLocalPlayer = false; this.id = 'remoteplayer'; + this.playlist = []; + this.isPlaylistRendered = true; + this.isUpdatingPlaylist = false; + Events.on(serverNotifications, 'Sessions', function (e, apiClient, data) { processUpdatedSessions(self, data, apiClient); }); @@ -484,16 +544,83 @@ class SessionPlayer { return state.MediaType === 'Audio'; } + getTrackIndex(playlistItemId) { + for (let i = 0; i < this.playlist.length; i++) { + if (this.playlist[i].PlaylistItemId === playlistItemId) { + return i; + } + } + } + getPlaylist() { + let itemId; + + if (this.lastPlayerData) { + itemId = this.lastPlayerData.PlaylistItemId; + } + + if (this.playlist.length > 0 && (this.isPlaylistRendered || itemId !== this.lastPlaylistItemId)) { + this.isPlaylistRendered = false; + this.lastPlaylistItemId = itemId; + return Promise.resolve(this.playlist); + } return Promise.resolve([]); } - getCurrentPlaylistItemId() { - // not supported? + movePlaylistItem(playlistItemId, newIndex) { + const index = this.getTrackIndex(playlistItemId); + if (index === newIndex) return; + + const current = this.getCurrentPlaylistItemId(); + let currentIndex = 0; + + if (current === playlistItemId) { + currentIndex = newIndex; + } + + const append = (newIndex + 1 >= this.playlist.length); + + if (newIndex > index) newIndex++; + + const ids = []; + const item = this.playlist[index]; + + for (let i = 0; i < this.playlist.length; i++) { + if (i === index) continue; + + if (i === newIndex) { + ids.push(item.Id); + } + + if (this.playlist[i].PlaylistItemId === current) { + currentIndex = ids.length; + } + + ids.push(this.playlist[i].Id); + } + + if (append) { + ids.push(item.Id); + } + + const options = { + ids, + startIndex: currentIndex + }; + + return sendPlayCommand(getCurrentApiClient(this), options, 'PlayNow'); } - setCurrentPlaylistItem() { - return Promise.resolve(); + getCurrentPlaylistItemId() { + return this.lastPlayerData.PlaylistItemId; + } + + setCurrentPlaylistItem(playlistItemId) { + const options = { + ids: this.playlist.map(i => i.Id), + startIndex: this.getTrackIndex(playlistItemId) + }; + return sendPlayCommand(getCurrentApiClient(this), options, 'PlayNow'); } removeFromPlaylist() { From 0d2652ce588f38edd6f75eb7c5c6d770da3a4711 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 17 Oct 2024 01:41:13 -0400 Subject: [PATCH 023/230] Add base item to download params --- src/components/itemContextMenu.js | 6 ++++-- src/controllers/itemDetails/index.js | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index a37b226590..02f7138af4 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -404,8 +404,9 @@ function executeCommand(item, id, options) { const downloadHref = apiClient.getItemDownloadUrl(itemId); fileDownloader.download([{ url: downloadHref, - itemId: itemId, - serverId: serverId, + item, + itemId, + serverId, title: item.Name, filename: item.Path.replace(/^.*[\\/]/, '') }]); @@ -419,6 +420,7 @@ function executeCommand(item, id, options) { const downloadHref = apiClient.getItemDownloadUrl(episode.Id); return { url: downloadHref, + item: episode, itemId: episode.Id, serverId: serverId, title: episode.Name, diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index ef2ce9279e..0523094f5d 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -2011,6 +2011,7 @@ export default function (view, params) { const downloadHref = getApiClient().getItemDownloadUrl(currentItem.Id); download([{ url: downloadHref, + item: currentItem, itemId: currentItem.Id, serverId: currentItem.ServerId, title: currentItem.Name, From 13c0dc0ea6bb6389a6ded10fc2d751b8005cf7be Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 17 Oct 2024 02:08:36 -0400 Subject: [PATCH 024/230] Remove ratings from video osd --- src/controllers/playback/video/index.html | 3 --- src/controllers/playback/video/index.js | 13 ------------- src/styles/videoosd.scss | 18 +----------------- 3 files changed, 1 insertion(+), 33 deletions(-) diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html index a460ee8f6a..57b11092d7 100644 --- a/src/controllers/playback/video/index.html +++ b/src/controllers/playback/video/index.html @@ -66,9 +66,6 @@ -
-
- diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index b6439216ce..779b68f9f6 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -95,18 +95,6 @@ export default function (view) { } setTitle(displayItem, parentName); - ratingsText.innerHTML = mediaInfo.getPrimaryMediaInfoHtml(displayItem, { - officialRating: false, - criticRating: true, - starRating: true, - endsAt: false, - year: false, - programIndicator: false, - runtime: false, - subtitles: false, - originalAirDate: false, - episodeTitle: false - }); const secondaryMediaInfo = view.querySelector('.osdSecondaryMediaInfo'); const secondaryMediaInfoHtml = mediaInfo.getSecondaryMediaInfoHtml(displayItem, { @@ -1624,7 +1612,6 @@ export default function (view) { const startTimeText = view.querySelector('.startTimeText'); const endTimeText = view.querySelector('.endTimeText'); const endsAtText = view.querySelector('.endsAtText'); - const ratingsText = view.querySelector('.osdRatingsText'); const btnRewind = view.querySelector('.btnRewind'); const btnFastForward = view.querySelector('.btnFastForward'); const transitionEndEventName = dom.whichTransitionEvent(); diff --git a/src/styles/videoosd.scss b/src/styles/videoosd.scss index 2c8c00e260..b7f06c08db 100644 --- a/src/styles/videoosd.scss +++ b/src/styles/videoosd.scss @@ -136,17 +136,9 @@ align-items: center; } -.osdRatingsText { - display: flex; - align-items: center; - margin-left: 1em; - margin-right: auto; - user-select: none; -} - .osdTimeText { margin-left: 1em; - margin-right: 1em; + margin-right: auto; user-select: none; } @@ -221,14 +213,6 @@ .videoOsdBottom .endsAtText { display: none !important; } - - .videoOsdBottom .osdRatingsText .starRatingContainer { - display: none !important; - } - - .videoOsdBottom .osdRatingsText .mediaInfoCriticRating { - display: none !important; - } } .syncPlayContainer { From d140962b95f32235bb63021ca8e0d6c54e8aeb17 Mon Sep 17 00:00:00 2001 From: CGMads Date: Thu, 17 Oct 2024 07:03:15 +0000 Subject: [PATCH 025/230] Translated using Weblate (Danish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/ --- src/strings/da.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/da.json b/src/strings/da.json index 3a4509130c..912e6c4943 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -1931,5 +1931,6 @@ "PluginLoadConfigError": "Der opstod en fejl imens vi hentede konfigurationssiderne til pluginet.", "AllowFmp4TranscodingContainerHelp": "Tillad fMP4-transkodningscontainer for denne tuner for at aktivere HEVC og HDR-indhold. Ikke alle tunere er kompatible med denne container. Deaktiver dette, hvis du oplever afspilningsproblemer.", "AllowStreamSharingHelp": "Tillad Jellyfin at kopiere mpegts-streamen fra tuner og dele denne kopierede stream til dens klienter. Dette er brugbart når tunerens totale stream-antal er begrænset, men kan også skabe afspilningsproblemer.", - "AlwaysBurnInSubtitleWhenTranscoding": "Brænd altid undertekster ind under transkodning" + "AlwaysBurnInSubtitleWhenTranscoding": "Brænd altid undertekster ind under transkodning", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brænd alle undertekster fast når transkodning aktiveres. Dette sikre synkronisering af undertekster efter transkodning, på bekostning af reduceret transkodningshastighed." } From 6fb588129cc685dc4894aac30160d19d5f21d235 Mon Sep 17 00:00:00 2001 From: CGMads Date: Thu, 17 Oct 2024 07:05:35 +0000 Subject: [PATCH 026/230] Translated using Weblate (Danish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/ --- src/strings/da.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/da.json b/src/strings/da.json index 912e6c4943..3875e71e2c 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -1932,5 +1932,6 @@ "AllowFmp4TranscodingContainerHelp": "Tillad fMP4-transkodningscontainer for denne tuner for at aktivere HEVC og HDR-indhold. Ikke alle tunere er kompatible med denne container. Deaktiver dette, hvis du oplever afspilningsproblemer.", "AllowStreamSharingHelp": "Tillad Jellyfin at kopiere mpegts-streamen fra tuner og dele denne kopierede stream til dens klienter. Dette er brugbart når tunerens totale stream-antal er begrænset, men kan også skabe afspilningsproblemer.", "AlwaysBurnInSubtitleWhenTranscoding": "Brænd altid undertekster ind under transkodning", - "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brænd alle undertekster fast når transkodning aktiveres. Dette sikre synkronisering af undertekster efter transkodning, på bekostning af reduceret transkodningshastighed." + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brænd alle undertekster fast når transkodning aktiveres. Dette sikre synkronisering af undertekster efter transkodning, på bekostning af reduceret transkodningshastighed.", + "AlwaysRemuxFlacAudioFilesHelp": "Hvis du har filer som din browser nægter at afspille eller hvis den udregner tidsstempler upræcist, kan du aktivere dette som en løsning." } From 443f341cdca0e9ffb3906fdfdd51c45eaaa36eaa Mon Sep 17 00:00:00 2001 From: gendelo3 Date: Thu, 17 Oct 2024 09:03:26 +0000 Subject: [PATCH 027/230] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index 19885260b7..6157ce23fc 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1971,5 +1971,19 @@ "MessageCancelSeriesTimerError": "Beim Abbrechen des Serien-Timers ist ein Fehler aufgetreten", "MessageCancelTimerError": "Beim Abbrechen des Timers ist ein Fehler aufgetreten", "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brenne alle Untertitel ein, wenn die Transcodierung ausgelöst wird. Dies gewährleistet die Synchronisierung der Untertitel nach der Transcodierung auf Kosten einer geringeren Transcodierungsgeschwindigkeit.", - "LabelScreensaverTimeHelp": "Die Zeitspanne in Sekunden der Inaktivität, die zum Starten des Bildschirmschoners erforderlich ist." + "LabelScreensaverTimeHelp": "Die Zeitspanne in Sekunden der Inaktivität, die zum Starten des Bildschirmschoners erforderlich ist.", + "HeaderEditPlaylist": "Wiedergabeliste bearbeiten", + "HeaderMediaSegmentActions": "Medien-Segmentierungs-Aktionen", + "HeaderNewPlaylist": "Neue Wiedergabeliste", + "LabelMediaSegmentsType": "{0} Segmente", + "LabelQsvDevice": "QSV Gerät", + "LabelQsvDeviceHelp": "Wählt das Gerät für Intel QSV auf einem multi-GPU System aus. Unter Linux ist dies der Renderknoten, z.B. /dev/dri/renderD128. Unter Windows ist dies der Geräte-Index, beginnend bei 0. Leerlassen, außer du weißt was du tust.", + "MediaSegmentAction.None": "Keine", + "MediaSegmentAction.Skip": "Überspringen", + "MediaSegmentType.Commercial": "Werbung", + "MediaSegmentType.Outro": "Abspann", + "MediaSegmentType.Intro": "Vorspann", + "MediaSegmentType.Preview": "Vorschau", + "PlaylistError.UpdateFailed": "Fehler beim Aktualisieren der Wiedergabeliste", + "MediaSegmentType.Recap": "Rückblick" } From cdb027405a0f6cbdbe013595645cb3dedeaa077f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:54:23 +0000 Subject: [PATCH 028/230] Update Babel to v7.25.8 --- package-lock.json | 690 +++++++++++----------------------------------- package.json | 4 +- 2 files changed, 158 insertions(+), 536 deletions(-) diff --git a/package-lock.json b/package-lock.json index d588141d19..f4e0e6cd42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,9 +66,9 @@ "whatwg-fetch": "3.6.20" }, "devDependencies": { - "@babel/core": "7.25.7", + "@babel/core": "7.25.8", "@babel/plugin-transform-modules-umd": "7.25.7", - "@babel/preset-env": "7.25.7", + "@babel/preset-env": "7.25.8", "@babel/preset-react": "7.25.7", "@eslint-community/eslint-plugin-eslint-comments": "4.4.0", "@stylistic/eslint-plugin": "2.9.0", @@ -176,9 +176,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, "license": "MIT", "engines": { @@ -186,9 +186,9 @@ } }, "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "license": "MIT", "dependencies": { @@ -198,10 +198,10 @@ "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", + "@babel/parser": "^7.25.8", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -560,12 +560,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -670,69 +670,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", @@ -765,30 +702,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", @@ -805,108 +718,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", @@ -940,15 +751,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", - "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", + "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/traverse": "^7.25.7" }, "engines": { @@ -1026,15 +836,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", - "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1148,14 +957,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", - "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1182,14 +990,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", - "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1234,14 +1041,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", - "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1267,14 +1073,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", - "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1404,14 +1209,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", - "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1421,14 +1225,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", - "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1438,15 +1241,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", - "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.25.7" }, "engines": { @@ -1474,14 +1276,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", - "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1491,15 +1292,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", - "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1542,16 +1342,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", - "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.7", "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1827,13 +1626,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", - "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", + "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", + "@babel/compat-data": "^7.25.8", "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-validator-option": "^7.25.7", @@ -1843,45 +1642,30 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.25.7", "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.8", "@babel/plugin-transform-async-to-generator": "^7.25.7", "@babel/plugin-transform-block-scoped-functions": "^7.25.7", "@babel/plugin-transform-block-scoping": "^7.25.7", "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.8", "@babel/plugin-transform-classes": "^7.25.7", "@babel/plugin-transform-computed-properties": "^7.25.7", "@babel/plugin-transform-destructuring": "^7.25.7", "@babel/plugin-transform-dotall-regex": "^7.25.7", "@babel/plugin-transform-duplicate-keys": "^7.25.7", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.8", "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.8", "@babel/plugin-transform-for-of": "^7.25.7", "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.8", "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", "@babel/plugin-transform-member-expression-literals": "^7.25.7", "@babel/plugin-transform-modules-amd": "^7.25.7", "@babel/plugin-transform-modules-commonjs": "^7.25.7", @@ -1889,15 +1673,15 @@ "@babel/plugin-transform-modules-umd": "^7.25.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", - "@babel/plugin-transform-numeric-separator": "^7.25.7", - "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", + "@babel/plugin-transform-numeric-separator": "^7.25.8", + "@babel/plugin-transform-object-rest-spread": "^7.25.8", "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.8", + "@babel/plugin-transform-optional-chaining": "^7.25.8", "@babel/plugin-transform-parameters": "^7.25.7", "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.8", "@babel/plugin-transform-property-literals": "^7.25.7", "@babel/plugin-transform-regenerator": "^7.25.7", "@babel/plugin-transform-reserved-words": "^7.25.7", @@ -2004,9 +1788,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.7", @@ -26786,15 +26570,15 @@ } }, "@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true }, "@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", @@ -26803,10 +26587,10 @@ "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", + "@babel/parser": "^7.25.8", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -27058,11 +26842,11 @@ } }, "@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "requires": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.8" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -27121,51 +26905,6 @@ "dev": true, "requires": {} }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, "@babel/plugin-syntax-import-assertions": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", @@ -27184,24 +26923,6 @@ "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, "@babel/plugin-syntax-jsx": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", @@ -27211,78 +26932,6 @@ "@babel/helper-plugin-utils": "^7.25.7" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, "@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", @@ -27303,14 +26952,13 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", - "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", + "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/traverse": "^7.25.7" } }, @@ -27354,14 +27002,13 @@ } }, "@babel/plugin-transform-class-static-block": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", - "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", + "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-classes": { @@ -27427,13 +27074,12 @@ } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", - "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", + "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -27447,13 +27093,12 @@ } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", - "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", + "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-for-of": { @@ -27478,13 +27123,12 @@ } }, "@babel/plugin-transform-json-strings": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", - "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", + "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-literals": { @@ -27497,13 +27141,12 @@ } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", - "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", + "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-member-expression-literals": { @@ -27578,34 +27221,31 @@ } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", - "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", + "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", - "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", + "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", - "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", + "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.25.7" } }, @@ -27620,24 +27260,22 @@ } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", - "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", + "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", - "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", + "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" } }, "@babel/plugin-transform-parameters": { @@ -27660,15 +27298,14 @@ } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", - "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", + "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.25.7", "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-property-literals": { @@ -27826,12 +27463,12 @@ } }, "@babel/preset-env": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", - "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", + "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", "dev": true, "requires": { - "@babel/compat-data": "^7.25.7", + "@babel/compat-data": "^7.25.8", "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-plugin-utils": "^7.25.7", "@babel/helper-validator-option": "^7.25.7", @@ -27841,45 +27478,30 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.25.7", "@babel/plugin-syntax-import-attributes": "^7.25.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.8", "@babel/plugin-transform-async-to-generator": "^7.25.7", "@babel/plugin-transform-block-scoped-functions": "^7.25.7", "@babel/plugin-transform-block-scoping": "^7.25.7", "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.8", "@babel/plugin-transform-classes": "^7.25.7", "@babel/plugin-transform-computed-properties": "^7.25.7", "@babel/plugin-transform-destructuring": "^7.25.7", "@babel/plugin-transform-dotall-regex": "^7.25.7", "@babel/plugin-transform-duplicate-keys": "^7.25.7", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.8", "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.8", "@babel/plugin-transform-for-of": "^7.25.7", "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.8", "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", "@babel/plugin-transform-member-expression-literals": "^7.25.7", "@babel/plugin-transform-modules-amd": "^7.25.7", "@babel/plugin-transform-modules-commonjs": "^7.25.7", @@ -27887,15 +27509,15 @@ "@babel/plugin-transform-modules-umd": "^7.25.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", - "@babel/plugin-transform-numeric-separator": "^7.25.7", - "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", + "@babel/plugin-transform-numeric-separator": "^7.25.8", + "@babel/plugin-transform-object-rest-spread": "^7.25.8", "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.8", + "@babel/plugin-transform-optional-chaining": "^7.25.8", "@babel/plugin-transform-parameters": "^7.25.7", "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.8", "@babel/plugin-transform-property-literals": "^7.25.7", "@babel/plugin-transform-regenerator": "^7.25.7", "@babel/plugin-transform-reserved-words": "^7.25.7", @@ -27974,9 +27596,9 @@ } }, "@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "requires": { "@babel/helper-string-parser": "^7.25.7", "@babel/helper-validator-identifier": "^7.25.7", diff --git a/package.json b/package.json index e350c7cfc7..de8dc0bf0a 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "7.25.7", + "@babel/core": "7.25.8", "@babel/plugin-transform-modules-umd": "7.25.7", - "@babel/preset-env": "7.25.7", + "@babel/preset-env": "7.25.8", "@babel/preset-react": "7.25.7", "@eslint-community/eslint-plugin-eslint-comments": "4.4.0", "@stylistic/eslint-plugin": "2.9.0", From 8b67b3a67d738019af592f4e915db5cae06e977f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Thu, 17 Oct 2024 17:11:46 +0000 Subject: [PATCH 029/230] Translated using Weblate (Chinese (Simplified Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 770e936095..35e1bc8dd5 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -137,7 +137,7 @@ "DisplayInMyMedia": "在主屏幕显示", "DisplayInOtherHomeScreenSections": "在“新增媒体”和“继续观看“等主屏幕模块中显示", "DisplayMissingEpisodesWithinSeasons": "显示每季里缺少的剧集", - "DisplayMissingEpisodesWithinSeasonsHelp": "必须在服务器的 TV 媒体库设置中也启用该功能。", + "DisplayMissingEpisodesWithinSeasonsHelp": "必须在服务器的节目媒体库设置中也启用该功能。", "DoNotRecord": "不录制", "Down": "下", "Download": "下载", @@ -661,7 +661,7 @@ "LabelSubtitleFormatHelp": "例如:SRT", "LabelSubtitlePlaybackMode": "字幕模式", "LabelSupportedMediaTypes": "支持的媒体类型", - "LabelTVHomeScreen": "TV 模式主屏幕", + "LabelTVHomeScreen": "电视模式主屏幕", "LabelTag": "标签", "LabelTagline": "宣传词", "LabelTextBackgroundColor": "文本背景色", @@ -1040,7 +1040,7 @@ "TabLogs": "日志", "TabMusic": "音乐", "TabMyPlugins": "我的插件", - "TabNetworks": "网络", + "TabNetworks": "制片发行商", "TabNfoSettings": "NFO 设置", "TabNotifications": "通知", "TabOther": "其他", From d875fe0729e5c41134679262fa76feddba62ff69 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 20:35:44 +0000 Subject: [PATCH 030/230] Update dependency postcss-preset-env to v10.0.7 --- package-lock.json | 1470 ++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 736 insertions(+), 736 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4e0e6cd42..a2e2080d8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -108,7 +108,7 @@ "mini-css-extract-plugin": "2.9.1", "postcss": "8.4.47", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.0.6", + "postcss-preset-env": "10.0.7", "postcss-scss": "4.0.9", "sass": "1.79.4", "sass-loader": "16.0.2", @@ -1962,9 +1962,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.2.tgz", - "integrity": "sha512-q/W3RXh66SM7WqxW3/KU6koL8nOgqyB/wrcU3+ThXnNtXY2+k8UgdE301ISJpMt6PDyYgC7eMaIBo535RvFIgw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.3.tgz", + "integrity": "sha512-dziWTvbyBsXze7Li+BemXyYX9yCf8udlGKB78evZismrBf7SNN6K5S0qE4sRQELKEkttugcGz0hwqyXilEhoUA==", "dev": true, "funding": [ { @@ -1978,9 +1978,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -1992,9 +1992,9 @@ } }, "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -2011,14 +2011,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -2033,20 +2033,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2063,13 +2063,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -2087,9 +2087,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.2.tgz", - "integrity": "sha512-zG9PHNzZVCRk6eprm+T/ybrnuiwLdO+RR7+GCtNut+NZJGtPJj6bfPOEX23aOlMslLcRAlN6QOpxH3tovn+WpA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.3.tgz", + "integrity": "sha512-L7v0pQlLC3VejShxn5bjrdo3GhhHExSVGB8CgZqIcED/W/eK9pKGxubyGivNcJQYl+iznBtTU3mFPMmOrLccBQ==", "dev": true, "funding": [ { @@ -2103,9 +2103,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -2117,9 +2117,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -2136,14 +2136,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -2158,20 +2158,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2188,13 +2188,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -2212,9 +2212,9 @@ } }, "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.1.tgz", - "integrity": "sha512-TWjjewVZqdkjavsi8a2THuXgkhUum1k/m4QJpZpzOv72q6WnaoQZGSj5t5uCs7ymJr0H3qj6JcXMwMApSWUOGQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.2.tgz", + "integrity": "sha512-GzMdDJrNPAOq4XxGac5xv5Ae2pB3JjvYWIJhJPcE6g87Q38gXG1Daaqq55QUU8DnC+iVm8lrO/JGvSC2T4YBOA==", "dev": true, "funding": [ { @@ -2228,8 +2228,8 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -2241,9 +2241,9 @@ } }, "node_modules/@csstools/postcss-content-alt-text/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2260,13 +2260,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-content-alt-text/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -2284,9 +2284,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.1.tgz", - "integrity": "sha512-A/MG8es3ylFzZ30oYIQUyJcMOfTfCs0dqqBMzeuzaPRlx4q/72WG+BbKe/pL9BUNIWsM0Q8jn3e3la8enjHJJA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.2.tgz", + "integrity": "sha512-gSGeXEKse3U3lDzSXh9XE1DgdicMWolo+eyXN8nH96Vr5mWPd6jUwk6W+x8yRNwM5dDkoAE/HkYK6/WzSo9Jsw==", "dev": true, "funding": [ { @@ -2300,9 +2300,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "engines": { "node": ">=18" @@ -2312,9 +2312,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -2331,14 +2331,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-exponential-functions/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2355,13 +2355,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-exponential-functions/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -2406,9 +2406,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.2.tgz", - "integrity": "sha512-/1ur3ca9RWg/KnbLlxaDswyjLSGoaHNDruAzrVhkn5axgd7LOH6JHCBRhrKDafdMw9bf4MQrYFoaLfHAPekLFg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.3.tgz", + "integrity": "sha512-1mbYE41F3fluEdjExw70b339NVU62O6sz43mya5O+LultfZQdmY68qRsWT+rw85Imya9aeLCDgBHaxwgXf1Z/g==", "dev": true, "funding": [ { @@ -2422,9 +2422,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "engines": { "node": ">=18" @@ -2434,9 +2434,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -2453,14 +2453,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -2475,20 +2475,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2505,13 +2505,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -2529,9 +2529,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.2.tgz", - "integrity": "sha512-qRpvA4sduAfiV9yZG4OM7q/h2Qhr3lg+GrHe9NZwuzWnfSDLGh+Dh4Ea6fQ+1++jdKXW/Cb4/vHRp0ssQYra4w==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.3.tgz", + "integrity": "sha512-TW+utpEOOn2HLlRZTEVNS8XBlG5bOcSNBanIKjPWnkmdgkFjcj1eIaEtWezpGX2hKJpkiwZeIEyP/UItWk6c3g==", "dev": true, "funding": [ { @@ -2545,9 +2545,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -2559,9 +2559,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -2578,14 +2578,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -2600,20 +2600,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2630,13 +2630,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -2654,9 +2654,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.2.tgz", - "integrity": "sha512-RUBVCyJE1hTsf9vGp3zrALeMollkAlHRFKm+T36y67nLfOOf+6GNQsdTGFAyLrY65skcm8ddC26Jp1n9ZIauEA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.3.tgz", + "integrity": "sha512-HBeApQzk6UlqAAWbuXSiWmF0Xtc/hfMTESSbkRUpolXshuPkUaBWXflfQuoo6exv3MvID6iTmv11GZT1ZfADDQ==", "dev": true, "funding": [ { @@ -2670,9 +2670,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -2684,9 +2684,9 @@ } }, "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -2703,14 +2703,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -2725,20 +2725,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2755,13 +2755,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -2880,9 +2880,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.4.tgz", - "integrity": "sha512-yHUt5DZ61Irvp72notmAl3Zt4Me50EWToWNocazyIFTVYFwwo/EucmV3hWi9zJehu3rOSvMclL7DzvRDfbak/A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.5.tgz", + "integrity": "sha512-mSqqxuwlBg10YyErq2YYB71KtvWDueBYE9WAnC6B7GHU+z0ECcGf+sR9zxpvePGzesuBNDB+cp15cW2CvOyszA==", "dev": true, "funding": [ { @@ -2896,8 +2896,8 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -2909,9 +2909,9 @@ } }, "node_modules/@csstools/postcss-light-dark-function/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -2928,13 +2928,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-light-dark-function/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -3047,9 +3047,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.1.tgz", - "integrity": "sha512-JsfaoTiBqIuRE+CYL4ZpYKOqJ965GyiMH4b8UrY0Z7i5GfMiHZrK7xtTB29piuyKQzrW+Z8w3PAExhwND9cuAQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.2.tgz", + "integrity": "sha512-oog7VobKvrS34oyUKslI6wCphtJxx0ldiA8RToPQ0HXPWNiXXSM7IbgwOTImJKTIUjo3eL7o5uuPxeu5MsnkvA==", "dev": true, "funding": [ { @@ -3063,7 +3063,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -3074,9 +3074,9 @@ } }, "node_modules/@csstools/postcss-logical-viewport-units/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -3094,9 +3094,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.1.tgz", - "integrity": "sha512-EMa3IgUip+F/MwH4r2KfIA9ym9hQkT2PpR9MOukdomfGGCFuw9V3n/iIOBKziN1qfeddsYoOvtYOKQcHU2yIjg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.2.tgz", + "integrity": "sha512-zodxyIwRNuro/SIjN+zrYeZCQJvMd1obPtsvmNxLRvk3FOM3KwuuX8GEev9if19OGlNVvJZIe9wH77c+jIbXzA==", "dev": true, "funding": [ { @@ -3110,10 +3110,10 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", + "@csstools/media-query-list-parser": "^4.0.0" }, "engines": { "node": ">=18" @@ -3123,9 +3123,9 @@ } }, "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -3142,14 +3142,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -3166,13 +3166,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -3190,9 +3190,9 @@ } }, "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.0.tgz", + "integrity": "sha512-nUfbCGeqCju55Po8ujRNQ8DjuKYth5UcsDj5HsVzSfqnaFdpOwYCUAhRJ2grfwrXhb9+KuRXHQ6JHzaI0Qhu8Q==", "dev": true, "funding": [ { @@ -3209,14 +3209,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.1.tgz", - "integrity": "sha512-JTzMQz//INahTALkvXnC5lC2fJKzwb5PY443T2zaM9hAzM7nzHMLIlEfFgdtBahVIBtBSalMefdxNr99LGW1lQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.2.tgz", + "integrity": "sha512-9bEvSC8hIkdqHwehYIADcwC7/TvuJeb1hAw0STI7BMRVE57nFxHyXY+WzfLPXtmhpdFqGcKJIyQkDcenQI3Sow==", "dev": true, "funding": [ { @@ -3230,9 +3230,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", + "@csstools/media-query-list-parser": "^4.0.0" }, "engines": { "node": ">=18" @@ -3242,9 +3242,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -3261,13 +3261,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -3285,9 +3285,9 @@ } }, "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values/node_modules/@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.0.tgz", + "integrity": "sha512-nUfbCGeqCju55Po8ujRNQ8DjuKYth5UcsDj5HsVzSfqnaFdpOwYCUAhRJ2grfwrXhb9+KuRXHQ6JHzaI0Qhu8Q==", "dev": true, "funding": [ { @@ -3304,8 +3304,8 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-nested-calc": { @@ -3362,9 +3362,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.2.tgz", - "integrity": "sha512-2iSK/T77PHMeorakBAk/WLxSodfIJ/lmi6nxEkuruXfhGH7fByZim4Fw6ZJf4B73SVieRSH2ep8zvYkA2ZfRtA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.3.tgz", + "integrity": "sha512-BrhnL98OSpWt5EOMk5Hm+kL0kjA8BhBc9DGG0jYgww1GhWItn+L/McQ4WgHE2cm9+jSUE2OMy/31WvSRKhWpnQ==", "dev": true, "funding": [ { @@ -3378,9 +3378,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -3392,9 +3392,9 @@ } }, "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -3411,14 +3411,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -3433,20 +3433,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -3463,13 +3463,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -3513,9 +3513,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.2.tgz", - "integrity": "sha512-aBpuUdpJBswNGfw6lOkhown2cZ0YXrMjASye56nkoRpgRe9yDF4BM1fvEuakrCDiaeoUzVaI4SF6+344BflXfQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.3.tgz", + "integrity": "sha512-1VYBTdGiFSOFrlczaYcUNybCU3XZRL9DDY3ooYRkvweWJZas8dQVHi6vy9SUmxnk0vfGbMbrISXLOIHw4LjKDg==", "dev": true, "funding": [ { @@ -3529,9 +3529,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -3543,9 +3543,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -3562,14 +3562,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -3584,20 +3584,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -3614,13 +3614,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -3664,9 +3664,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.1.tgz", - "integrity": "sha512-dk3KqVcIEYzy9Mvx8amoBbk123BWgd5DfjXDiPrEqxGma37PG7m/MoMmHQhuVHIjvPDHoJwyIZi2yy7j0RA5fw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.2.tgz", + "integrity": "sha512-AxLKGIV0zYIAkeN02fo4o/vcG39WEZjT9dXs78ajy87dM94OFNIu5huxqBgkFGKLiXhQIKBRxAF/MtJmuIWi8w==", "dev": true, "funding": [ { @@ -3680,9 +3680,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "engines": { "node": ">=18" @@ -3692,9 +3692,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -3711,14 +3711,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-stepped-value-functions/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -3735,13 +3735,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-stepped-value-functions/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -3786,9 +3786,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.1.tgz", - "integrity": "sha512-QHOYuN3bzS/rcpAygFhJxJUtD8GuJEWF6f9Zm518Tq/cSMlcTgU+v0geyi5EqbmYxKMig2oKCKUSGqOj9gehkg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.2.tgz", + "integrity": "sha512-hQzJkTWNvHKGYa5ySpdex2K/ODX6bI3z8Pmdl3W/opRlaXMA7Xvq7Nagp31BTkr1ngzfnqTY9XNKEI2FqaO3fg==", "dev": true, "funding": [ { @@ -3802,9 +3802,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "engines": { "node": ">=18" @@ -3814,9 +3814,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -3833,14 +3833,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-trigonometric-functions/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -3857,13 +3857,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/@csstools/postcss-trigonometric-functions/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -16700,9 +16700,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.2.tgz", - "integrity": "sha512-c2WkR0MS73s+P5SgY1KBaSEE61Rj+miW095rkWDnMQxbTCQkp6y/jft8U0QMxEsI4k1Pd4PdV+TP9/1zIDR6XQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.3.tgz", + "integrity": "sha512-mL3LVOwXr5sRX1N5so7AFCNciaYTNTxzXuv5bDoZ/JunV2NCAzGOuVfyICRKczDPFImoIuL4e0O33/zYap9D0w==", "dev": true, "funding": [ { @@ -16716,9 +16716,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -16730,9 +16730,9 @@ } }, "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -16749,14 +16749,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -16771,20 +16771,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -16801,13 +16801,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -17035,9 +17035,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.1.tgz", - "integrity": "sha512-SB4GjuZjIq5GQFNbxFrirQPbkdbJooyNy8bh+fcJ8ZG0oasJTflTTtR4geb56h+FBVDIb9Hx4v/NiG2caOj8nQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.2.tgz", + "integrity": "sha512-ZDJLIXa6uT6FlK6mYdzHxr1fr5ec6lPbp/CZ5+7EZedFmfjJx1fvYQhAPCBebuyc1lkketmiA26ZVl2UkPQ9Ig==", "dev": true, "funding": [ { @@ -17051,9 +17051,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/cascade-layer-name-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, @@ -17065,9 +17065,9 @@ } }, "node_modules/postcss-custom-properties/node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.1.tgz", - "integrity": "sha512-G9ZYN5+yr/E6xYSiy1BwOEFP5p88ZtWo8sL4NztKBkRRAwRkzVGa70M+D+fYHugMID5jkLeNt5X9jYd5EaVuyg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.2.tgz", + "integrity": "sha512-rRWNJ8n16okpQT+8RWEbPfSl8D9WVoDZGBfHkjYnMYWcC20RiMpu/iGeKqUl1hR+SQIKg6p/QJap5rZJaHtVOg==", "dev": true, "funding": [ { @@ -17084,14 +17084,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-custom-properties/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -17108,13 +17108,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-custom-properties/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -17132,9 +17132,9 @@ } }, "node_modules/postcss-custom-selectors": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.1.tgz", - "integrity": "sha512-2McIpyhAeKhUzVqrP4ZyMBpK5FuD+Y9tpQwhcof49652s7gez8057cSaOg/epYcKlztSYxb0GHfi7W5h3JoGUg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.2.tgz", + "integrity": "sha512-8y2fa+RgYHpVFtvR4h3/dHc7b0iWjT6GOpzWwB8VHJTEBdVNaqOB4FH9koa44hgRyaeDs3KTe3xP9EJf6NLvxQ==", "dev": true, "funding": [ { @@ -17148,9 +17148,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/cascade-layer-name-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "postcss-selector-parser": "^6.1.0" }, "engines": { @@ -17161,9 +17161,9 @@ } }, "node_modules/postcss-custom-selectors/node_modules/@csstools/cascade-layer-name-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.1.tgz", - "integrity": "sha512-G9ZYN5+yr/E6xYSiy1BwOEFP5p88ZtWo8sL4NztKBkRRAwRkzVGa70M+D+fYHugMID5jkLeNt5X9jYd5EaVuyg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.2.tgz", + "integrity": "sha512-rRWNJ8n16okpQT+8RWEbPfSl8D9WVoDZGBfHkjYnMYWcC20RiMpu/iGeKqUl1hR+SQIKg6p/QJap5rZJaHtVOg==", "dev": true, "funding": [ { @@ -17180,14 +17180,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-custom-selectors/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -17204,13 +17204,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-custom-selectors/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -17517,9 +17517,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.2.tgz", - "integrity": "sha512-h4ARGLIBtC1PmCHsLgTWWj8j1i1CXoaht4A5RlITDX2z9AeFBak0YlY6sdF4oJGljrep+Dg2SSccIj4QnFbRDg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.3.tgz", + "integrity": "sha512-yCBscY/dwipfvqqy7rQHbn6k18zYZy9O57JY4fGuibot6wz7pbtzRnhRlWraHBNUs+N4p2KogHv2aBsoB6G+5Q==", "dev": true, "funding": [ { @@ -17533,9 +17533,9 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, @@ -17547,9 +17547,9 @@ } }, "node_modules/postcss-lab-function/node_modules/@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "funding": [ { @@ -17566,14 +17566,14 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-lab-function/node_modules/@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "funding": [ { @@ -17588,20 +17588,20 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-lab-function/node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "funding": [ { @@ -17618,13 +17618,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.2" } }, "node_modules/postcss-lab-function/node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true, "funding": [ { @@ -18470,9 +18470,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.0.6.tgz", - "integrity": "sha512-qixfM2wbvKJhUjJELLB8lV2UCsyrMdSXqiXHiNKMgAbNturstc80j/8MsthJeOpxYEekrCrFzcaoOJm8JRSdBg==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.0.7.tgz", + "integrity": "sha512-aUC/bMT2CULwaZ/RK1Ivzdsyv95DQCJs0dK98RTc9cZKUYIal1+85JdNwik0DXg35BKdRZM2ZwASU17PXoglsw==", "dev": true, "funding": [ { @@ -18487,34 +18487,34 @@ "license": "MIT-0", "dependencies": { "@csstools/postcss-cascade-layers": "^5.0.0", - "@csstools/postcss-color-function": "^4.0.2", - "@csstools/postcss-color-mix-function": "^3.0.2", - "@csstools/postcss-content-alt-text": "^2.0.1", - "@csstools/postcss-exponential-functions": "^2.0.1", + "@csstools/postcss-color-function": "^4.0.3", + "@csstools/postcss-color-mix-function": "^3.0.3", + "@csstools/postcss-content-alt-text": "^2.0.2", + "@csstools/postcss-exponential-functions": "^2.0.2", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.2", - "@csstools/postcss-gradients-interpolation-method": "^5.0.2", - "@csstools/postcss-hwb-function": "^4.0.2", + "@csstools/postcss-gamut-mapping": "^2.0.3", + "@csstools/postcss-gradients-interpolation-method": "^5.0.3", + "@csstools/postcss-hwb-function": "^4.0.3", "@csstools/postcss-ic-unit": "^4.0.0", "@csstools/postcss-initial": "^2.0.0", "@csstools/postcss-is-pseudo-class": "^5.0.0", - "@csstools/postcss-light-dark-function": "^2.0.4", + "@csstools/postcss-light-dark-function": "^2.0.5", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.1", - "@csstools/postcss-media-minmax": "^2.0.1", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.1", + "@csstools/postcss-logical-viewport-units": "^3.0.2", + "@csstools/postcss-media-minmax": "^2.0.2", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.2", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.2", + "@csstools/postcss-oklab-function": "^4.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-relative-color-syntax": "^3.0.2", + "@csstools/postcss-relative-color-syntax": "^3.0.3", "@csstools/postcss-scope-pseudo-class": "^4.0.0", - "@csstools/postcss-stepped-value-functions": "^4.0.1", + "@csstools/postcss-stepped-value-functions": "^4.0.2", "@csstools/postcss-text-decoration-shorthand": "^4.0.1", - "@csstools/postcss-trigonometric-functions": "^4.0.1", + "@csstools/postcss-trigonometric-functions": "^4.0.2", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.19", "browserslist": "^4.23.1", @@ -18524,12 +18524,12 @@ "cssdb": "^8.1.1", "postcss-attribute-case-insensitive": "^7.0.0", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.2", + "postcss-color-functional-notation": "^7.0.3", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.2", - "postcss-custom-properties": "^14.0.1", - "postcss-custom-selectors": "^8.0.1", + "postcss-custom-media": "^11.0.3", + "postcss-custom-properties": "^14.0.2", + "postcss-custom-selectors": "^8.0.2", "postcss-dir-pseudo-class": "^9.0.0", "postcss-double-position-gradients": "^6.0.0", "postcss-focus-visible": "^10.0.0", @@ -18537,7 +18537,7 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.2", + "postcss-lab-function": "^7.0.3", "postcss-logical": "^8.0.0", "postcss-nesting": "^13.0.0", "postcss-opacity-percentage": "^3.0.0", @@ -27669,151 +27669,151 @@ } }, "@csstools/postcss-color-function": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.2.tgz", - "integrity": "sha512-q/W3RXh66SM7WqxW3/KU6koL8nOgqyB/wrcU3+ThXnNtXY2+k8UgdE301ISJpMt6PDyYgC7eMaIBo535RvFIgw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.3.tgz", + "integrity": "sha512-dziWTvbyBsXze7Li+BemXyYX9yCf8udlGKB78evZismrBf7SNN6K5S0qE4sRQELKEkttugcGz0hwqyXilEhoUA==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } }, "@csstools/postcss-color-mix-function": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.2.tgz", - "integrity": "sha512-zG9PHNzZVCRk6eprm+T/ybrnuiwLdO+RR7+GCtNut+NZJGtPJj6bfPOEX23aOlMslLcRAlN6QOpxH3tovn+WpA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.3.tgz", + "integrity": "sha512-L7v0pQlLC3VejShxn5bjrdo3GhhHExSVGB8CgZqIcED/W/eK9pKGxubyGivNcJQYl+iznBtTU3mFPMmOrLccBQ==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } }, "@csstools/postcss-content-alt-text": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.1.tgz", - "integrity": "sha512-TWjjewVZqdkjavsi8a2THuXgkhUum1k/m4QJpZpzOv72q6WnaoQZGSj5t5uCs7ymJr0H3qj6JcXMwMApSWUOGQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.2.tgz", + "integrity": "sha512-GzMdDJrNPAOq4XxGac5xv5Ae2pB3JjvYWIJhJPcE6g87Q38gXG1Daaqq55QUU8DnC+iVm8lrO/JGvSC2T4YBOA==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } }, "@csstools/postcss-exponential-functions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.1.tgz", - "integrity": "sha512-A/MG8es3ylFzZ30oYIQUyJcMOfTfCs0dqqBMzeuzaPRlx4q/72WG+BbKe/pL9BUNIWsM0Q8jn3e3la8enjHJJA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.2.tgz", + "integrity": "sha512-gSGeXEKse3U3lDzSXh9XE1DgdicMWolo+eyXN8nH96Vr5mWPd6jUwk6W+x8yRNwM5dDkoAE/HkYK6/WzSo9Jsw==", "dev": true, "requires": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -27829,134 +27829,134 @@ } }, "@csstools/postcss-gamut-mapping": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.2.tgz", - "integrity": "sha512-/1ur3ca9RWg/KnbLlxaDswyjLSGoaHNDruAzrVhkn5axgd7LOH6JHCBRhrKDafdMw9bf4MQrYFoaLfHAPekLFg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.3.tgz", + "integrity": "sha512-1mbYE41F3fluEdjExw70b339NVU62O6sz43mya5O+LultfZQdmY68qRsWT+rw85Imya9aeLCDgBHaxwgXf1Z/g==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } }, "@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.2.tgz", - "integrity": "sha512-qRpvA4sduAfiV9yZG4OM7q/h2Qhr3lg+GrHe9NZwuzWnfSDLGh+Dh4Ea6fQ+1++jdKXW/Cb4/vHRp0ssQYra4w==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.3.tgz", + "integrity": "sha512-TW+utpEOOn2HLlRZTEVNS8XBlG5bOcSNBanIKjPWnkmdgkFjcj1eIaEtWezpGX2hKJpkiwZeIEyP/UItWk6c3g==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } }, "@csstools/postcss-hwb-function": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.2.tgz", - "integrity": "sha512-RUBVCyJE1hTsf9vGp3zrALeMollkAlHRFKm+T36y67nLfOOf+6GNQsdTGFAyLrY65skcm8ddC26Jp1n9ZIauEA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.3.tgz", + "integrity": "sha512-HBeApQzk6UlqAAWbuXSiWmF0Xtc/hfMTESSbkRUpolXshuPkUaBWXflfQuoo6exv3MvID6iTmv11GZT1ZfADDQ==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -27999,28 +27999,28 @@ } }, "@csstools/postcss-light-dark-function": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.4.tgz", - "integrity": "sha512-yHUt5DZ61Irvp72notmAl3Zt4Me50EWToWNocazyIFTVYFwwo/EucmV3hWi9zJehu3rOSvMclL7DzvRDfbak/A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.5.tgz", + "integrity": "sha512-mSqqxuwlBg10YyErq2YYB71KtvWDueBYE9WAnC6B7GHU+z0ECcGf+sR9zxpvePGzesuBNDB+cp15cW2CvOyszA==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -28056,92 +28056,92 @@ } }, "@csstools/postcss-logical-viewport-units": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.1.tgz", - "integrity": "sha512-JsfaoTiBqIuRE+CYL4ZpYKOqJ965GyiMH4b8UrY0Z7i5GfMiHZrK7xtTB29piuyKQzrW+Z8w3PAExhwND9cuAQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.2.tgz", + "integrity": "sha512-oog7VobKvrS34oyUKslI6wCphtJxx0ldiA8RToPQ0HXPWNiXXSM7IbgwOTImJKTIUjo3eL7o5uuPxeu5MsnkvA==", "dev": true, "requires": { - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } }, "@csstools/postcss-media-minmax": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.1.tgz", - "integrity": "sha512-EMa3IgUip+F/MwH4r2KfIA9ym9hQkT2PpR9MOukdomfGGCFuw9V3n/iIOBKziN1qfeddsYoOvtYOKQcHU2yIjg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.2.tgz", + "integrity": "sha512-zodxyIwRNuro/SIjN+zrYeZCQJvMd1obPtsvmNxLRvk3FOM3KwuuX8GEev9if19OGlNVvJZIe9wH77c+jIbXzA==", "dev": true, "requires": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", + "@csstools/media-query-list-parser": "^4.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true }, "@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.0.tgz", + "integrity": "sha512-nUfbCGeqCju55Po8ujRNQ8DjuKYth5UcsDj5HsVzSfqnaFdpOwYCUAhRJ2grfwrXhb9+KuRXHQ6JHzaI0Qhu8Q==", "dev": true, "requires": {} } } }, "@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.1.tgz", - "integrity": "sha512-JTzMQz//INahTALkvXnC5lC2fJKzwb5PY443T2zaM9hAzM7nzHMLIlEfFgdtBahVIBtBSalMefdxNr99LGW1lQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.2.tgz", + "integrity": "sha512-9bEvSC8hIkdqHwehYIADcwC7/TvuJeb1hAw0STI7BMRVE57nFxHyXY+WzfLPXtmhpdFqGcKJIyQkDcenQI3Sow==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", + "@csstools/media-query-list-parser": "^4.0.0" }, "dependencies": { "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true }, "@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.0.tgz", + "integrity": "sha512-nUfbCGeqCju55Po8ujRNQ8DjuKYth5UcsDj5HsVzSfqnaFdpOwYCUAhRJ2grfwrXhb9+KuRXHQ6JHzaI0Qhu8Q==", "dev": true, "requires": {} } @@ -28167,46 +28167,46 @@ } }, "@csstools/postcss-oklab-function": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.2.tgz", - "integrity": "sha512-2iSK/T77PHMeorakBAk/WLxSodfIJ/lmi6nxEkuruXfhGH7fByZim4Fw6ZJf4B73SVieRSH2ep8zvYkA2ZfRtA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.3.tgz", + "integrity": "sha512-BrhnL98OSpWt5EOMk5Hm+kL0kjA8BhBc9DGG0jYgww1GhWItn+L/McQ4WgHE2cm9+jSUE2OMy/31WvSRKhWpnQ==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -28221,46 +28221,46 @@ } }, "@csstools/postcss-relative-color-syntax": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.2.tgz", - "integrity": "sha512-aBpuUdpJBswNGfw6lOkhown2cZ0YXrMjASye56nkoRpgRe9yDF4BM1fvEuakrCDiaeoUzVaI4SF6+344BflXfQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.3.tgz", + "integrity": "sha512-1VYBTdGiFSOFrlczaYcUNybCU3XZRL9DDY3ooYRkvweWJZas8dQVHi6vy9SUmxnk0vfGbMbrISXLOIHw4LjKDg==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -28275,34 +28275,34 @@ } }, "@csstools/postcss-stepped-value-functions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.1.tgz", - "integrity": "sha512-dk3KqVcIEYzy9Mvx8amoBbk123BWgd5DfjXDiPrEqxGma37PG7m/MoMmHQhuVHIjvPDHoJwyIZi2yy7j0RA5fw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.2.tgz", + "integrity": "sha512-AxLKGIV0zYIAkeN02fo4o/vcG39WEZjT9dXs78ajy87dM94OFNIu5huxqBgkFGKLiXhQIKBRxAF/MtJmuIWi8w==", "dev": true, "requires": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -28318,34 +28318,34 @@ } }, "@csstools/postcss-trigonometric-functions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.1.tgz", - "integrity": "sha512-QHOYuN3bzS/rcpAygFhJxJUtD8GuJEWF6f9Zm518Tq/cSMlcTgU+v0geyi5EqbmYxKMig2oKCKUSGqOj9gehkg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.2.tgz", + "integrity": "sha512-hQzJkTWNvHKGYa5ySpdex2K/ODX6bI3z8Pmdl3W/opRlaXMA7Xvq7Nagp31BTkr1ngzfnqTY9XNKEI2FqaO3fg==", "dev": true, "requires": { - "@csstools/css-calc": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-calc": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -37333,46 +37333,46 @@ } }, "postcss-color-functional-notation": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.2.tgz", - "integrity": "sha512-c2WkR0MS73s+P5SgY1KBaSEE61Rj+miW095rkWDnMQxbTCQkp6y/jft8U0QMxEsI4k1Pd4PdV+TP9/1zIDR6XQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.3.tgz", + "integrity": "sha512-mL3LVOwXr5sRX1N5so7AFCNciaYTNTxzXuv5bDoZ/JunV2NCAzGOuVfyICRKczDPFImoIuL4e0O33/zYap9D0w==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -37461,70 +37461,70 @@ } }, "postcss-custom-properties": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.1.tgz", - "integrity": "sha512-SB4GjuZjIq5GQFNbxFrirQPbkdbJooyNy8bh+fcJ8ZG0oasJTflTTtR4geb56h+FBVDIb9Hx4v/NiG2caOj8nQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.2.tgz", + "integrity": "sha512-ZDJLIXa6uT6FlK6mYdzHxr1fr5ec6lPbp/CZ5+7EZedFmfjJx1fvYQhAPCBebuyc1lkketmiA26ZVl2UkPQ9Ig==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/cascade-layer-name-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/utilities": "^2.0.0", "postcss-value-parser": "^4.2.0" }, "dependencies": { "@csstools/cascade-layer-name-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.1.tgz", - "integrity": "sha512-G9ZYN5+yr/E6xYSiy1BwOEFP5p88ZtWo8sL4NztKBkRRAwRkzVGa70M+D+fYHugMID5jkLeNt5X9jYd5EaVuyg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.2.tgz", + "integrity": "sha512-rRWNJ8n16okpQT+8RWEbPfSl8D9WVoDZGBfHkjYnMYWcC20RiMpu/iGeKqUl1hR+SQIKg6p/QJap5rZJaHtVOg==", "dev": true, "requires": {} }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } }, "postcss-custom-selectors": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.1.tgz", - "integrity": "sha512-2McIpyhAeKhUzVqrP4ZyMBpK5FuD+Y9tpQwhcof49652s7gez8057cSaOg/epYcKlztSYxb0GHfi7W5h3JoGUg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.2.tgz", + "integrity": "sha512-8y2fa+RgYHpVFtvR4h3/dHc7b0iWjT6GOpzWwB8VHJTEBdVNaqOB4FH9koa44hgRyaeDs3KTe3xP9EJf6NLvxQ==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^2.0.1", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/cascade-layer-name-parser": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "postcss-selector-parser": "^6.1.0" }, "dependencies": { "@csstools/cascade-layer-name-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.1.tgz", - "integrity": "sha512-G9ZYN5+yr/E6xYSiy1BwOEFP5p88ZtWo8sL4NztKBkRRAwRkzVGa70M+D+fYHugMID5jkLeNt5X9jYd5EaVuyg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.2.tgz", + "integrity": "sha512-rRWNJ8n16okpQT+8RWEbPfSl8D9WVoDZGBfHkjYnMYWcC20RiMpu/iGeKqUl1hR+SQIKg6p/QJap5rZJaHtVOg==", "dev": true, "requires": {} }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -37682,46 +37682,46 @@ } }, "postcss-lab-function": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.2.tgz", - "integrity": "sha512-h4ARGLIBtC1PmCHsLgTWWj8j1i1CXoaht4A5RlITDX2z9AeFBak0YlY6sdF4oJGljrep+Dg2SSccIj4QnFbRDg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.3.tgz", + "integrity": "sha512-yCBscY/dwipfvqqy7rQHbn6k18zYZy9O57JY4fGuibot6wz7pbtzRnhRlWraHBNUs+N4p2KogHv2aBsoB6G+5Q==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.2", - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", + "@csstools/css-color-parser": "^3.0.3", + "@csstools/css-parser-algorithms": "^3.0.2", + "@csstools/css-tokenizer": "^3.0.2", "@csstools/postcss-progressive-custom-properties": "^4.0.0", "@csstools/utilities": "^2.0.0" }, "dependencies": { "@csstools/css-calc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.1.tgz", - "integrity": "sha512-e59V+sNp6e5m+9WnTUydA1DQO70WuKUdseflRpWmXxocF/h5wWGIxUjxfvLtajcmwstH0vm6l0reKMzcyI757Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.0.2.tgz", + "integrity": "sha512-N70YZw+R6WDP9EEd5xAT3xd+SgZFZsllXR6kclq6U8e2thlakNpWCKhuOiWfCKU8HpeWOyL+2ArSX8uDszMytA==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.2.tgz", - "integrity": "sha512-mNg7A6HnNjlm0we/pDS9dUafOuBxcanN0TBhEGeIk6zZincuk0+mAbnBqfVs29NlvWHZ8diwTG6g5FeU8246sA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.3.tgz", + "integrity": "sha512-mnOTQ6KbQ6GHfdVHVTNXffroW0r5P5531h73bIyEzWAScGjMPQi+1XYgAydYVaZiKeXlQ4GHG9dnBWq9h7xFIQ==", "dev": true, "requires": { "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.0.1" + "@csstools/css-calc": "^2.0.2" } }, "@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.2.tgz", + "integrity": "sha512-6tC/MnlEvs5suR4Ahef4YlBccJDHZuxGsAlxXmybWjZ5jPxlzLSMlRZ9mVHSRvlD+CmtE7+hJ+UQbfXrws/rUQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.2.tgz", + "integrity": "sha512-IuTRcD53WHsXPCZ6W7ubfGqReTJ9Ra0yRRFmXYP/Re8hFYYfoIYIK4080X5luslVLWimhIeFq0hj09urVMQzTw==", "dev": true } } @@ -38234,40 +38234,40 @@ } }, "postcss-preset-env": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.0.6.tgz", - "integrity": "sha512-qixfM2wbvKJhUjJELLB8lV2UCsyrMdSXqiXHiNKMgAbNturstc80j/8MsthJeOpxYEekrCrFzcaoOJm8JRSdBg==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.0.7.tgz", + "integrity": "sha512-aUC/bMT2CULwaZ/RK1Ivzdsyv95DQCJs0dK98RTc9cZKUYIal1+85JdNwik0DXg35BKdRZM2ZwASU17PXoglsw==", "dev": true, "requires": { "@csstools/postcss-cascade-layers": "^5.0.0", - "@csstools/postcss-color-function": "^4.0.2", - "@csstools/postcss-color-mix-function": "^3.0.2", - "@csstools/postcss-content-alt-text": "^2.0.1", - "@csstools/postcss-exponential-functions": "^2.0.1", + "@csstools/postcss-color-function": "^4.0.3", + "@csstools/postcss-color-mix-function": "^3.0.3", + "@csstools/postcss-content-alt-text": "^2.0.2", + "@csstools/postcss-exponential-functions": "^2.0.2", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.2", - "@csstools/postcss-gradients-interpolation-method": "^5.0.2", - "@csstools/postcss-hwb-function": "^4.0.2", + "@csstools/postcss-gamut-mapping": "^2.0.3", + "@csstools/postcss-gradients-interpolation-method": "^5.0.3", + "@csstools/postcss-hwb-function": "^4.0.3", "@csstools/postcss-ic-unit": "^4.0.0", "@csstools/postcss-initial": "^2.0.0", "@csstools/postcss-is-pseudo-class": "^5.0.0", - "@csstools/postcss-light-dark-function": "^2.0.4", + "@csstools/postcss-light-dark-function": "^2.0.5", "@csstools/postcss-logical-float-and-clear": "^3.0.0", "@csstools/postcss-logical-overflow": "^2.0.0", "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", - "@csstools/postcss-logical-viewport-units": "^3.0.1", - "@csstools/postcss-media-minmax": "^2.0.1", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.1", + "@csstools/postcss-logical-viewport-units": "^3.0.2", + "@csstools/postcss-media-minmax": "^2.0.2", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.2", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.2", + "@csstools/postcss-oklab-function": "^4.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-relative-color-syntax": "^3.0.2", + "@csstools/postcss-relative-color-syntax": "^3.0.3", "@csstools/postcss-scope-pseudo-class": "^4.0.0", - "@csstools/postcss-stepped-value-functions": "^4.0.1", + "@csstools/postcss-stepped-value-functions": "^4.0.2", "@csstools/postcss-text-decoration-shorthand": "^4.0.1", - "@csstools/postcss-trigonometric-functions": "^4.0.1", + "@csstools/postcss-trigonometric-functions": "^4.0.2", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.19", "browserslist": "^4.23.1", @@ -38277,12 +38277,12 @@ "cssdb": "^8.1.1", "postcss-attribute-case-insensitive": "^7.0.0", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.2", + "postcss-color-functional-notation": "^7.0.3", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", - "postcss-custom-media": "^11.0.2", - "postcss-custom-properties": "^14.0.1", - "postcss-custom-selectors": "^8.0.1", + "postcss-custom-media": "^11.0.3", + "postcss-custom-properties": "^14.0.2", + "postcss-custom-selectors": "^8.0.2", "postcss-dir-pseudo-class": "^9.0.0", "postcss-double-position-gradients": "^6.0.0", "postcss-focus-visible": "^10.0.0", @@ -38290,7 +38290,7 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.2", + "postcss-lab-function": "^7.0.3", "postcss-logical": "^8.0.0", "postcss-nesting": "^13.0.0", "postcss-opacity-percentage": "^3.0.0", diff --git a/package.json b/package.json index de8dc0bf0a..9888dc83e8 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "mini-css-extract-plugin": "2.9.1", "postcss": "8.4.47", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.0.6", + "postcss-preset-env": "10.0.7", "postcss-scss": "4.0.9", "sass": "1.79.4", "sass-loader": "16.0.2", From 6b115a04257b4072f34533422e0b6a40fc942a31 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 20:36:13 +0000 Subject: [PATCH 031/230] Update dependency webpack to v5.95.0 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4e0e6cd42..d3938e0451 100644 --- a/package-lock.json +++ b/package-lock.json @@ -123,7 +123,7 @@ "ts-loader": "9.5.1", "typescript": "5.6.3", "vitest": "2.1.2", - "webpack": "5.94.0", + "webpack": "5.95.0", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.1.0", @@ -25537,9 +25537,9 @@ } }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -43283,9 +43283,9 @@ "dev": true }, "webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, "requires": { "@types/estree": "^1.0.5", diff --git a/package.json b/package.json index de8dc0bf0a..704bd58c3e 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "ts-loader": "9.5.1", "typescript": "5.6.3", "vitest": "2.1.2", - "webpack": "5.94.0", + "webpack": "5.95.0", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", "webpack-dev-server": "5.1.0", From 41f09edc8464886a0f87fcb2c80c90c1757312e4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 09:28:44 +0000 Subject: [PATCH 032/230] Update dependency @mui/x-date-pickers to v7.20.0 --- package-lock.json | 58 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4e0e6cd42..14eb88b583 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@jellyfin/sdk": "0.0.0-unstable.202410160502", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", - "@mui/x-date-pickers": "7.18.0", + "@mui/x-date-pickers": "7.20.0", "@react-hook/resize-observer": "2.0.2", "@tanstack/react-query": "5.56.2", "@tanstack/react-query-devtools": "5.56.2", @@ -1744,9 +1744,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -5271,14 +5271,14 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@mui/x-date-pickers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.18.0.tgz", - "integrity": "sha512-12tXIoMj9vpS8fS/bS3kWPCoVrH38vNGCxgplI0vOnUrN9rJuYJz3agLPJe1S0xciTw+9W8ZSe3soaW+owoz1Q==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.20.0.tgz", + "integrity": "sha512-LnijrF8IF3r7c7sAVXRX4pDurozJSMUGAJdd5xuTT7ZPQIOp5ry0kDKqx79WAjXA/ZgjropLNt/nk15GE+6ZNw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.18.0", + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0", + "@mui/x-internals": "7.20.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -5337,13 +5337,13 @@ } }, "node_modules/@mui/x-internals": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", - "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.20.0.tgz", + "integrity": "sha512-ScXdEwtnxmBEq9umeusnotfeVQnnhjOZcM2ddXyIupmzeGmgDDtEcXGyTgrS/GOc91J74g81s6eJ4UCrlYZ2sg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6" + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0" }, "engines": { "node": ">=14.0.0" @@ -27564,9 +27564,9 @@ } }, "@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -29142,13 +29142,13 @@ } }, "@mui/x-date-pickers": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.18.0.tgz", - "integrity": "sha512-12tXIoMj9vpS8fS/bS3kWPCoVrH38vNGCxgplI0vOnUrN9rJuYJz3agLPJe1S0xciTw+9W8ZSe3soaW+owoz1Q==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.20.0.tgz", + "integrity": "sha512-LnijrF8IF3r7c7sAVXRX4pDurozJSMUGAJdd5xuTT7ZPQIOp5ry0kDKqx79WAjXA/ZgjropLNt/nk15GE+6ZNw==", "requires": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6", - "@mui/x-internals": "7.18.0", + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0", + "@mui/x-internals": "7.20.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -29156,12 +29156,12 @@ } }, "@mui/x-internals": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", - "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.20.0.tgz", + "integrity": "sha512-ScXdEwtnxmBEq9umeusnotfeVQnnhjOZcM2ddXyIupmzeGmgDDtEcXGyTgrS/GOc91J74g81s6eJ4UCrlYZ2sg==", "requires": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^5.16.6" + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0" } }, "@nodelib/fs.scandir": { diff --git a/package.json b/package.json index de8dc0bf0a..21bc6e9ceb 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "@jellyfin/sdk": "0.0.0-unstable.202410160502", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", - "@mui/x-date-pickers": "7.18.0", + "@mui/x-date-pickers": "7.20.0", "@react-hook/resize-observer": "2.0.2", "@tanstack/react-query": "5.56.2", "@tanstack/react-query-devtools": "5.56.2", From 8260a0b14a2e436c344610f6e659f7376ee6217c Mon Sep 17 00:00:00 2001 From: Roi Gabay Date: Fri, 18 Oct 2024 12:29:17 +0000 Subject: [PATCH 033/230] Translated using Weblate (Hebrew) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/ --- src/strings/he.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/he.json b/src/strings/he.json index e3a8674709..813281a16c 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -1377,5 +1377,15 @@ "LabelRepository": "מאגר", "LabelSaveTrickplayLocally": "שמירת תמונות trickplay ליד המדיה", "LabelSaveTrickplayLocallyHelp": "שמירת תמונות trickplay בתיקיית המדיה תשים אותם ליד המדיה שלך למיגרציה וגישה קלה.", - "LabelRemoteClientBitrateLimit": "גבול קצב הזרמת רשת (Mbps)" + "LabelRemoteClientBitrateLimit": "גבול קצב הזרמת רשת (Mbps)", + "LabelOptionalNetworkPathHelp": "אם תיקייה זו משותפת ברשת, הגדרת הכתובת המשותפת תאפשר ללקוחות אחרים לגשת לקבצי המדיה ישירות. למשל {0} או {1}.", + "LabelOpenclDeviceHelp": "התקן OpenCL זה משמש למיפוי גוונים. משמאל לנקודה מופיע מספר הפלטפורמה, ומימינה מספר הרכיב בפלטפורמה. ערך ברירת המחדל הוא 0.0. נדרשת תוכנת FFmpeg המכילה את שיטת האצת החומרה OpenCL.", + "LabelSelectFolderGroups": "קבץ באופן אוטומטי תוכן מהתיקיות הבאות לתצוגות כגון 'סרטים', 'מוזיקה' ו-'טלויזיה'", + "LabelSelectFolderGroupsHelp": "תיקיות שאינן מסומנות יוצגו לחוד בתצוגה משלהן.", + "LabelSeriesRecordingPath": "כתובת הקלטת סדרות", + "LabelServerHostHelp": "192.168.1.100:8096 או https://myserver.com", + "LabelRemoteClientBitrateLimitHelp": "אופציונלי, גבול קצב ביטים לכל זרם לכל הרכיבים מעבר לרשת המקומית. שימוש בזה יעזור למנוע מרכיבים לבקש קצב ביטים יותר גבוה מיכולות חיבור האינטרנט שלך. עלול לגרום לעומס על מעבד השרת על מנת להמיר את קידוד הוידיאו לקצב ביטים נמוך יותר.", + "LabelRepositoryNameHelp": "שם מוגדר אישית להבדלת הרפוזיטורי הזה משאר הרפוזיטורים שנוספו לשרת שלך.", + "LabelRepositoryUrlHelp": "כתובת המניפסט של הרפוזיטורי שברצונך להוסיף.", + "LabelRequireHttpsHelp": "אם סומן, השרת יפנה בקשות HTTP ל-HTTPS אוטומטית. אין לכך השפעה אם השרת לא מאזין ל-HTTPS." } From e14f0ad0bb854e0049e056ab623672433bf409bc Mon Sep 17 00:00:00 2001 From: JP Date: Fri, 18 Oct 2024 13:22:13 +0000 Subject: [PATCH 034/230] Translated using Weblate (Lithuanian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lt/ --- src/strings/lt-lt.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index 201f9e9730..c8285f4b8f 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -18,7 +18,7 @@ "ButtonBack": "Atgal", "ButtonCancel": "Atšaukti", "ButtonGotIt": "Supratau", - "ButtonManualLogin": "Rankinis prisijungimas", + "ButtonManualLogin": "Rankinis Prisijungimas", "ButtonNextTrack": "Kitas takelis", "ButtonOk": "OK", "ButtonPause": "Pauzė", @@ -553,7 +553,7 @@ "HeaderConfigureRemoteAccess": "Nuotolinės prieigos nustatymai", "HeaderConfirmProfileDeletion": "Patvirtinti vartotojo ištrynimą", "HeaderConfirmRevokeApiKey": "Panaikinti API raktą", - "HeaderConnectToServer": "Prisijungti prie serverio", + "HeaderConnectToServer": "Prisijungti prie Serverio", "HeaderConnectionFailure": "Prisijungimo klaida", "HeaderContinueListening": "Klausytis toliau", "OptionAutomaticallyGroupSeries": "Leisti sujungti serijas, kurios yra atskiruose aplankaluose", From 4d639211168c981c4a5b25101e8ddf4640a3b193 Mon Sep 17 00:00:00 2001 From: JP Date: Fri, 18 Oct 2024 15:16:07 +0000 Subject: [PATCH 035/230] Translated using Weblate (Lithuanian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lt/ --- src/strings/lt-lt.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index c8285f4b8f..b3db1771b2 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -1164,5 +1164,10 @@ "LabelKodiMetadataEnablePathSubstitutionHelp": "Įjungti kelio pakeitimą nuotraukoms naudojant serverio kelio pakeitimo nustatymus.", "LabelKodiMetadataDateFormatHelp": "Visos datos iš NFO failų bus ištraukiamos šiuo formatu.", "AllowSegmentDeletion": "Ištrinti segmentus", - "AllowSegmentDeletionHelp": "Ištrinkite senus segmentus, kai jie buvo išsiųsti klientui. Taip išvengiama viso perkoduoto failo saugojimo diske. Veiks tik su įjungtu droseliu. Išjunkite tai, jei kyla atkūrimo problemų." + "AllowSegmentDeletionHelp": "Ištrinkite senus segmentus, kai jie buvo išsiųsti klientui. Taip išvengiama viso perkoduoto failo saugojimo diske. Veiks tik su įjungtu droseliu. Išjunkite tai, jei kyla atkūrimo problemų.", + "AirPlay": "AirPlay", + "AllowSubtitleManagement": "Leisti šiam vartotojui keisti subtitrus", + "Alternate": "Pakaitinis", + "AlternateDVD": "Pakaitinis DVD", + "Large": "Didelis" } From f2be380859120ee10fe162bde11b1e24a4004943 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 16:28:38 +0000 Subject: [PATCH 036/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 1665391d9f..a3cb8f922e 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -28,7 +28,7 @@ "ButtonPause": "Pausar", "ButtonPreviousTrack": "Faixa anterior", "ButtonQuickStartGuide": "Guia de Início Rápido", - "ButtonRefreshGuideData": "Actualizar Programação de TV", + "ButtonRefreshGuideData": "Atualizar Guia TV", "ButtonRemove": "Remover", "ButtonResetEasyPassword": "Redefinir código Easy PIN", "ButtonResume": "Continuar", @@ -83,7 +83,7 @@ "HeaderActiveRecordings": "Gravações activas", "HeaderActivity": "Atividade", "HeaderAddToCollection": "Adicionar à colecção", - "HeaderAddUpdateImage": "Adicionar/Actualizar imagem", + "HeaderAddUpdateImage": "Adicionar/Atualizar imagem", "HeaderAdditionalParts": "Partes adicionais", "HeaderApiKey": "Chave API", "HeaderApiKeys": "Chaves API", @@ -344,7 +344,7 @@ "LabelNewPassword": "Nova palavra-passe", "LabelNewPasswordConfirm": "Confirmar nova palavra-passe", "LabelNotificationEnabled": "Activar esta notificação", - "LabelNumberOfGuideDays": "Número de dias de programação de TV para transferir", + "LabelNumberOfGuideDays": "Número de dias de Guia TV a transferir", "LabelNumberOfGuideDaysHelp": "Transferir mais dias de programação de TV permite agendar com maior antecedência e ver mais listagens, no entanto, levará mais tempo a transferir. Se selecionares Automático, será escolhido o período baseado no número de canais.", "LabelOriginalAspectRatio": "Proporção original", "LabelOverview": "Sinopse", From 23c72ab8d45d0ee3913683c996e56ec7297b2f02 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 16:28:49 +0000 Subject: [PATCH 037/230] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 7fe71f14bf..66ab531ea0 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -209,7 +209,7 @@ "LabelOptionalNetworkPathHelp": "Se esta pasta for compartilhada em sua rede, fornecer o caminho de compartilhamento de rede pode permitir que clientes em outros dispositivos acessem arquivos de mídia diretamente. Por exemplo, {0} ou {1}.", "LabelOptionalNetworkPath": "Pasta de rede compartilhada", "LabelNumberOfGuideDaysHelp": "Transferir mais dias de programação de TV permite agendar com maior antecedência e ver mais listagens, no entanto, levará mais tempo a transferir. Se selecionares Automático, será escolhido o período baseado no número de canais.", - "LabelNumberOfGuideDays": "Número de dias de programação de TV para transferir", + "LabelNumberOfGuideDays": "Número de dias de Guia TV a transferir", "LabelNumber": "Número", "LabelNotificationEnabled": "Activar esta notificação", "LabelNewsCategories": "Categorias para notícias", @@ -536,7 +536,7 @@ "HeaderIdentificationCriteriaHelp": "Introduza, pelo menos, um critério de identificação.", "HeaderIdentification": "Identificação", "HeaderHttpHeaders": "Cabeçalhos HTTP", - "HeaderGuideProviders": "Fornecedores de programação de TV", + "HeaderGuideProviders": "Fornecedores de Guia TV", "HeaderDeleteTaskTrigger": "Remover tarefa agendada", "HeaderBranding": "Marca", "HeaderFrequentlyPlayed": "Reproduzido Frequentemente", @@ -842,7 +842,7 @@ "ButtonResetEasyPassword": "Redefinir código PIN", "ButtonRename": "Alterar o nome", "ButtonRemove": "Remover", - "ButtonRefreshGuideData": "Actualizar Programação de TV", + "ButtonRefreshGuideData": "Atualizar Guia TV", "ButtonQuickStartGuide": "Guia de Início Rápido", "ButtonPreviousTrack": "Faixa anterior", "ButtonPause": "Pausar", @@ -985,7 +985,7 @@ "HeaderAlert": "Alerta", "HeaderAlbumArtists": "Artistas do Álbum", "HeaderAdditionalParts": "Partes Adicionais", - "HeaderAddUpdateImage": "Adicionar/Actualizar Imagem", + "HeaderAddUpdateImage": "Adicionar/Atualizar imagem", "HeaderAddToPlaylist": "Adicionar à Lista de Reprodução", "HeaderAddToCollection": "Adicionar à Colecção", "HeaderActivity": "Atividade", From 43d79cfadec8eae79213e92f64d58d34cf897c0c Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 18:08:15 +0000 Subject: [PATCH 038/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index a3cb8f922e..f511e79355 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -79,8 +79,8 @@ "GuideProviderSelectListings": "Selecionar listas", "HeaderAccessSchedule": "Restrição horária de acesso", "HeaderAccessScheduleHelp": "Crie uma restrição horária de acesso para limitar o acesso ao Jellyfin a determinadas horas.", - "HeaderActiveDevices": "Dispositivos activos", - "HeaderActiveRecordings": "Gravações activas", + "HeaderActiveDevices": "Dispositivos ativos", + "HeaderActiveRecordings": "Gravações ativas", "HeaderActivity": "Atividade", "HeaderAddToCollection": "Adicionar à colecção", "HeaderAddUpdateImage": "Adicionar/Atualizar imagem", @@ -181,7 +181,7 @@ "HeaderSubtitleProfilesHelp": "Os perfis das legendas descrevem os formatos de legendas suportados pelo dispositivo.", "HeaderSystemDlnaProfiles": "Perfis de sistema", "HeaderTaskTriggers": "Tarefas agendadas", - "HeaderThisUserIsCurrentlyDisabled": "Este perfil está currentemente desactivado", + "HeaderThisUserIsCurrentlyDisabled": "Este utilizador está atualmente desativado", "HeaderTranscodingProfile": "Perfil da transcodificação", "HeaderTranscodingProfileHelp": "Adicione perfis de transcodificação de forma a indicar que formatos deverão ser utilizados quando a transcodificação é necessária.", "HeaderTunerDevices": "Sintonizadores", @@ -230,9 +230,9 @@ "LabelContentType": "Tipo de conteúdo", "LabelCountry": "País/Região", "LabelCriticRating": "Avaliação dos críticos", - "LabelCurrentPassword": "Palavra-passe actual", + "LabelCurrentPassword": "Palavra-passe atual", "LabelCustomCertificatePath": "Localização do certificado SSL personalizado", - "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 com um certificado e uma chave privada, para activar o suporte a ligações TLS em domínios privados.", + "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e uma chave privada para ativar o suporte TLS num domínio personalizado.", "LabelCustomCss": "Código CSS personalizado", "LabelCustomCssHelp": "Aplique o seu código CSS personalizado ao interface web.", "LabelCustomDeviceDisplayNameHelp": "Forneça um nome a ser mostrado, ou deixe em branco para utilizar o nome reportado pelo dispositivo.", @@ -254,7 +254,7 @@ "LabelEasyPinCode": "Código de acesso fácil", "LabelEmbedAlbumArtDidl": "Incorporar a arte do álbum no DIDL", "LabelEmbedAlbumArtDidlHelp": "Alguns dispositivos preferem este método para obter a capa do álbum. Noutros a reprodução pode falhar quando esta opção está activada.", - "LabelEnableAutomaticPortMap": "Activar mapeamento automático de portas", + "LabelEnableAutomaticPortMap": "Ativar mapeamento automático de portas", "LabelEnableAutomaticPortMapHelp": "Reencaminha automaticamente portas públicas do router para portas locais do servidor através de UPnP. Isto pode não funcionar com alguns modelos de router ou configurações de rede. As alterações só serão aplicadas após a reinicialização do servidor.", "LabelEnableBlastAliveMessages": "Enviar mensagens de reconhecimento", "LabelEnableBlastAliveMessagesHelp": "Activar esta opção se o servidor não for correctamente detectado por outros dispositivos UPnP na rede.", @@ -266,7 +266,7 @@ "LabelEnableDlnaPlayToHelp": "Detectar dispositivos na rede e oferecer a possibilidade de os controlar remotamente.", "LabelEnableDlnaServer": "Activar servidor DLNA", "LabelEnableDlnaServerHelp": "Permitir que dispositivos UPnP na rede naveguem e reproduzam conteúdo.", - "LabelEnableHardwareDecodingFor": "Activar descodificação por hardware para", + "LabelEnableHardwareDecodingFor": "Ativar descodificação por hardware para", "LabelEnableRealtimeMonitor": "Activar monitorização em tempo real", "LabelEnableRealtimeMonitorHelp": "Alterações aos ficheiros serão processadas imediatamente em sistemas de ficheiros suportados.", "LabelEnableSingleImageInDidlLimit": "Limitar a uma imagem incorporada", @@ -345,7 +345,7 @@ "LabelNewPasswordConfirm": "Confirmar nova palavra-passe", "LabelNotificationEnabled": "Activar esta notificação", "LabelNumberOfGuideDays": "Número de dias de Guia TV a transferir", - "LabelNumberOfGuideDaysHelp": "Transferir mais dias de programação de TV permite agendar com maior antecedência e ver mais listagens, no entanto, levará mais tempo a transferir. Se selecionares Automático, será escolhido o período baseado no número de canais.", + "LabelNumberOfGuideDaysHelp": "Transferir mais dias de Guia TV permite agendar com maior antecedência e ver mais listagens, no entanto, levará mais tempo a transferir. Se selecionares Automático, será escolhido o período baseado no número de canais.", "LabelOriginalAspectRatio": "Proporção original", "LabelOverview": "Sinopse", "LabelParentalRating": "Classificação parental", @@ -674,7 +674,7 @@ "Browse": "Procurar", "BoxRear": "Caixa (verso)", "Box": "Caixa", - "BookLibraryHelp": "Livros digitais e áudio-livros são suportados. Consulte o {0} guia de nomenclatura de livros{1}.", + "BookLibraryHelp": "São suportados audiolivros e ebooks. Consulta o {0} guia de nomenclatura de livros {1}.", "BirthLocation": "Local de nascimento", "AsManyAsPossible": "Tantos quanto possível", "Art": "Capa", @@ -795,7 +795,7 @@ "Kids": "Crianças", "Items": "Itens", "InstallingPackage": "A instalar {0} (versão {1})", - "HttpsRequiresCert": "Para activar ligações seguras, é necessário fornecer um certificado SSL em que confie. Forneça um certificado SSL ou desactive as ligações seguras.", + "HttpsRequiresCert": "Para ativares as ligações seguras, terás de fornecer um certificado SSL fiável, como o Let's Encrypt. Caso contrário, desativa as ligações seguras.", "DirectStreamHelp1": "A transmissão de vídeo é compatível com o dispositivo, mas possui um formato de áudio (DTS, Dolby TrueHD, etc.) ou número de canais de áudio incompatível. A transmissão será reempacotada sem perda em tempo real antes de ser enviada para o dispositivo. Apenas a transmissão de áudio será transcodificada.", "DirectPlaying": "Reprodução directa", "Backdrop": "Imagem de Fundo", @@ -1002,7 +1002,7 @@ "LabelImageFetchersHelp": "Active e ordene os fornecedores de imagens por ordem de preferência.", "LabelKodiMetadataUserHelp": "Autorizar que outras aplicações usem dados de visualização guardados em ficheiros NFO.", "LabelMetadataSaversHelp": "Escolhe os formatos de ficheiro a utilizar para guardar os teus metadados.", - "LabelRefreshMode": "Modo de actualização", + "LabelRefreshMode": "Modo de atualização", "LabelRemoteClientBitrateLimitHelp": "Valor-limite de taxa de transmissão para todos os dispositivos fora da rede local. Este valor é opcional e aplica-se a cada transmissão individual. Ao definir este valor previne que dispositivos peçam uma taxa de transmissão acima da sua ligação à internet. Pedir uma taxa de transmissão acima do limite da ligação implica a necessidade de transcodificar o vídeo e num aumento da carga da CPU.", "Home": "Início", "GuideProviderLogin": "Iniciar Sessão", @@ -1258,7 +1258,7 @@ "LabelLibraryPageSizeHelp": "Definir a quantidade de items a apresentar na página de uma biblioteca. Para desactivar paginação, introduza o valor 0.", "LabelLibraryPageSize": "Tamanho da página da biblioteca", "LabelEnableHttpsHelp": "Escutar na porta HTTPS configurada. Para que esta opção seja activada, é necessário fornecer um certificado válido.", - "LabelEnableHttps": "Activar HTTPS", + "LabelEnableHttps": "Ativar HTTPS", "LabelDeinterlaceMethod": "Método de desentrelaçamento", "HeaderSyncPlayEnabled": "SyncPlay ativado", "HeaderSyncPlaySelectGroup": "Junta-te a um grupo", @@ -1399,7 +1399,7 @@ "LabelUnstable": "Instável", "LabelKnownProxies": "Proxies conhecidos", "LabelIconMaxResHelp": "Resolução máxima dos ícones expostos através da propriedade 'upnp:icon'.", - "LabelCurrentStatus": "Estado actual", + "LabelCurrentStatus": "Estado atual", "KnownProxiesHelp": "Lista separada por virgulas de endereços IP, ou nomes de anfitrião, de proxies usados para ligar ao seu servidor Jellyfin. Sem esta informação os cabeçalhos \"X-Forwarded-For\" não funcionarão correctamente. É necessário reiniciar o servidor para que as alterações façam efeito.", "Image": "Imagem", "LabelTonemappingParamHelp": "Afine o algoritmo do Tone mapping. Os valores recomendado e padrão são NaN. Geralmente este campo é deixado em branco.", @@ -1456,9 +1456,9 @@ "LabelEnableIP4": "Activar IPv4", "LabelDropSubtitleHere": "Deixe aqui as legendas, ou clique para procurar.", "LabelCreateHttpPortMapHelp": "Permitir que o mapeamento automático das portas possa criar uma regra para o tráfego HTTP para além do tráfego HTTPS.", - "LabelCreateHttpPortMap": "Activar o mapeamento automático de portas para tráfego HTTP e HTTPS.", + "LabelCreateHttpPortMap": "Ativar o mapeamento automático de portas para tráfego HTTP e HTTPS.", "LabelAutomaticDiscoveryHelp": "Permitir que as aplicações possam detectar automaticamente o Jellyfin usando a porta UDP 7359.", - "LabelAutomaticDiscovery": "Activar detecção automática", + "LabelAutomaticDiscovery": "Ativar deteção automática", "LabelAutoDiscoveryTracingHelp": "Quando activado, pacotes recebidos na porta de detecção automática serão registados.", "LabelAutoDiscoveryTracing": "Activar o rastreamento de Detecção Automática.", "HeaderUploadSubtitle": "Inserir legendas", @@ -1468,7 +1468,7 @@ "HeaderDebugging": "Depuração e Rastreio", "HeaderAutoDiscovery": "Deteção de rede", "HeaderAddUser": "Adicionar utilizador", - "HeaderAddUpdateSubtitle": "Adicionar/Actualizar legendas", + "HeaderAddUpdateSubtitle": "Adicionar/Atualizar legenda", "YoutubeNotFound": "Video não encontrado.", "YoutubePlaybackError": "O video pedido não pode ser reproduzido.", "YoutubeBadRequest": "Mau pedido.", From 44fec3426571face8990b9ad91bc49a11c0157d6 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 17:02:49 +0000 Subject: [PATCH 039/230] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 66ab531ea0..5089873b05 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -208,7 +208,7 @@ "LabelOriginalAspectRatio": "Proporção da imagem original", "LabelOptionalNetworkPathHelp": "Se esta pasta for compartilhada em sua rede, fornecer o caminho de compartilhamento de rede pode permitir que clientes em outros dispositivos acessem arquivos de mídia diretamente. Por exemplo, {0} ou {1}.", "LabelOptionalNetworkPath": "Pasta de rede compartilhada", - "LabelNumberOfGuideDaysHelp": "Transferir mais dias de programação de TV permite agendar com maior antecedência e ver mais listagens, no entanto, levará mais tempo a transferir. Se selecionares Automático, será escolhido o período baseado no número de canais.", + "LabelNumberOfGuideDaysHelp": "Transferir mais dias de Guia TV permite agendar com maior antecedência e ver mais listagens, no entanto, levará mais tempo a transferir. Se selecionares Automático, será escolhido o período baseado no número de canais.", "LabelNumberOfGuideDays": "Número de dias de Guia TV a transferir", "LabelNumber": "Número", "LabelNotificationEnabled": "Activar esta notificação", @@ -311,7 +311,7 @@ "LabelEnableSingleImageInDidlLimit": "Limitar a uma imagem incorporada", "LabelEnableRealtimeMonitorHelp": "As alterações nos arquivos serão processadas imediatamente nos sistemas de arquivos suportados.", "LabelEnableRealtimeMonitor": "Activar monitorização em tempo real", - "LabelEnableHardwareDecodingFor": "Activar descodificação por hardware para", + "LabelEnableHardwareDecodingFor": "Ativar descodificação por hardware para", "LabelEnableDlnaServerHelp": "Permite que dispositivos UPnP na rede naveguem e reproduzam conteúdo.", "LabelEnableDlnaServer": "Activar servidor DLNA", "LabelEnableDlnaPlayToHelp": "Detecte dispositivos em sua rede e ofereça a capacidade de controlá-los remotamente.", @@ -323,7 +323,7 @@ "LabelEnableBlastAliveMessagesHelp": "Activar esta opção se o servidor não for convenientemente detectado por outros dispositivos UPnP na rede.", "LabelEnableBlastAliveMessages": "Enviar mensagens de reconhecimento", "LabelEnableAutomaticPortMapHelp": "Reencaminha automaticamente portas públicas do router para portas locais do servidor através de UPnP. Isto pode não funcionar com alguns modelos de router ou configurações de rede. As alterações só serão aplicadas após a reinicialização do servidor.", - "LabelEnableAutomaticPortMap": "Activar a correspondência automática de portas", + "LabelEnableAutomaticPortMap": "Ativar mapeamento automático de portas", "LabelEmbedAlbumArtDidlHelp": "Alguns dispositivos preferem este método para obter a capa do álbum. Outros pode não ser capazes de reproduzir com esta opção activada.", "LabelEmbedAlbumArtDidl": "Incorporar a capa do álbum no DIDL", "LabelEasyPinCode": "Código PIN", @@ -346,7 +346,7 @@ "LabelDefaultUser": "Utilizador por omissão", "LabelDefaultScreen": "Ecrã por omissão", "LabelDeathDate": "Data de falecimento", - "LabelRefreshMode": "Mode de actualização", + "LabelRefreshMode": "Modo de atualização", "LabelRecord": "Registo", "LabelPasswordResetProvider": "Fornecedor de redefinição da palavra-passe", "LabelMetadataSaversHelp": "Escolhe os formatos de ficheiro a utilizar para guardar os teus metadados.", @@ -368,9 +368,9 @@ "LabelCustomDeviceDisplayNameHelp": "Forneça um nome a ser mostrado, ou deixe em branco para utilizar o nome reportado pelo dispositivo.", "LabelCustomCssHelp": "Aplique seus próprios estilos personalizados na interface web.", "LabelCustomCss": "codigo CSS personalizado", - "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e um chave privada que permitem activar o suporte a ligações TLS em domínios privados.", + "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e uma chave privada para ativar o suporte TLS num domínio personalizado.", "LabelCustomCertificatePath": "Localização do certificado SSL personalizado", - "LabelCurrentPassword": "Palavra-passe actual", + "LabelCurrentPassword": "Palavra-passe atual", "LabelCriticRating": "Avaliação da crítica", "LabelCountry": "País/Região", "LabelContentType": "Tipo de conteúdo", @@ -424,7 +424,7 @@ "ImportFavoriteChannelsHelp": "Apenas os canais marcados como favoritos no dispositivo sintonizador serão importados.", "Images": "Imagens", "Identify": "Identificar", - "HttpsRequiresCert": "Para activar ligações seguras, é necessário fornecer um certificado SSL confiável. Forneça um certificado SSL ou desactive as ligações seguras.", + "HttpsRequiresCert": "Para ativares as ligações seguras, terás de fornecer um certificado SSL fiável, como o Let's Encrypt. Caso contrário, desativa as ligações seguras.", "Horizontal": "Horizontal", "HideWatchedContentFromLatestMedia": "Ocultar os títulos já vistos do conteúdo recente", "Hide": "Esconder", @@ -446,7 +446,7 @@ "HeaderTranscodingProfileHelp": "Adicionar perfis de transcodificação que indiquem que formatos deverão ser usados quando a transcodificação é necessária.", "HeaderTranscodingProfile": "Perfil da Transcodificação", "HeaderTracks": "Faixas", - "HeaderThisUserIsCurrentlyDisabled": "Este utilizador está desactivado actualmente", + "HeaderThisUserIsCurrentlyDisabled": "Este utilizador está atualmente desativado", "HeaderTaskTriggers": "Tarefas Agendadas", "HeaderSystemDlnaProfiles": "Perfis de Sistema", "HeaderSubtitleProfilesHelp": "Os perfis da legenda descrevem os formatos da legenda suportados pelo dispositivo.", @@ -907,7 +907,7 @@ "BoxRear": "Caixa (verso)", "Box": "Caixa", "Books": "Livros", - "BookLibraryHelp": "Livros de texto e áudio são suportados. Consulte o guia {0} de nomenclatura de livros {1}.", + "BookLibraryHelp": "São suportados audiolivros e ebooks. Consulta o {0} guia de nomenclatura de livros {1}.", "Blacklist": "Lista Negra", "BirthPlaceValue": "Local de nascimento: {0}", "BirthLocation": "Local de nascimento", @@ -989,8 +989,8 @@ "HeaderAddToPlaylist": "Adicionar à Lista de Reprodução", "HeaderAddToCollection": "Adicionar à Colecção", "HeaderActivity": "Atividade", - "HeaderActiveRecordings": "Gravações Activas", - "HeaderActiveDevices": "Dispositivos Activos", + "HeaderActiveRecordings": "Gravações ativas", + "HeaderActiveDevices": "Dispositivos ativos", "HeaderAccessScheduleHelp": "Crie uma restrição horária de acesso para limitar o acesso ao Jellyfin a determinadas horas.", "HeaderAccessSchedule": "Restrição Horária de Acesso", "HardwareAccelerationWarning": "Ativar a aceleração por hardware pode causar instabilidade em alguns ambientes. Certifica-te de que o teu sistema operativo e controladores de vídeo estão totalmente atualizados. Se tiveres dificuldades em reproduzir vídeo depois de ativares esta opção, terás de voltar a alterar a definição para \"Nenhum\".", @@ -1276,14 +1276,14 @@ "LabelEnableIP6": "Habilite IPv6", "LabelEnableIP4": "Habilite IPv4", "LabelDropSubtitleHere": "Solte a legenda aqui, ou clique para navegar.", - "LabelCurrentStatus": "Status atual", + "LabelCurrentStatus": "Estado atual", "LabelCreateHttpPortMapHelp": "Permita o mapeamento automático de portas para criar uma regra para o tráfego HTTP, além do tráfego HTTPS.", - "LabelCreateHttpPortMap": "Habilite o mapeamento automático de portas para tráfego HTTP e também HTTPS.", + "LabelCreateHttpPortMap": "Ativar o mapeamento automático de portas para tráfego HTTP e HTTPS.", "LabelColorTransfer": "Transferência de cor", "LabelColorSpace": "Espaço de cor", "LabelColorPrimaries": "Cores primárias", "LabelAutomaticDiscoveryHelp": "Permitir que os aplicativos detectem automaticamente o Jellyfin usando a porta UDP 7359.", - "LabelAutomaticDiscovery": "Habilitar Descoberta Automática", + "LabelAutomaticDiscovery": "Ativar deteção automática", "LabelAutoDiscoveryTracingHelp": "Quando habilitado, os pacotes recebidos na porta de descoberta automática serão registrados.", "LabelAutoDiscoveryTracing": "Ative o rastreamento de Descoberta Automática.", "LabelAlbumArtMaxResHelp": "Resolução máxima da arte do álbum exposta por meio da propriedade upnp:albumArtURI.", @@ -1299,7 +1299,7 @@ "HeaderContinueReading": "Continuar a ler", "HeaderAutoDiscovery": "Deteção de rede", "HeaderAddUser": "Adicionar utilizador", - "HeaderAddUpdateSubtitle": "Adicionar/atualizar Legenda", + "HeaderAddUpdateSubtitle": "Adicionar/Atualizar legenda", "Framerate": "Taxa de fotogramas", "Filter": "Filtro", "EveryXMinutes": "A cada {0} minutos", @@ -1332,7 +1332,7 @@ "LabelMaxDaysForNextUpHelp": "Defina a quantidade máxima de dias que um programa deve permanecer na lista 'Próximo' sem o assistir.", "LabelMaxDaysForNextUp": "Máximo de dias em 'Próximo'", "AgeValue": "Com {0} anos", - "LabelDisableCustomCss": "Desative o código CSS personalizado para temas/marcas fornecidos pelo servidor.", + "LabelDisableCustomCss": "Desativar código CSS personalizado fornecido pelo servidor.", "LabelAutomaticallyAddToCollectionHelp": "Quando pelo menos 2 filmes tiverem o mesmo nome de coleção, estes serão adicionados automaticamente à coleção.", "LabelAutomaticallyAddToCollection": "Adicionar automaticamente à coleção", "HeaderSyncPlayTimeSyncSettings": "Sincronização de tempo", From 18544938135a5641feebe6a9e266935d269260b8 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 19:12:31 +0000 Subject: [PATCH 040/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 61 +++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index f511e79355..9882b115a3 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -68,7 +68,7 @@ "Ended": "Terminado", "ErrorAddingMediaPathToVirtualFolder": "Ocorreu um erro ao adicionares a localização dos ficheiros. Certifica-te de que o caminho é valido e que o Jellyfin tem acesso ao mesmo.", "ErrorGettingTvLineups": "Ocorreu um erro ao transferir a programação de TV. Por favor, certifique-se que a sua informação está correcta e tente novamente.", - "ErrorPleaseSelectLineup": "Por favor seleccione a programação e tente novamente. Se não houver programações disponíveis, verifique se o seu nome de utilizador, palavra-passe e código postal estão correctos.", + "ErrorPleaseSelectLineup": "Seleciona a programação e tenta novamente. Se não houver programações disponíveis, verifica se o teu nome de utilizador, palavra-passe e código postal estão corretos.", "ExitFullscreen": "Sair do ecrã inteiro", "FastForward": "Avançar", "FileNotFound": "Ficheiro não encontrado.", @@ -118,7 +118,7 @@ "HeaderFeatureAccess": "Acesso a características", "HeaderFetchImages": "Obter imagens", "HeaderFrequentlyPlayed": "Reproduzido frequentemente", - "HeaderGuideProviders": "Fornecedores de programação de TV", + "HeaderGuideProviders": "Fornecedores de Guia TV", "HeaderHttpHeaders": "Cabeçalhos HTTP", "HeaderIdentification": "Identificação", "HeaderIdentificationCriteriaHelp": "Introduza, pelo menos, um critério de identificação.", @@ -163,11 +163,11 @@ "HeaderRevisionHistory": "Histórico de versões", "HeaderRunningTasks": "Tarefas em execução", "HeaderScenes": "Cenas", - "HeaderSelectCertificatePath": "Seleccione a localização do certificado", - "HeaderSelectMetadataPath": "Seleccione a localização dos metadados", + "HeaderSelectCertificatePath": "Seleciona a localização do certificado", + "HeaderSelectMetadataPath": "Seleciona a localização dos metadados", "HeaderSelectMetadataPathHelp": "Procure ou introduza a localização da pasta para guardar os metadados. O servidor requer permissões de escrita nesta pasta.", - "HeaderSelectPath": "Seleccione a localização", - "HeaderSelectServerCachePath": "Seleccione a localização da cache do servidor", + "HeaderSelectPath": "Seleciona a localização", + "HeaderSelectServerCachePath": "Seleciona a localização da cache do servidor", "HeaderSelectServerCachePathHelp": "Procure ou introduza a localização da pasta para guardar a cache do servidor. O servidor requer permissões de escrita nesta pasta.", "HeaderSelectTranscodingPath": "Selecione o Local Temporário da Transcodificação", "HeaderSelectTranscodingPathHelp": "Procure ou introduza a localização da pasta para guardar os ficheiros temporários de transcodificação. O servidor requer permissões de escrita nesta pasta.", @@ -267,7 +267,7 @@ "LabelEnableDlnaServer": "Activar servidor DLNA", "LabelEnableDlnaServerHelp": "Permitir que dispositivos UPnP na rede naveguem e reproduzam conteúdo.", "LabelEnableHardwareDecodingFor": "Ativar descodificação por hardware para", - "LabelEnableRealtimeMonitor": "Activar monitorização em tempo real", + "LabelEnableRealtimeMonitor": "Ativar monitorização em tempo real", "LabelEnableRealtimeMonitorHelp": "Alterações aos ficheiros serão processadas imediatamente em sistemas de ficheiros suportados.", "LabelEnableSingleImageInDidlLimit": "Limitar a uma imagem incorporada", "LabelEnableSingleImageInDidlLimitHelp": "Alguns dispositivos não irão renderizar corretamente se estiverem incorporadas mais que uma imagem no DIDL.", @@ -300,7 +300,7 @@ "LabelKodiMetadataDateFormatHelp": "Todas as datas presentes em ficheiros NFO serão analisadas utilizando este formato.", "LabelKodiMetadataEnableExtraThumbs": "Copiar o parâmetro 'extrafanart'para 'extrathumbs'", "LabelKodiMetadataEnableExtraThumbsHelp": "Ao transferir imagens, estas podem ser guardadas como extrafanart e extrathumbs para uma maior compatibilidade com os temas Kodi.", - "LabelKodiMetadataEnablePathSubstitution": "Activar substituição de localização", + "LabelKodiMetadataEnablePathSubstitution": "Ativar substituição de localização", "LabelKodiMetadataEnablePathSubstitutionHelp": "Activar a substituição do caminho das imagens usando as opções de substituição de caminho do servidor.", "LabelKodiMetadataSaveImagePaths": "Guardar a localização de imagens em ficheiros NFO", "LabelKodiMetadataSaveImagePathsHelp": "Esta opção é recomendada se existirem nomes de imagens que não estejam de acordo com as recomendações do Kodi.", @@ -316,8 +316,8 @@ "LabelMatchType": "Tipo de correspondência", "LabelMaxBackdropsPerItem": "Número máximo de imagens de fundo por item", "LabelMaxParentalRating": "Classificação parental máxima permitida", - "LabelMaxResumePercentage": "Percentagem máxima de visualização para permitir a retoma", - "LabelMaxResumePercentageHelp": "Os conteúdos são considerados como vistos se parados após esta percentagem da duração.", + "LabelMaxResumePercentage": "Percentagem máxima de visualização para permitir retomar", + "LabelMaxResumePercentageHelp": "Os títulos são considerados como vistos se parados após esta percentagem da duração.", "LabelMaxScreenshotsPerItem": "Número máximo de capturas de ecrã por item:", "LabelMaxStreamingBitrateHelp": "Defina uma taxa máxima de transmissão.", "LabelMessageText": "Texto da mensagem", @@ -328,8 +328,8 @@ "LabelMetadataPathHelp": "Introduza a localização para guardar capas de álbuns e metadados transferidos da Internet.", "LabelMethod": "Método", "LabelMinBackdropDownloadWidth": "Transferir imagens de fundo com este tamanho mínimo", - "LabelMinResumeDuration": "Duração mínima para permitir retoma de visualização", - "LabelMinResumeDurationHelp": "Conteúdos com duração inferior não permitirão parar e retomar a reprodução.", + "LabelMinResumeDuration": "Duração mínima para permitir retomar a reprodução", + "LabelMinResumeDurationHelp": "A duração mínima de um vídeo, em segundos, que te permite guardar o progresso e retomar a reprodução.", "LabelMinResumePercentage": "Percentagem mínima de visualização para permitir retomar", "LabelMinResumePercentageHelp": "Os títulos são considerados como não vistos se parados antes desta percentagem da duração.", "LabelMinScreenshotDownloadWidth": "Transferir capturas de ecrã com este tamanho mínimo:", @@ -741,7 +741,7 @@ "DownloadsValue": "{0} transferências", "Download": "Transferir", "DoNotRecord": "Não gravar", - "DisplayModeHelp": "Seleccione o estilo de apresentação do interface.", + "DisplayModeHelp": "Seleciona o estilo de apresentação da interface.", "DisplayMissingEpisodesWithinSeasonsHelp": "Deve também ser ativado para as bibliotecas de TV nas configurações do servidor.", "DisplayMissingEpisodesWithinSeasons": "Mostrar episódios em falta numa época", "DisplayInOtherHomeScreenSections": "Mostrar no ecrã principal em secções como 'Conteúdos recentes' ou 'Continuar a Ver'", @@ -999,7 +999,7 @@ "HeaderFetcherSettings": "Definições do fornecedor", "HeaderKodiMetadataHelp": "Para ativar ou desativar os metadados NFO, edita uma biblioteca e localiza a secção dos metadados.", "HeaderTypeImageFetchers": "Fornecedores de imagens ({0})", - "LabelImageFetchersHelp": "Active e ordene os fornecedores de imagens por ordem de preferência.", + "LabelImageFetchersHelp": "Ativa e ordena os fornecedores de imagens por ordem de preferência.", "LabelKodiMetadataUserHelp": "Autorizar que outras aplicações usem dados de visualização guardados em ficheiros NFO.", "LabelMetadataSaversHelp": "Escolhe os formatos de ficheiro a utilizar para guardar os teus metadados.", "LabelRefreshMode": "Modo de atualização", @@ -1008,7 +1008,7 @@ "GuideProviderLogin": "Iniciar Sessão", "HeaderSubtitleDownloads": "Transferir legendas", "LabelRecord": "Gravação", - "LabelMetadataDownloadersHelp": "Ative e ordene os seus fornecedores de metadados preferidos por ordem de prioridade. Os de menor prioridade só serão utilizados para preencher as informações em falta.", + "LabelMetadataDownloadersHelp": "Ativa e ordena os teus fornecedores de metadados preferidos por ordem de prioridade. Os de menor prioridade só serão utilizados para preencher as informações em falta.", "LabelMetadataReadersHelp": "Ordene as suas fontes de metadados por ordem de preferência. O primeiro ficheiro encontrado será utilizado.", "LabelMetadataReaders": "Fornecedores de metadados", "LabelPasswordResetProvider": "Fornecedor de redefinição da palavra-passe", @@ -1208,7 +1208,7 @@ "LabelXDlnaCap": "ID de capacidades do dispositivo", "LabelVaapiDeviceHelp": "Este é o nó de renderização usado para aceleração de hardware.", "LabelVaapiDevice": "Dispositivo VA-API", - "LabelTypeMetadataDownloaders": "Descarregadores de metadados ({0})", + "LabelTypeMetadataDownloaders": "Fornecedores de metadados ({0})", "LabelTheme": "Tema", "LabelTVHomeScreen": "Modo TV ecrã inicial", "LabelSubtitleDownloaders": "Fornecedores de legendas", @@ -1255,9 +1255,9 @@ "LabelRequireHttps": "Exigir HTTPS", "LabelStable": "Estável", "LabelChromecastVersion": "Versão do Google Cast", - "LabelLibraryPageSizeHelp": "Definir a quantidade de items a apresentar na página de uma biblioteca. Para desactivar paginação, introduza o valor 0.", + "LabelLibraryPageSizeHelp": "Define a quantidade de itens a apresentar na página de uma biblioteca. Para desativares a paginação, introduz o valor 0.", "LabelLibraryPageSize": "Tamanho da página da biblioteca", - "LabelEnableHttpsHelp": "Escutar na porta HTTPS configurada. Para que esta opção seja activada, é necessário fornecer um certificado válido.", + "LabelEnableHttpsHelp": "Escutar na porta HTTPS configurada. Para que esta opção seja ativada, é necessário fornecer um certificado válido.", "LabelEnableHttps": "Ativar HTTPS", "LabelDeinterlaceMethod": "Método de desentrelaçamento", "HeaderSyncPlayEnabled": "SyncPlay ativado", @@ -1328,7 +1328,7 @@ "SyncPlayAccessHelp": "A funcionalidade SyncPlay permite que sincronize a reprodução com outros dispositivos. Selecione o nível de acesso que este utilizador terá ao SyncPlay.", "Subtitle": "Legenda", "SubtitleOffset": "Desvio das Legendas", - "SubtitleDownloadersHelp": "Ative e ordene os seus fornecedores de legendas preferidos por ordem de prioridade.", + "SubtitleDownloadersHelp": "Ativa e ordena os teus fornecedores de legendas preferidos por ordem de prioridade.", "SubtitleAppearanceSettingsDisclaimer": "Estas definições não se aplicam a legendas gráficas mencionadas acima ou a legendas ASS/SSA com estilos próprios incorporados.", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Estas definições também se aplicam à reprodução através do Google Cast iniciada por este dispositivo.", "SpecialFeatures": "Faixas Especiais", @@ -1389,7 +1389,7 @@ "MessageSyncPlayUserJoined": "{0} juntou-se ao grupo.", "MessageSyncPlayDisabled": "SyncPlay desativado.", "MessageSyncPlayEnabled": "SyncPlay ativo.", - "MessageNoGenresAvailable": "Ative alguns fornecedores de metadados para obter géneros da internet.", + "MessageNoGenresAvailable": "Ativa alguns fornecedores de metadados para obter géneros da internet.", "MessageAddRepository": "Caso deseje adicionar um repositório, carregue no botão ao lado do cabeçalho e preencha a informação pedida.", "LabelRepositoryNameHelp": "Nome personalizado para distinguir este repositório de outros presentes no servidor.", "LabelRepositoryName": "Nome do Repositório", @@ -1450,10 +1450,10 @@ "LabelH265Crf": "CRF para codificação H.265", "LabelEnableSSDPTracingHelp": "Activar o rastreamento detalhado da rede SSDP.
AVISO: Esta opção causará uma grande degradação no desempenho.", "LabelEnableSSDPTracing": "Activar o Rastreamento de SSDP", - "LabelEnableIP6Help": "Activar a funcionalidade IPv6.", - "LabelEnableIP6": "Activar IPv6", - "LabelEnableIP4Help": "Activar a funcionalidade IPv4.", - "LabelEnableIP4": "Activar IPv4", + "LabelEnableIP6Help": "Ativar a funcionalidade IPv6.", + "LabelEnableIP6": "Ativar IPv6", + "LabelEnableIP4Help": "Ativar a funcionalidade IPv4.", + "LabelEnableIP4": "Ativar IPv4", "LabelDropSubtitleHere": "Deixe aqui as legendas, ou clique para procurar.", "LabelCreateHttpPortMapHelp": "Permitir que o mapeamento automático das portas possa criar uma regra para o tráfego HTTP para além do tráfego HTTPS.", "LabelCreateHttpPortMap": "Ativar o mapeamento automático de portas para tráfego HTTP e HTTPS.", @@ -1487,9 +1487,9 @@ "Remuxing": "Remuxing", "LabelSyncPlayTimeSyncOffset": "Deslocamento do tempo", "LabelSyncPlayResumePlaybackDescription": "Retomar a reprodução em grupo", - "LabelMaxAudiobookResumeHelp": "Os títulos são considerados como vistos quando o valor em falta for menor que este valor.", - "LabelMinAudiobookResumeHelp": "Os áudio-livros são considerados como não ouvidos se parados antes do valor definido.", - "LabelMinAudiobookResume": "Posição mínima para permitir a retoma em minutos", + "LabelMaxAudiobookResumeHelp": "Os audiolivros são considerados como ouvidos quando o valor em falta for menor que o valor definido.", + "LabelMinAudiobookResumeHelp": "Os audiolivros são considerados como não ouvidos se parados antes do valor definido.", + "LabelMinAudiobookResume": "Duração mínima do audiolivro em minutos para permitir retomar", "LabelMaxAudiobookResume": "Minutos do áudio-livro em falta para retomar", "MessagePlaybackError": "Ocorreu um erro na reprodução deste ficheiro no se recetor Google Cast.", "MessageChromecastConnectionError": "O seu recetor Google Cast não pode contatar o servidor Jellyfin. Por favor, verifique a ligação e tente de novo.", @@ -1507,11 +1507,11 @@ "LabelSlowResponseTime": "Tempo em ms após o qual a resposta é considerada lenta", "LabelSlowResponseEnabled": "Escrever aviso no log se o servidor for muito lento a responder", "LabelOriginalName": "Nome original", - "LabelLocalCustomCss": "Estilo CSS personalizado que se aplica apenas a este cliente. Pode querer desactivar o CSS personalizado no servidor.", + "LabelLocalCustomCss": "Estilo CSS personalizado que se aplica apenas a este cliente. Podes desativar o CSS personalizado do servidor.", "LabelMaxDaysForNextUpHelp": "Definir o número máximo de dias que um programa deve permanecer na lista 'Próximos' sem que seja visto.", "LabelMaxDaysForNextUp": "Número de dias máximo na secção 'Próximo'", "LabelHardwareEncoding": "Codificação por Hardware", - "LabelDisableCustomCss": "Desactivar código CSS personalizado fornecido pelo servidor.", + "LabelDisableCustomCss": "Desativar código CSS personalizado fornecido pelo servidor.", "HeaderSyncPlayTimeSyncSettings": "Sincronização de tempo", "HeaderSyncPlayPlaybackSettings": "Reprodução", "HeaderSyncPlaySettings": "Definições de SyncPlay", @@ -1894,5 +1894,6 @@ "SaveLyricsIntoMediaFolders": "Guardar letras em pastas multimédia", "Translator": "Tradutor", "LabelSelectPreferredTranscodeVideoCodec": "Codec de vídeo transcodificado preferido", - "SelectPreferredTranscodeVideoCodecHelp": "Seleccione o codec de vídeo preferido para transcodificar. Se o codec preferido não for suportado, o servidor irá usar o melhor codec disponível a seguir." + "SelectPreferredTranscodeVideoCodecHelp": "Seleccione o codec de vídeo preferido para transcodificar. Se o codec preferido não for suportado, o servidor irá usar o melhor codec disponível a seguir.", + "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã." } From 3fd62046bdfe202be7a9b5675ed721505636dc42 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 19:16:12 +0000 Subject: [PATCH 041/230] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 61 +++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 5089873b05..9a72561e61 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -1,5 +1,5 @@ { - "HeaderTypeImageFetchers": "Pesquisadores de Imagens ({0})", + "HeaderTypeImageFetchers": "Fornecedores de imagens ({0})", "HeaderSubtitleDownloads": "Transferências de Legendas", "HeaderKodiMetadataHelp": "Para ativar ou desativar os metadados NFO, edita uma biblioteca e localiza a secção dos metadados.", "HeaderFetcherSettings": "Definições do Pesquisador", @@ -231,8 +231,8 @@ "LabelMinScreenshotDownloadWidth": "Transferir capturas de ecrã com este tamanho mínimo:", "LabelMinResumePercentageHelp": "Os títulos são considerados como não vistos se parados antes desta percentagem da duração.", "LabelMinResumePercentage": "Percentagem mínima de visualização para permitir retoma", - "LabelMinResumeDurationHelp": "Conteúdos de duração inferior não permitirão parar e retomar a reprodução.", - "LabelMinResumeDuration": "Duração mínima para permitir retoma de visualização", + "LabelMinResumeDurationHelp": "A duração mínima de um vídeo, em segundos, que te permite guardar o progresso e retomar a reprodução.", + "LabelMinResumeDuration": "Duração mínima para permitir retomar a reprodução", "LabelMinBackdropDownloadWidth": "Transferir imagens de fundo com este tamanho mínimo", "LabelMethod": "Método", "LabelEndDate": "Data de fim", @@ -247,7 +247,7 @@ "LabelMaxStreamingBitrateHelp": "Defina uma taxa máxima de transmissão.", "LabelMaxStreamingBitrate": "Qualidade máxima de transmissão", "LabelMaxScreenshotsPerItem": "Número máximo de capturas de ecrã por item:", - "LabelMaxResumePercentageHelp": "Os títulos são considerados como vistos aquando parados após esta percentagem da duração.", + "LabelMaxResumePercentageHelp": "Os títulos são considerados como vistos se parados após esta percentagem da duração.", "LabelMaxResumePercentage": "Percentagem máxima de visualização para permitir retomar", "LabelMaxParentalRating": "Controlo parental máximo permitido", "LabelMaxChromecastBitrate": "Qualidade de transmissão para Chromecast", @@ -265,8 +265,8 @@ "LabelLanNetworks": "Redes locais (LAN)", "LabelKodiMetadataSaveImagePathsHelp": "Esta opção é recomendada se existirem nomes de imagens que não estejam de acordo com as recomendações do Kodi.", "LabelKodiMetadataSaveImagePaths": "Guardar a localização de imagens em ficheiros nfo", - "LabelKodiMetadataEnablePathSubstitutionHelp": "Activa a substituição do local das imagens usando as opções de substituição de caminho no servidor.", - "LabelKodiMetadataEnablePathSubstitution": "Activar substituição de local", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Ativar a substituição da localização das imagens utilizando as opções de substituição da localização do servidor.", + "LabelKodiMetadataEnablePathSubstitution": "Ativar substituição de localização", "LabelKodiMetadataEnableExtraThumbsHelp": "Ao transferir imagens, estas podem ser guardadas como extrafanart e extrathumbs para uma maior compatibilidade com os temas Kodi.", "LabelKodiMetadataEnableExtraThumbs": "Copiar o parâmetro extrafanart para extrathumbs", "LabelKodiMetadataDateFormatHelp": "Todas as datas presentes em ficheiros NFO serão analisadas utilizando este formato.", @@ -310,7 +310,7 @@ "LabelEnableSingleImageInDidlLimitHelp": "Alguns dispositivos não interpretarão o ficheiro apropriadamente se múltiplas imagens forem incorporadas no DIDL.", "LabelEnableSingleImageInDidlLimit": "Limitar a uma imagem incorporada", "LabelEnableRealtimeMonitorHelp": "As alterações nos arquivos serão processadas imediatamente nos sistemas de arquivos suportados.", - "LabelEnableRealtimeMonitor": "Activar monitorização em tempo real", + "LabelEnableRealtimeMonitor": "Ativar monitorização em tempo real", "LabelEnableHardwareDecodingFor": "Ativar descodificação por hardware para", "LabelEnableDlnaServerHelp": "Permite que dispositivos UPnP na rede naveguem e reproduzam conteúdo.", "LabelEnableDlnaServer": "Activar servidor DLNA", @@ -351,12 +351,12 @@ "LabelPasswordResetProvider": "Fornecedor de redefinição da palavra-passe", "LabelMetadataSaversHelp": "Escolhe os formatos de ficheiro a utilizar para guardar os teus metadados.", "LabelMetadataReadersHelp": "Ordene as fontes locais de metadados por ordem de prioridade. O primeiro ficheiro a ser encontrado será lido.", - "LabelMetadataReaders": "Leirores de metadados", - "LabelMetadataDownloadersHelp": "Ative e ordene os seus fornecedores de metadados preferidos por ordem de prioridade. Os de menor prioridade só serão utilizados para preencher as informações em falta.", + "LabelMetadataReaders": "Fornecedores de metadados", + "LabelMetadataDownloadersHelp": "Ativa e ordena os teus fornecedores de metadados preferidos por ordem de prioridade. Os de menor prioridade só serão utilizados para preencher as informações em falta.", "LabelLogs": "Registos (Logs)", "LabelKodiMetadataUserHelp": "Guardar dados de utilização em NFO para que outras aplicações os utilizem.", "LabelKodiMetadataUser": "Guardar dados de utilização em NFO para", - "LabelImageFetchersHelp": "Activar e ordenar os pesquisadores de imagens por ordem de preferência.", + "LabelImageFetchersHelp": "Ativa e ordena os fornecedores de imagens por ordem de preferência.", "Home": "Início", "LabelDay": "Dia da semana", "LabelDateTimeLocale": "Formato da data/hora", @@ -467,11 +467,11 @@ "HeaderSelectTranscodingPathHelp": "Navegue ou insira o caminho a ser usado para arquivos de transcodificação. A pasta deve ser gravável.", "HeaderSelectTranscodingPath": "Seleccione o Local Temporário da Transcodificação", "HeaderSelectServerCachePathHelp": "Procure ou introduza a localização da pasta para guardar a cache do servidor. O Servidor Jellyfin deve ter acesso de escrita a essa pasta.", - "HeaderSelectServerCachePath": "Seleccione a Localização da Cache do Servidor", - "HeaderSelectPath": "Seleccione o Local", + "HeaderSelectServerCachePath": "Seleciona a localização da cache do servidor", + "HeaderSelectPath": "Seleciona a localização", "HeaderSelectMetadataPathHelp": "Navegue ou insira o caminho que deseja usar para os metadados. A pasta deve ser gravável.", - "HeaderSelectMetadataPath": "Seleccione a Localização dos Metadados", - "HeaderSelectCertificatePath": "Seleccione a Localização do Certificado", + "HeaderSelectMetadataPath": "Seleciona a localização dos metadados", + "HeaderSelectCertificatePath": "Seleciona a localização do certificado", "HeaderSecondsValue": "{0} Segundos", "HeaderSeasons": "Temporadas", "HeaderScenes": "Cenas", @@ -731,7 +731,7 @@ "ExitFullscreen": "Sair do ecrã inteiro", "EveryNDays": "A cada {0} dias", "ErrorSavingTvProvider": "Ocorreu um erro ao guardar o fornecedor de televisão. Certifique-se de que está acessível e tente novamente.", - "ErrorPleaseSelectLineup": "Por favor selecione a programação e tente novamente. Se não houver programações disponíveis, verifique se o seu nome de utilizador, senha e código postal estão correctos.", + "ErrorPleaseSelectLineup": "Seleciona a programação e tenta novamente. Se não houver programações disponíveis, verifica se o teu nome de utilizador, palavra-passe e código postal estão corretos.", "ErrorStartHourGreaterThanEnd": "A hora de fim deve ser superior à hora de início.", "ErrorGettingTvLineups": "Ocorreu um erro ao transferir a programação de TV. Por favor, certifique-se que a sua informação está correcta e tente novamente.", "ErrorDeletingItem": "Ocorreu um erro ao eliminar o item do servidor. Verifica se o Jellyfin tem acesso de escrita à pasta multimédia e tenta novamente.", @@ -764,7 +764,7 @@ "DownloadsValue": "{0} transferências", "Download": "Transferir", "DoNotRecord": "Não gravar", - "DisplayModeHelp": "Seleccione o tipo de ecrã em que o Jellyfin será utilizado.", + "DisplayModeHelp": "Seleciona o estilo de apresentação da interface.", "DisplayMissingEpisodesWithinSeasonsHelp": "Deve também ser ativado para as bibliotecas de TV nas configurações do servidor.", "DisplayMissingEpisodesWithinSeasons": "Mostrar episódios em falta numa série", "DisplayInOtherHomeScreenSections": "Mostrar no ecrã principal em secções como multimédia recente ou continue a ver", @@ -1039,7 +1039,7 @@ "MediaInfoContainer": "Recipiente", "MediaInfoAnamorphic": "Anamórfico", "LabelVideoResolution": "Resolução do vídeo", - "LabelTypeMetadataDownloaders": "Descarregadores de metadados ({0})", + "LabelTypeMetadataDownloaders": "Fornecedores de metadados ({0})", "LabelTranscodePath": "Caminho da transcodificação", "OnlyImageFormats": "Somente formatos de imagem (VOBSUB, PGS, SUB)", "OnlyForcedSubtitlesHelp": "Apenas as legendas marcadas como forçadas serão carregadas.", @@ -1131,7 +1131,7 @@ "Movie": "Filme", "LabelLibraryPageSize": "Tamanho da página da biblioteca", "Album": "Álbum", - "LabelLibraryPageSizeHelp": "Escolher a quantidade itens a exibir numa página de biblioteca. Escolha \"0\" para desabilitar a exibição em páginas.", + "LabelLibraryPageSizeHelp": "Define a quantidade de itens a apresentar na página de uma biblioteca. Para desativares a paginação, introduz o valor 0.", "Episode": "Episódio", "OptionRequirePerfectSubtitleMatch": "Baixar apenas legendas que correspondem corretamente aos arquivos de vídeo", "OptionRandom": "Aleatório", @@ -1192,7 +1192,7 @@ "LabelRequireHttpsHelp": "Se marcado, o servidor redirecionará automaticamente todas as solicitações por HTTP para HTTPS. Isso não terá efeito se o servidor não estiver escutando HTTPS.", "LabelRequireHttps": "Requer HTTPS", "LabelChromecastVersion": "Versão do Chromecast", - "LabelEnableHttpsHelp": "Obedeça a porta HTTPS configurada. Um certificado válido também deve ser fornecido para que isso tenha efeito.", + "LabelEnableHttpsHelp": "Escutar na porta HTTPS configurada. Para que esta opção seja ativada, é necessário fornecer um certificado válido.", "LabelEnableHttps": "Ativar HTTPS", "HeaderServerAddressSettings": "Definições de endereço do servidor", "HeaderRemoteAccessSettings": "Definições de acesso remoto", @@ -1257,12 +1257,12 @@ "LabelPublishedServerUri": "URIs de Servidor Publicado", "LabelOpenclDeviceHelp": "Este é o dispositivo OpenCL usado para mapeamento de tom. O lado esquerdo do ponto é o número da plataforma e o lado direito é o número do dispositivo na plataforma. O valor padrão é 0.0. O arquivo do aplicativo ffmpeg contendo o método de aceleração de hardware OpenCL é necessário.", "LabelOpenclDevice": "Dispositivo OpenCL", - "LabelMinAudiobookResumeHelp": "Os títulos são considerados não reproduzidos se parados antes desse período.", - "LabelMinAudiobookResume": "Retomada mínima em minutos de Audiolivro", + "LabelMinAudiobookResumeHelp": "Os audiolivros são considerados como não ouvidos se parados antes do valor definido.", + "LabelMinAudiobookResume": "Duração mínima do audiolivro em minutos para permitir retomar", "LabelMaxAudiobookResume": "Minutos restantes do Audiolivro para retomar", "LabelMaxMuxingQueueSizeHelp": "Número máximo de pacotes que podem ser armazenados em buffer enquanto espera que todas as transmissões sejam inicializadas. Tenta aumentá-lo se ainda encontrares o erro \"Demasiados pacotes armazenados em buffer para o fluxo de saída\" nos registos do FFmpeg. O valor recomendado é 2048.", "LabelMaxMuxingQueueSize": "Tamanho máximo da fila de muxing", - "LabelMaxAudiobookResumeHelp": "Os títulos são considerados totalmente reproduzidos se parados quando a duração restante é inferior a este valor.", + "LabelMaxAudiobookResumeHelp": "Os audiolivros são considerados como ouvidos quando o valor em falta for menor que o valor definido.", "LabelKnownProxies": "Proxies conhecidos", "LabelIsForced": "Forçado", "LabelIconMaxResHelp": "Resolução máxima dos ícones expostos por meio da propriedade upnp:icon.", @@ -1271,10 +1271,10 @@ "LabelH265Crf": "CRF da codificação H.265", "LabelEnableSSDPTracingHelp": "Habilite o registro dos detalhes do rastreamento de rede SSDP.
AVISO: Isso causará uma grave degradação do desempenho.", "LabelEnableSSDPTracing": "Habilitar Rastreamento de SSDP", - "LabelEnableIP4Help": "Ative a funcionalidade IPv4.", - "LabelEnableIP6Help": "Ative a funcionalidade IPv6.", - "LabelEnableIP6": "Habilite IPv6", - "LabelEnableIP4": "Habilite IPv4", + "LabelEnableIP4Help": "Ativar a funcionalidade IPv4.", + "LabelEnableIP6Help": "Ativar a funcionalidade IPv6.", + "LabelEnableIP6": "Ativar IPv6", + "LabelEnableIP4": "Ativar IPv4", "LabelDropSubtitleHere": "Solte a legenda aqui, ou clique para navegar.", "LabelCurrentStatus": "Estado atual", "LabelCreateHttpPortMapHelp": "Permita o mapeamento automático de portas para criar uma regra para o tráfego HTTP, além do tráfego HTTPS.", @@ -1328,7 +1328,7 @@ "LabelSlowResponseTime": "Tempo em ms após o qual uma resposta é considerada lenta", "LabelSlowResponseEnabled": "Registe uma mensagem de aviso se o servidor demorou para responder", "LabelOriginalName": "Nome Original", - "LabelLocalCustomCss": "Código CSS personalizado para estilo que se aplica apenas a este cliente. Pode desabilitar o código CSS personalizado do servidor.", + "LabelLocalCustomCss": "Estilo CSS personalizado que se aplica apenas a este cliente. Podes desativar o CSS personalizado do servidor.", "LabelMaxDaysForNextUpHelp": "Defina a quantidade máxima de dias que um programa deve permanecer na lista 'Próximo' sem o assistir.", "LabelMaxDaysForNextUp": "Máximo de dias em 'Próximo'", "AgeValue": "Com {0} anos", @@ -1499,7 +1499,7 @@ "LabelLevel": "Nível", "LabelSyncPlaySettingsMinDelaySpeedToSync": "Atraso mínimo da velocidade de sincronização", "OptionDateEpisodeAdded": "Data do episódio adicionado", - "SubtitleDownloadersHelp": "Ative e ordene os seus fornecedores de legendas preferidos por ordem de prioridade.", + "SubtitleDownloadersHelp": "Ativa e ordena os teus fornecedores de legendas preferidos por ordem de prioridade.", "Sort": "Organizar", "SmartSubtitlesHelp": "As legendas que correspondem à preferência de idioma serão carregadas quando o áudio estiver em um idioma estrangeiro.", "SubtitleMagenta": "Magenta", @@ -1644,7 +1644,7 @@ "TypeOptionPluralEpisode": "Episódios", "MediaInfoColorTransfer": "Transferência de cores", "MediaInfoVideoRange": "Gama de vídeo", - "MessageNoGenresAvailable": "Ative alguns fornecedores de metadados para obter géneros da internet.", + "MessageNoGenresAvailable": "Ativa alguns fornecedores de metadados para obter géneros da internet.", "ListView": "Lista de Exibição", "LogLevel.Warning": "Aviso", "MessageChangeRecordingPath": "Alterar sua pasta de gravação não migrará as gravações existentes do local antigo para o novo. Você precisará movê-los manualmente, se desejar.", @@ -1896,5 +1896,6 @@ "HeaderNextItem": "Seguinte {0}", "EditLyrics": "Editar letra", "HeaderAddLyrics": "Adicionar letra", - "HeaderPreviewLyrics": "Pré-visualizar letra" + "HeaderPreviewLyrics": "Pré-visualizar letra", + "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã." } From 397a61d6e3099e734851460a24bd768585846c13 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 20:58:09 +0000 Subject: [PATCH 042/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 9882b115a3..df41be0227 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -234,7 +234,7 @@ "LabelCustomCertificatePath": "Localização do certificado SSL personalizado", "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e uma chave privada para ativar o suporte TLS num domínio personalizado.", "LabelCustomCss": "Código CSS personalizado", - "LabelCustomCssHelp": "Aplique o seu código CSS personalizado ao interface web.", + "LabelCustomCssHelp": "Aplica o teu código CSS personalizado à interface web.", "LabelCustomDeviceDisplayNameHelp": "Forneça um nome a ser mostrado, ou deixe em branco para utilizar o nome reportado pelo dispositivo.", "LabelCustomRating": "Classificação personalizada", "LabelDateAdded": "Adicionado em", @@ -1894,6 +1894,6 @@ "SaveLyricsIntoMediaFolders": "Guardar letras em pastas multimédia", "Translator": "Tradutor", "LabelSelectPreferredTranscodeVideoCodec": "Codec de vídeo transcodificado preferido", - "SelectPreferredTranscodeVideoCodecHelp": "Seleccione o codec de vídeo preferido para transcodificar. Se o codec preferido não for suportado, o servidor irá usar o melhor codec disponível a seguir.", + "SelectPreferredTranscodeVideoCodecHelp": "Seleciona o codec de vídeo preferido para transcodificar. Se o codec preferido não for suportado, o servidor utilizará o próximo melhor codec disponível.", "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã." } From b6dcda147327a73cd994ae69f7536e71671d888a Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Fri, 18 Oct 2024 20:58:17 +0000 Subject: [PATCH 043/230] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 9a72561e61..219bed695e 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -366,7 +366,7 @@ "LabelDashboardTheme": "Tema do Painel Principal", "LabelCustomRating": "Classificação personalizada", "LabelCustomDeviceDisplayNameHelp": "Forneça um nome a ser mostrado, ou deixe em branco para utilizar o nome reportado pelo dispositivo.", - "LabelCustomCssHelp": "Aplique seus próprios estilos personalizados na interface web.", + "LabelCustomCssHelp": "Aplica o teu código CSS personalizado à interface web.", "LabelCustomCss": "codigo CSS personalizado", "LabelCustomCertificatePathHelp": "Localização do ficheiro PKCS #12 que contém um certificado e uma chave privada para ativar o suporte TLS num domínio personalizado.", "LabelCustomCertificatePath": "Localização do certificado SSL personalizado", @@ -1892,7 +1892,7 @@ "Regional": "Regional", "SaveLyricsIntoMediaFolders": "Guardar letras em pastas multimédia", "LabelSelectPreferredTranscodeVideoCodec": "Codec de vídeo transcodificado preferido", - "SelectPreferredTranscodeVideoCodecHelp": "Seleccione o codec de vídeo preferido para transcodificar. Se o codec preferido não for suportado, o servidor irá usar o melhor codec disponível a seguir.", + "SelectPreferredTranscodeVideoCodecHelp": "Seleciona o codec de vídeo preferido para transcodificar. Se o codec preferido não for suportado, o servidor utilizará o próximo melhor codec disponível.", "HeaderNextItem": "Seguinte {0}", "EditLyrics": "Editar letra", "HeaderAddLyrics": "Adicionar letra", From d330f93bae29f95e197fe0f3b0122249b9fa66ec Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sat, 19 Oct 2024 01:29:28 -0400 Subject: [PATCH 044/230] Revert "Add hack to prevent rerendering legacy views in development" This reverts commit 4d9ad8381fe8a11cdf3e9589228241c35366ff7f. --- src/components/viewManager/ViewManagerPage.tsx | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/components/viewManager/ViewManagerPage.tsx b/src/components/viewManager/ViewManagerPage.tsx index ada011a365..efba34f2d6 100644 --- a/src/components/viewManager/ViewManagerPage.tsx +++ b/src/components/viewManager/ViewManagerPage.tsx @@ -1,5 +1,5 @@ import { Action } from 'history'; -import { FunctionComponent, useEffect, useRef } from 'react'; +import { FunctionComponent, useEffect } from 'react'; import { useLocation, useNavigationType } from 'react-router-dom'; import globalize from 'lib/globalize'; @@ -58,13 +58,6 @@ const ViewManagerPage: FunctionComponent = ({ isThemeMediaSupported = false, transition }) => { - /** - * HACK: This is a hack to workaround intentional behavior in React strict mode when running in development. - * Legacy views will break if loaded twice so we need to avoid that. This will likely stop working in React 19. - * refs: https://stackoverflow.com/a/72238236 - */ - const isLoaded = useRef(false); - const location = useLocation(); const navigationType = useNavigationType(); @@ -98,11 +91,7 @@ const ViewManagerPage: FunctionComponent = ({ }); }; - if (!isLoaded.current) loadPage(); - - return () => { - isLoaded.current = true; - }; + loadPage(); }, // location.state and navigationType are NOT included as dependencies here since dialogs will update state while the current view stays the same // eslint-disable-next-line react-hooks/exhaustive-deps From 7abe0270b4daf3d86a633457340d919235b1b31a Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Sat, 19 Oct 2024 01:48:25 -0400 Subject: [PATCH 045/230] Do not use strict mode for view manager pages --- src/apps/dashboard/AppLayout.tsx | 66 ++++++++++++++-------------- src/apps/experimental/AppLayout.tsx | 64 ++++++++++++++------------- src/components/router/AsyncRoute.tsx | 7 ++- src/index.jsx | 6 +-- 4 files changed, 75 insertions(+), 68 deletions(-) diff --git a/src/apps/dashboard/AppLayout.tsx b/src/apps/dashboard/AppLayout.tsx index 9030465b32..46191d3fee 100644 --- a/src/apps/dashboard/AppLayout.tsx +++ b/src/apps/dashboard/AppLayout.tsx @@ -4,7 +4,7 @@ import { type Theme } from '@mui/material/styles'; import useMediaQuery from '@mui/material/useMediaQuery'; import { LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; -import React, { FC, useCallback, useEffect, useState } from 'react'; +import React, { FC, StrictMode, useCallback, useEffect, useState } from 'react'; import { Outlet, useLocation } from 'react-router-dom'; import AppBody from 'components/AppBody'; @@ -49,39 +49,41 @@ export const Component: FC = () => { return ( - - - + + - - - - + + + + + - { - isDrawerAvailable && ( - - ) - } + { + isDrawerAvailable && ( + + ) + } + { return ( - - - - - + + + + + + - { - isDrawerAvailable && ( - - ) - } + { + isDrawerAvailable && ( + + ) + } + { const { default: Page } = await importPage(page ?? path, type); return { - Component: Page + element: ( + + + + ) }; } }; diff --git a/src/index.jsx b/src/index.jsx index cbbc633ce6..1db2bcebef 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -1,7 +1,7 @@ // Import legacy browser polyfills import 'lib/legacy'; -import React, { StrictMode } from 'react'; +import React from 'react'; import { createRoot } from 'react-dom/client'; // NOTE: We need to import this first to initialize the connection @@ -268,9 +268,7 @@ async function renderApp() { const root = createRoot(container); root.render( - - - + ); } From 9c4d22b0a10978ab360c2552f65232ba536f856d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 07:30:45 +0000 Subject: [PATCH 046/230] Update dependency @jellyfin/sdk to v0.0.0-unstable.202410190501 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4e0e6cd42..c2c529fccd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410160502", + "@jellyfin/sdk": "0.0.0-unstable.202410190501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", @@ -4846,9 +4846,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202410160502", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410160502.tgz", - "integrity": "sha512-RvMrCmFIRNxsh5vvrgfYAbPreMMG0rVga1MRrdAPZqbsQ7fhoVaf2w5MkmABCAO62IAxInnKht8H61XEBfA39g==", + "version": "0.0.0-unstable.202410190501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410190501.tgz", + "integrity": "sha512-358kIN6wRfBNLy0vR3vEqcTfwPuT0gLeLEJ3AqfYD6dPZWbcdr/OtxMVJj88P0K7vshGtT7Z8LPPlI3N6cAWeg==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -28906,9 +28906,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202410160502", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410160502.tgz", - "integrity": "sha512-RvMrCmFIRNxsh5vvrgfYAbPreMMG0rVga1MRrdAPZqbsQ7fhoVaf2w5MkmABCAO62IAxInnKht8H61XEBfA39g==", + "version": "0.0.0-unstable.202410190501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410190501.tgz", + "integrity": "sha512-358kIN6wRfBNLy0vR3vEqcTfwPuT0gLeLEJ3AqfYD6dPZWbcdr/OtxMVJj88P0K7vshGtT7Z8LPPlI3N6cAWeg==", "requires": {} }, "@jridgewell/gen-mapping": { diff --git a/package.json b/package.json index de8dc0bf0a..01d9baa6a6 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410160502", + "@jellyfin/sdk": "0.0.0-unstable.202410190501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", From ceb0e8c7b06ec4b659323e2fc345674190dac6bb Mon Sep 17 00:00:00 2001 From: Roi Gabay Date: Sat, 19 Oct 2024 08:14:30 +0000 Subject: [PATCH 047/230] Translated using Weblate (Hebrew) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/ --- src/strings/he.json | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/strings/he.json b/src/strings/he.json index 813281a16c..edf81341e5 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -901,7 +901,7 @@ "HeaderAddUpdateSubtitle": "הוסף/עדכן כתוביות", "Filter": "סינון", "ExtractChapterImagesHelp": "חילוץ תמונות פרקים יאפשר לקליינטים להציג תפריט בחירת סצנות גרפי. התהליך יכול להיות איטי, לצרוך משאבי עיבוד, ואחסון (מספר GB). רץ כאשר קבצי ווידאו מתווספים לספרייה, וכמשימה מתוזמנת לילית. שעת התזמון ניתנת לשינוי באזור המשימות המתוזמנות. לא מומלץ להפעיל את התהליך בשעות שימוש.", - "SubtitleOffset": "קיזוז כתוביות", + "SubtitleOffset": "היסט כתוביות", "SubtitleAppearanceSettingsDisclaimer": "הגדרות אלו לא יחולו את קבצי כתוביות גרפיים (DVD ,PGS, וכו') או כתוביות SSA\\ASS עם סגנונות מוטמעים.", "LabelAutoDiscoveryTracing": "אפשר מעקב אחר גילוי אוטומטי.", "LabelAppNameExample": "שם לזיהוי מפתחות API. הגדרה זו לא תשנה התנהגות.", @@ -991,7 +991,7 @@ "LabelAudioBitrate": "קצב ביטים של השמע", "LabelAudioBitDepth": "עומק ביט של השמע", "LabelAllowedRemoteAddressesMode": "כתובת IP מרוחקת למצב פילטור", - "IgnoreDts": "התעלם מDTS (פענוח חותמת זמן)", + "IgnoreDts": "התעלם מDTS (פענוח נקודת זמן)", "HomeVideosPhotos": "סרטונים ביתיים ותמונות", "HeaderTuners": "טיונרים", "HeaderTunerDevices": "מכשירי טיונר", @@ -1158,7 +1158,7 @@ "TabResponses": "תגובות", "LabelNewName": "שם חדש", "LabelSize": "גודל", - "MediaInfoTimestamp": "חותמת זמן", + "MediaInfoTimestamp": "נקודת זמן", "LabelManufacturerUrl": "כתובת יצרן", "LabelModelDescription": "תיאור דגם", "LabelModelName": "שם דגם", @@ -1296,7 +1296,7 @@ "Editor": "עורך", "Creator": "יוצר", "EnableHi10p": "הפעלת פרופיל H.264 High 10", - "AllowFmp4TranscodingContainerHelp": "אפשר טרנסקודינג של fMP4 עבור מכוון זה כדי לאפשר תוכן HEVC ו-HDR. לא כל המכוונים תומכים בפורמט זה. בטל זאת אם יש בעיה בניגון.", + "AllowFmp4TranscodingContainerHelp": "אפשר המרת קידוד של fMP4 עבור מכוון זה כדי לאפשר תוכן HEVC ו-HDR. לא כל המכוונים תומכים בפורמט זה. בטל זאת אם יש בעיה בניגון.", "AllowStreamSharingHelp": "אפשר ל-Jellyfin לשכפל את זרם mpgets מהמכוון ולשתףללקוחות. זה עוזר כשהמכוון מוגבל במספר הזרמים אך עלול לגרום לבעיות בניגון.", "AlwaysRemuxFlacAudioFilesHelp": "אם יש לך קבצים שהדפדפן מסרב להציג או מראה זמנים שגויים, ניתן להפעיל זאת כפתרון חלופי.", "AlwaysRemuxMp3AudioFilesHelp": "אם יש לך קבצים שהדפדפן מראה עבורם זמנים שגויים, ניתן להפעיל זאת כפתרון חלופי.", @@ -1387,5 +1387,37 @@ "LabelRemoteClientBitrateLimitHelp": "אופציונלי, גבול קצב ביטים לכל זרם לכל הרכיבים מעבר לרשת המקומית. שימוש בזה יעזור למנוע מרכיבים לבקש קצב ביטים יותר גבוה מיכולות חיבור האינטרנט שלך. עלול לגרום לעומס על מעבד השרת על מנת להמיר את קידוד הוידיאו לקצב ביטים נמוך יותר.", "LabelRepositoryNameHelp": "שם מוגדר אישית להבדלת הרפוזיטורי הזה משאר הרפוזיטורים שנוספו לשרת שלך.", "LabelRepositoryUrlHelp": "כתובת המניפסט של הרפוזיטורי שברצונך להוסיף.", - "LabelRequireHttpsHelp": "אם סומן, השרת יפנה בקשות HTTP ל-HTTPS אוטומטית. אין לכך השפעה אם השרת לא מאזין ל-HTTPS." + "LabelRequireHttpsHelp": "אם סומן, השרת יפנה בקשות HTTP ל-HTTPS אוטומטית. אין לכך השפעה אם השרת לא מאזין ל-HTTPS.", + "LabelSyncPlaySettingsMaxDelaySpeedToSyncHelp": "עיכוב ניגון מקסימלי (במילישניות) שממנו דלג-לסנכרון יהיה בשימוש במקום האץ-לסנכרון.", + "LabelSyncPlaySettingsSpeedToSyncDuration": "משך זמן האץ-לסנכרון", + "LabelSkipIfAudioTrackPresent": "דלג אם פס השמע הדיפולטי תואם את השפה להורדה", + "LabelSkipIfAudioTrackPresentHelp": "ביטול הסימון יבטיח שלכל הוידיאו יהיו כתוביות, ללא תלות בשפת השמע.", + "LabelSlowResponseTime": "זמן במילישניות שממנו תשובה נחשבת איטית", + "LabelSkipIfGraphicalSubsPresent": "דלג אם לוידיאו יש כתוביות מוטמעות", + "LabelSkipIfGraphicalSubsPresentHelp": "שמירת גרסאות טקסט של הכתוביות יאפשרו שליחה יותר יעילה והקטנת הסיכוי של המרת קידוד.", + "LabelSlowResponseEnabled": "כתוב הודעת אזהרה אם השרת ענה לאט", + "LabelSortName": "מיון לפי שם", + "LabelSyncPlayAccess": "גישה לצפייה מסונכרנת", + "LabelSyncPlayHaltPlayback": "עצור ניגון מקומי", + "LabelSyncPlayHaltPlaybackDescription": "והתעלם מעדכוני רשימת ההשמעה הנוכחית", + "LabelSyncPlayLeaveGroupDescription": "השבת SyncPlay", + "LabelSyncPlayPlaybackDiff": "הפרש זמני ניגון", + "LabelSyncPlayResumePlayback": "המשך ניגון מקומי", + "LabelSyncPlayResumePlaybackDescription": "חזרה לניגון קבוצתי", + "LabelSyncPlayTimeSyncOffset": "היסט זמן", + "LabelSyncPlaySettingsExtraTimeOffset": "היסט זמן נוסף", + "LabelSyncPlaySettingsDescription": "שינוי העדפות צפייה מסונכרנת", + "LabelSyncPlaySettingsExtraTimeOffsetHelp": "התאמה ידנית של היסט הזמן (במילישניות) עם הרכיב הנבחר לסנכרון זמן. יש להיזהר בעת שינוי.", + "LabelSyncPlaySettingsSyncCorrectionHelp": "אפשר סנכרון אקטיבי של הניגון ע\"י האצת המדיה או מעבר לנקודה המשוערת. בטל זאת אם ישנם גמגומים.", + "LabelSyncPlaySettingsMinDelaySpeedToSync": "עיכוב מינימלי עבור האץ-לסנכרון", + "LabelSyncPlaySettingsMinDelaySpeedToSyncHelp": "עיכוב ניגון מינימלי (במילישניות) שממנו האץ-לסנכרון ינסה לתקן את מיקום הניגון.", + "LabelSyncPlaySettingsMaxDelaySpeedToSync": "עיכוב מקסימלי עבור האץ-לסנכרון", + "LabelSyncPlaySettingsSpeedToSyncDurationHelp": "מספר המילישניות שישמשו את האץ-לסנכרון כדי לתקן את מיקום הניגון.", + "LabelSyncPlaySettingsMinDelaySkipToSyncHelp": "עיכוב הניגון המינימלי (במילישניות) שממנו דלג-לסנכרון ינסה לתקן את מיקום הניגון.", + "LabelSyncPlaySettingsSpeedToSync": "אפשר האץ-לסנכרון", + "LabelSyncPlaySettingsMinDelaySkipToSync": "עיקוב מינימלי עבור דלג-לסנכרון", + "LabelSyncPlaySettingsSkipToSync": "אפשר דלג-לסנכרון", + "LabelSyncPlaySettingsSpeedToSyncHelp": "טכניקת תיקון סנכרון שמאיצה את הניגון. תיקון סנכרון חייב להיות מאופשר.", + "LabelSyncPlaySettingsSkipToSyncHelp": "טכניקת תיקון סנכרון שמדלגת למקום המשוער. תיקון סנכרון חייב להיות מאופשר.", + "LabelTonemappingAlgorithm": "בחירת אלגוריתם מיפוי הגוונים" } From 9746bdfa604dd7e6aad7f698ce21478d546e13e5 Mon Sep 17 00:00:00 2001 From: Bas <44002186+854562@users.noreply.github.com> Date: Sat, 19 Oct 2024 08:18:51 +0000 Subject: [PATCH 048/230] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index d80999d8ea..d5f5b65fb7 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -119,7 +119,7 @@ "DefaultMetadataLangaugeDescription": "Dit zijn je standaardinstellingen; deze kunnen per bibliotheek worden aangepast.", "DefaultSubtitlesHelp": "Ondertiteling wordt ingeladen op basis van de markeringen 'standaard' en 'geforceerd' in de ingesloten metadata. Indien meerdere opties aanwezig zijn zal rekening worden gehouden met de taalvoorkeuren.", "Delete": "Verwijderen", - "DeleteDeviceConfirmation": "Weet je zeker dat je dit apparaat wilt verwijderen? Het zal opnieuw verschijnen als een gebruiker zich hiermee aanmeldt.", + "DeleteDeviceConfirmation": "Weet je zeker dat je dit apparaat wilt verwijderen? Het zal opnieuw verschijnen als een gebruiker zich er een volgende keer mee aanmeldt.", "DeleteImage": "Afbeelding verwijderen", "DeleteImageConfirmation": "Weet je zeker dat je deze afbeelding wilt verwijderen?", "DeleteMedia": "Media verwijderen", @@ -623,7 +623,7 @@ "LabelRemoteClientBitrateLimitHelp": "Een optionele bitsnelheidslimiet per stream voor alle apparaten buiten het netwerk. Dit voorkomt dat apparaten een hogere bitsnelheid vragen dan je internetverbinding toelaat. Omdat video's getranscodeerd worden naar een lagere bitsnelheid, kan dit extra belasting opleveren voor de processor in je server.", "LabelRuntimeMinutes": "Speelduur", "LabelSaveLocalMetadata": "Afbeeldingen opslaan in mediamappen", - "LabelSaveLocalMetadataHelp": "Door afbeeldingen op te slaan in de mediamappen kunnen ze eenvoudiger worden aangepast.", + "LabelSaveLocalMetadataHelp": "Door afbeeldingen op te slaan in de mediamappen kunnen deze eenvoudiger worden aangepast.", "LabelScheduledTaskLastRan": "Laatste keer {0}, duur {1}.", "LabelScreensaver": "Schermbeveiliging", "LabelSeasonNumber": "Seizoensnummer", @@ -959,7 +959,7 @@ "Saturday": "Zaterdag", "Save": "Opslaan", "SaveSubtitlesIntoMediaFolders": "Ondertiteling opslaan in mediamappen", - "SaveSubtitlesIntoMediaFoldersHelp": "Het opslaan van ondertiteling in dezelfde map als de video's zorgt ervoor dat deze beter te beheren zijn.", + "SaveSubtitlesIntoMediaFoldersHelp": "Door ondertiteling naast videobestanden op te slaan kan deze eenvoudiger worden beheerd.", "ScanForNewAndUpdatedFiles": "Scannen op nieuwe en bijgewerkte bestanden", "ScanLibrary": "Bibliotheek scannen", "Schedule": "Schema", @@ -1335,7 +1335,7 @@ "EnableBlurHash": "Wazige placeholders voor afbeeldingen inschakelen", "Writers": "Scenario", "ViewAlbumArtist": "Albumartiest weergeven", - "MessageAddRepository": "Om een repository toe te voegen klik je op de knop naast de kop en vul je de gevraagde informatie in.", + "MessageAddRepository": "Om een repository toe te voegen klik je op de knop naast de titel en vul je de gevraagde informatie in.", "LabelRepositoryNameHelp": "Een zelf te configureren naam om deze repository te kunnen onderscheiden van andere repository's.", "LabelRepositoryName": "Naam repository", "LabelRepositoryUrlHelp": "De locatie van het repository-manifest dat je wilt gebruiken.", @@ -1364,7 +1364,7 @@ "UseDoubleRateDeinterlacing": "Verversingssnelheid verdubbelen bij de-interliniëren", "ThumbCard": "Miniatuurkaart", "Subtitle": "Ondertiteling", - "SpecialFeatures": "Speciale features", + "SpecialFeatures": "Speciale extra's", "SelectServer": "Server selecteren", "Restart": "Herstarten", "ResetPassword": "Wachtwoord opnieuw instellen", @@ -1431,7 +1431,7 @@ "OptionMaxActiveSessionsHelp": "Een waarde van 0 schakelt deze functie uit.", "OptionAllowContentDownload": "Mediadownloads toestaan", "HeaderDeleteDevices": "Alle apparaten verwijderen", - "DeleteDevicesConfirmation": "Weet je zeker dat je alle apparaten wilt verwijderen? Alle andere sessies zullen afgemeld worden. Apparaten zullen hier opnieuw verschijnen als een gebruiker zich de volgende keer aanmeldt.", + "DeleteDevicesConfirmation": "Weet je zeker dat je alle apparaten wilt verwijderen? Alle andere sessies zullen afgemeld worden. Apparaten zullen opnieuw verschijnen als een gebruiker zich een volgende keer aanmeldt.", "DeleteAll": "Alle verwijderen", "LabelAutoDiscoveryTracing": "Schakel Auto Discovery-tracering in.", "LabelSelectStereo": "Stereo", @@ -1879,7 +1879,7 @@ "PlaylistPublic": "Openbare toegang toestaan", "HeaderLyricDownloads": "Liedtekstdownloads", "SaveLyricsIntoMediaFolders": "Liedteksten opslaan in mediamappen", - "SaveLyricsIntoMediaFoldersHelp": "Het opslaan van liedteksten in dezelfde map als de geluidsbestanden zorgt ervoor dat deze beter te beheren zijn.", + "SaveLyricsIntoMediaFoldersHelp": "Door liedteksten naast geluidsbestanden op te slaan kunnen deze eenvoudiger worden beheerd.", "Author": "Auteur", "Colorist": "Inkleurder", "CoverArtist": "Omslagartiest", From 05ce167c77b2f792adeed10d0d5c51a0f4513d5c Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Sat, 19 Oct 2024 13:25:07 +0300 Subject: [PATCH 049/230] Fix undefined subtitle stream index --- src/components/playback/playbackmanager.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index bddc34930f..d3d74bdfc2 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2641,7 +2641,9 @@ export class PlaybackManager { } if (mediaSource.DefaultSubtitleStreamIndex == null || mediaSource.DefaultSubtitleStreamIndex < 0) { - mediaSource.DefaultSubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; + if (mediaSource.DefaultSecondarySubtitleStreamIndex != null) { + mediaSource.DefaultSubtitleStreamIndex = mediaSource.DefaultSecondarySubtitleStreamIndex; + } mediaSource.DefaultSecondarySubtitleStreamIndex = -1; } From eef48ddbadee87be039a83fdef2d6123d7b3d3c2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:36:00 +0000 Subject: [PATCH 050/230] Update tanstack-query monorepo to v5.59.13 --- package-lock.json | 62 +++++++++++++++++++++++------------------------ package.json | 4 +-- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4e0e6cd42..6e157f7d00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,8 +23,8 @@ "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.56.2", - "@tanstack/react-query-devtools": "5.56.2", + "@tanstack/react-query": "5.59.13", + "@tanstack/react-query-devtools": "5.59.13", "@types/react-lazy-load-image-component": "1.6.4", "abortcontroller-polyfill": "1.7.5", "blurhash": "2.0.5", @@ -5940,9 +5940,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.56.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.56.2.tgz", - "integrity": "sha512-gor0RI3/R5rVV3gXfddh1MM+hgl0Z4G7tj6Xxpq6p2I03NGPaJ8dITY9Gz05zYYb/EJq9vPas/T4wn9EaDPd4Q==", + "version": "5.59.13", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.13.tgz", + "integrity": "sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==", "license": "MIT", "funding": { "type": "github", @@ -5950,9 +5950,9 @@ } }, "node_modules/@tanstack/query-devtools": { - "version": "5.56.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.56.1.tgz", - "integrity": "sha512-xnp9jq/9dHfSCDmmf+A5DjbIjYqbnnUL2ToqlaaviUQGRTapXQ8J+GxusYUu1IG0vZMaWdiVUA4HRGGZYAUU+A==", + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.58.0.tgz", + "integrity": "sha512-iFdQEFXaYYxqgrv63ots+65FGI+tNp5ZS5PdMU1DWisxk3fez5HG3FyVlbUva+RdYS5hSLbxZ9aw3yEs97GNTw==", "license": "MIT", "funding": { "type": "github", @@ -5960,12 +5960,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.56.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.56.2.tgz", - "integrity": "sha512-SR0GzHVo6yzhN72pnRhkEFRAHMsUo5ZPzAxfTMvUxFIDVS6W9LYUp6nXW3fcHVdg0ZJl8opSH85jqahvm6DSVg==", + "version": "5.59.13", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.13.tgz", + "integrity": "sha512-GB2ELtiH8tL0rcFiM4sWvnXhazt1xRXX/LolMEV12kfEKu58aNA4lQoieslP61PO4vZO9JJMwm+6lqyS0E1HOA==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.56.2" + "@tanstack/query-core": "5.59.13" }, "funding": { "type": "github", @@ -5976,19 +5976,19 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.56.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.56.2.tgz", - "integrity": "sha512-7nINJtRZZVwhTTyDdMIcSaXo+EHMLYJu1S2e6FskvvD5prx87LlAXXWZDfU24Qm4HjshEtM5lS3HIOszNGblcw==", + "version": "5.59.13", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.59.13.tgz", + "integrity": "sha512-6RW9jjJPeIUxu/rAy7W2a4cCOFp46Tv2LY2pOS4m5s8vqOSvI8dkizvOq+GmLGtI2E+QjoeZbEOGKDSmqDynWg==", "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.56.1" + "@tanstack/query-devtools": "5.58.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.56.2", + "@tanstack/react-query": "^5.59.13", "react": "^18 || ^19" } }, @@ -29503,29 +29503,29 @@ } }, "@tanstack/query-core": { - "version": "5.56.2", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.56.2.tgz", - "integrity": "sha512-gor0RI3/R5rVV3gXfddh1MM+hgl0Z4G7tj6Xxpq6p2I03NGPaJ8dITY9Gz05zYYb/EJq9vPas/T4wn9EaDPd4Q==" + "version": "5.59.13", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.13.tgz", + "integrity": "sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==" }, "@tanstack/query-devtools": { - "version": "5.56.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.56.1.tgz", - "integrity": "sha512-xnp9jq/9dHfSCDmmf+A5DjbIjYqbnnUL2ToqlaaviUQGRTapXQ8J+GxusYUu1IG0vZMaWdiVUA4HRGGZYAUU+A==" + "version": "5.58.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.58.0.tgz", + "integrity": "sha512-iFdQEFXaYYxqgrv63ots+65FGI+tNp5ZS5PdMU1DWisxk3fez5HG3FyVlbUva+RdYS5hSLbxZ9aw3yEs97GNTw==" }, "@tanstack/react-query": { - "version": "5.56.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.56.2.tgz", - "integrity": "sha512-SR0GzHVo6yzhN72pnRhkEFRAHMsUo5ZPzAxfTMvUxFIDVS6W9LYUp6nXW3fcHVdg0ZJl8opSH85jqahvm6DSVg==", + "version": "5.59.13", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.13.tgz", + "integrity": "sha512-GB2ELtiH8tL0rcFiM4sWvnXhazt1xRXX/LolMEV12kfEKu58aNA4lQoieslP61PO4vZO9JJMwm+6lqyS0E1HOA==", "requires": { - "@tanstack/query-core": "5.56.2" + "@tanstack/query-core": "5.59.13" } }, "@tanstack/react-query-devtools": { - "version": "5.56.2", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.56.2.tgz", - "integrity": "sha512-7nINJtRZZVwhTTyDdMIcSaXo+EHMLYJu1S2e6FskvvD5prx87LlAXXWZDfU24Qm4HjshEtM5lS3HIOszNGblcw==", + "version": "5.59.13", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.59.13.tgz", + "integrity": "sha512-6RW9jjJPeIUxu/rAy7W2a4cCOFp46Tv2LY2pOS4m5s8vqOSvI8dkizvOq+GmLGtI2E+QjoeZbEOGKDSmqDynWg==", "requires": { - "@tanstack/query-devtools": "5.56.1" + "@tanstack/query-devtools": "5.58.0" } }, "@tanstack/react-table": { diff --git a/package.json b/package.json index de8dc0bf0a..ec0efe5df9 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,8 @@ "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.18.0", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.56.2", - "@tanstack/react-query-devtools": "5.56.2", + "@tanstack/react-query": "5.59.13", + "@tanstack/react-query-devtools": "5.59.13", "@types/react-lazy-load-image-component": "1.6.4", "abortcontroller-polyfill": "1.7.5", "blurhash": "2.0.5", From 24d361fc7ffb5f285549965171b481b37d9c967f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 14:10:18 +0000 Subject: [PATCH 051/230] Update CatChen/eslint-suggestion-action action to v4.1.7 --- .github/workflows/pull_request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 4e97c773ab..242b56ea40 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -95,6 +95,6 @@ jobs: run: npm ci --no-audit - name: Run eslint - uses: CatChen/eslint-suggestion-action@09aa3e557bafa4bebe3e026d8808bffff08e67a9 # v4.1.6 + uses: CatChen/eslint-suggestion-action@9c12109c4943f26f0676b71c9c10e456748872cf # v4.1.7 with: github-token: ${{ secrets.GITHUB_TOKEN }} From ba4be06e0013d014c3e8e43cfd55cb4036e87380 Mon Sep 17 00:00:00 2001 From: HiPotionQ8 Date: Sat, 19 Oct 2024 13:38:42 +0000 Subject: [PATCH 052/230] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index f0d7dae56c..4cc1c80b34 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1770,5 +1770,7 @@ "SubtitleBlue": "أزرق", "AllowContentWithTagsHelp": "اعرض الوسائط التي تحتوي على الأقل واحدة من الاصناف المحددة.", "AirPlay": "ايربلاي", - "Author": "الكاتب" + "Author": "الكاتب", + "Alternate": "بديل", + "AlternateDVD": "DVD بديل" } From 0fa454aef3600f6b9f753dfd8ae7332fd5d46f17 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 14:34:06 +0000 Subject: [PATCH 053/230] Update React --- package-lock.json | 65 ++++++++++++++++++++++++----------------------- package.json | 4 +-- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2c529fccd..f30911a75e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "react-blurhash": "0.3.0", "react-dom": "18.3.1", "react-lazy-load-image-component": "1.6.2", - "react-router-dom": "6.26.2", + "react-router-dom": "6.27.0", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.3", @@ -78,7 +78,7 @@ "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", "@types/react": "18.3.11", - "@types/react-dom": "18.3.0", + "@types/react-dom": "18.3.1", "@types/sortablejs": "1.15.8", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", @@ -5447,9 +5447,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", - "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", + "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -6337,10 +6337,11 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -19185,12 +19186,12 @@ } }, "node_modules/react-router": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", - "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.2" + "@remix-run/router": "1.20.0" }, "engines": { "node": ">=14.0.0" @@ -19200,13 +19201,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", - "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", + "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.2", - "react-router": "6.26.2" + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" }, "engines": { "node": ">=14.0.0" @@ -29230,9 +29231,9 @@ } }, "@remix-run/router": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", - "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==" + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", + "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==" }, "@rollup/rollup-android-arm-eabi": { "version": "4.22.4", @@ -29823,9 +29824,9 @@ } }, "@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "dev": true, "requires": { "@types/react": "*" @@ -38728,20 +38729,20 @@ } }, "react-router": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", - "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", "requires": { - "@remix-run/router": "1.19.2" + "@remix-run/router": "1.20.0" } }, "react-router-dom": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", - "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", + "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", "requires": { - "@remix-run/router": "1.19.2", - "react-router": "6.26.2" + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" } }, "react-transition-group": { diff --git a/package.json b/package.json index 01d9baa6a6..ab93798632 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", "@types/react": "18.3.11", - "@types/react-dom": "18.3.0", + "@types/react-dom": "18.3.1", "@types/sortablejs": "1.15.8", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", @@ -117,7 +117,7 @@ "react-blurhash": "0.3.0", "react-dom": "18.3.1", "react-lazy-load-image-component": "1.6.2", - "react-router-dom": "6.26.2", + "react-router-dom": "6.27.0", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.3", From effa74356b2dda4529cf89d56bcffe92d2ae646a Mon Sep 17 00:00:00 2001 From: HiPotionQ8 Date: Sat, 19 Oct 2024 14:31:14 +0000 Subject: [PATCH 054/230] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index 4cc1c80b34..e0720b8283 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -755,7 +755,7 @@ "ButtonScanAllLibraries": "فحص جميع المكتبات", "ButtonGotIt": "حسنا", "ButtonAddImage": "أضف صورة", - "BurnSubtitlesHelp": "يحدد ما إن كان الخادم سيحرق الترجمة خلال ترميز المقطع المرئي أو لا، تجنب هذا الخِيار؛ لأن سرعة عملية الترميز ستتأثر عندما تٌفعله. حدد على تلقائي لكي يُحرق الترجمة على المقطع المرئي فقط عندما تكون الصيغ الأتية (VobSub، PGS، SUB، IDX، إلخ)، كما ستُطبق على بعض الصيغ من ASS وSSA.", + "BurnSubtitlesHelp": "يحدد ما إن كان الخادم سيحرق الترجمة. تجنب هذا الخِيار يزيد سرعة عملية الترميز. حدد على تلقائي لكي يُحرق الترجمة على المقطع المرئي فقط عندما تكون الصيغ الأتية (VobSub، PGS، SUB، IDX، إلخ)، كما ستُطبق على بعض الصيغ من ASS وSSA.", "BoxRear": "العلبة (الجهة الخلفية)", "Box": "العلبة", "BookLibraryHelp": "الكتب الصوتية والنصية مدعومة. راجع {0} دليل تسمية الكتاب {1}.", From 316542c1005ef699888ca29d79f997bae5423be4 Mon Sep 17 00:00:00 2001 From: Abdul Mueid Date: Sun, 29 Sep 2024 00:25:04 +0200 Subject: [PATCH 055/230] Vidaa OS web browser reports it supports HEVC but playback is glitchy. Tested on 2 models (U7 & U8). This commit disables HEVC on Vidaa OS browser profile and uses transcoding instead to play HEVC files. With MKV disabled and hlsInTs, hevc videos work properly by remuxing on Hisense Vidaa OS. Tested on model 55U7QF. Removed force disabling hevc as it is no longer required with hlsInTs --- src/scripts/browserDeviceProfile.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index 7e2beba125..755e6e70e7 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -197,6 +197,10 @@ function canPlayAudioFormat(format) { } function testCanPlayMkv(videoTestElement) { + if (browser.vidaa) { + return false; + } + if (browser.tizen || browser.web0s) { return true; } @@ -658,7 +662,7 @@ export default function (options) { if (canPlayHevc(videoTestElement, options)) { mp4VideoCodecs.push('hevc'); - if (browser.tizen || browser.web0s) { + if (browser.tizen || browser.web0s || browser.vidaa) { hlsInTsVideoCodecs.push('hevc'); } } From 0fb38c6894d3ef405b69376417dbb0a2f7c26e64 Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Sat, 12 Oct 2024 15:43:40 +0300 Subject: [PATCH 056/230] Add 'prompt to skip' to media segments --- .../playback/constants/mediaSegmentAction.ts | 1 + .../playback/utils/mediaSegmentManager.ts | 2 + .../features/playback/utils/mediaSegments.ts | 2 +- src/components/playback/playbackmanager.js | 15 ++ src/components/playback/skipbutton.scss | 32 ++++ src/components/playback/skipsegment.ts | 162 ++++++++++++++++++ src/strings/en-us.json | 3 + 7 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 src/components/playback/skipbutton.scss create mode 100644 src/components/playback/skipsegment.ts diff --git a/src/apps/stable/features/playback/constants/mediaSegmentAction.ts b/src/apps/stable/features/playback/constants/mediaSegmentAction.ts index c1eb9652f0..87b54f4bce 100644 --- a/src/apps/stable/features/playback/constants/mediaSegmentAction.ts +++ b/src/apps/stable/features/playback/constants/mediaSegmentAction.ts @@ -3,5 +3,6 @@ */ export enum MediaSegmentAction { None = 'None', + PromptToSkip = 'PromptToSkip', Skip = 'Skip' } diff --git a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts index 7957ff2334..9618652397 100644 --- a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts +++ b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts @@ -66,6 +66,8 @@ class MediaSegmentManager extends PlaybackSubscriber { console.debug('[MediaSegmentManager] skipping to next item in queue'); this.playbackManager.nextTrack(this.player); } + } else if (action === MediaSegmentAction.PromptToSkip) { + this.playbackManager.promptToSkip(mediaSegment); } } diff --git a/src/apps/stable/features/playback/utils/mediaSegments.ts b/src/apps/stable/features/playback/utils/mediaSegments.ts index 9ea8e1bdf7..4a782453f1 100644 --- a/src/apps/stable/features/playback/utils/mediaSegments.ts +++ b/src/apps/stable/features/playback/utils/mediaSegments.ts @@ -13,7 +13,7 @@ const isBeforeSegment = (segment: MediaSegmentDto, time: number, direction: numb ); }; -const isInSegment = (segment: MediaSegmentDto, time: number) => ( +export const isInSegment = (segment: MediaSegmentDto, time: number) => ( typeof segment.StartTicks !== 'undefined' && segment.StartTicks <= time && (typeof segment.EndTicks === 'undefined' || segment.EndTicks > time) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index bddc34930f..a7a5ca4bb9 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -26,6 +26,8 @@ import { MediaError } from 'types/mediaError'; import { getMediaError } from 'utils/mediaError'; import { toApi } from 'utils/jellyfin-apiclient/compat'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind.js'; +import browser from 'scripts/browser.js'; +import { bindSkipSegment } from './skipsegment.ts'; const UNLIMITED_ITEMS = -1; @@ -933,6 +935,12 @@ export class PlaybackManager { return Promise.resolve(self._playQueueManager.getPlaylist()); }; + self.promptToSkip = function (mediaSegment) { + if (mediaSegment && this._skipSegment) { + this._skipSegment.onPromptSkip(mediaSegment); + } + }; + function removeCurrentPlayer(player) { const previousPlayer = self._currentPlayer; @@ -3666,6 +3674,9 @@ export class PlaybackManager { } bindMediaSegmentManager(self); + if (!browser.tv && !browser.xboxOne && !browser.ps4) { + this._skipSegment = bindSkipSegment(self); + } } getCurrentPlayer() { @@ -3680,6 +3691,10 @@ export class PlaybackManager { return this.getCurrentTicks(player) / 10000; } + getNextItem() { + return this._playQueueManager.getNextItemInfo(); + } + nextItem(player = this._currentPlayer) { if (player && !enableLocalPlaylistManagement(player)) { return player.nextItem(); diff --git a/src/components/playback/skipbutton.scss b/src/components/playback/skipbutton.scss new file mode 100644 index 0000000000..e3a9e0dc0b --- /dev/null +++ b/src/components/playback/skipbutton.scss @@ -0,0 +1,32 @@ +.skip-button { + display: flex; + align-items: center; + position: fixed; + bottom: 18%; + right: 16%; + z-index: 10000; + padding: 12px 20px; + color: black; + border: none; + border-radius: 100px; + font-weight: bold; + font-size: 1.2em; + transition: opacity 200ms ease-out; + gap: 3px; + box-shadow: 7px 6px 15px -14px rgba(0, 0, 0, 0.65); + cursor: pointer; +} + +@media (orientation: landscape) and (max-height: 500px) { + .skip-button { + bottom: 27%; + } +} + +.no-transition { + transition: none; +} + +.skip-button-hidden { + opacity: 0; +} diff --git a/src/components/playback/skipsegment.ts b/src/components/playback/skipsegment.ts new file mode 100644 index 0000000000..d4210350a4 --- /dev/null +++ b/src/components/playback/skipsegment.ts @@ -0,0 +1,162 @@ +import { PlaybackManager } from './playbackmanager'; +import { TICKS_PER_MILLISECOND } from 'constants/time'; +import { MediaSegmentDto, MediaSegmentType } from '@jellyfin/sdk/lib/generated-client'; +import { PlaybackSubscriber } from 'apps/stable/features/playback/utils/playbackSubscriber'; +import { isInSegment } from 'apps/stable/features/playback/utils/mediaSegments'; +import Events, { type Event } from '../../utils/events'; +import { EventType } from 'types/eventType'; +import './skipbutton.scss'; +import dom from 'scripts/dom'; +import globalize from 'lib/globalize'; + +interface ShowOptions { + animate?: boolean; + keep?: boolean; +} + +class SkipSegment extends PlaybackSubscriber { + private skipElement: HTMLButtonElement | undefined; + private currentSegment: MediaSegmentDto | null | undefined; + private hideTimeout: ReturnType | null | undefined; + + constructor(playbackManager: PlaybackManager) { + super(playbackManager); + + this.onOsdChanged = this.onOsdChanged.bind(this); + + Events.on(document, EventType.SHOW_VIDEO_OSD, this.onOsdChanged); + } + + onOsdChanged(_e: Event, isOpen: boolean) { + if (this.currentSegment) { + if (isOpen) { + this.showSkipButton({ + animate: false, + keep: true + }); + } else if (!this.hideTimeout) { + this.hideSkipButton(); + } + } + } + + onHideComplete() { + if (this.skipElement) { + this.skipElement.classList.add('hide'); + } + } + + createSkipElement() { + if (!this.skipElement && this.currentSegment) { + const elem = document.createElement('button'); + elem.classList.add('skip-button'); + elem.classList.add('hide'); + elem.classList.add('skip-button-hidden'); + + elem.addEventListener('click', () => { + if (this.currentSegment) { + this.playbackManager.seek(this.currentSegment.EndTicks); + } + }); + + document.body.appendChild(elem); + this.skipElement = elem; + } + } + + setButtonText() { + if (this.skipElement && this.currentSegment) { + if (this.player && this.currentSegment.EndTicks + && this.currentSegment.Type === MediaSegmentType.Outro + && this.currentSegment.EndTicks >= this.playbackManager.currentItem(this.player).RunTimeTicks + && this.playbackManager.getNextItem() + ) { + // Display "Next Episode" if it's an outro segment, exceeds or is equal to the runtime, and if there is a next track. + this.skipElement.innerHTML += globalize.translate('MediaSegmentNextEpisode'); + } else { + this.skipElement.innerHTML = globalize.translate('MediaSegmentSkipPrompt', globalize.translate(`MediaSegmentType.${this.currentSegment.Type}`)); + } + this.skipElement.innerHTML += ''; + } + } + + showSkipButton(options: ShowOptions) { + const elem = this.skipElement; + if (elem) { + this.clearHideTimeout(); + dom.removeEventListener(elem, dom.whichTransitionEvent(), this.onHideComplete, { + once: true + }); + elem.classList.remove('hide'); + if (!options.animate) { + elem.classList.add('no-transition'); + } else { + elem.classList.remove('no-transition'); + } + + void elem.offsetWidth; + + requestAnimationFrame(() => { + elem.classList.remove('skip-button-hidden'); + + if (!options.keep) { + this.hideTimeout = setTimeout(this.hideSkipButton.bind(this), 6000); + } + }); + } + } + + hideSkipButton() { + const elem = this.skipElement; + if (elem) { + elem.classList.remove('no-transition'); + void elem.offsetWidth; + + requestAnimationFrame(() => { + elem.classList.add('skip-button-hidden'); + + dom.addEventListener(elem, dom.whichTransitionEvent(), this.onHideComplete, { + once: true + }); + }); + } + } + + clearHideTimeout() { + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout = null; + } + } + + onPromptSkip(segment: MediaSegmentDto) { + if (!this.currentSegment) { + this.currentSegment = segment; + + this.createSkipElement(); + + this.setButtonText(); + + this.showSkipButton({ animate: true }); + } + } + + onPlayerTimeUpdate() { + if (this.currentSegment) { + const time = this.playbackManager.currentTime(this.player) * TICKS_PER_MILLISECOND; + + if (!isInSegment(this.currentSegment, time)) { + this.currentSegment = null; + this.hideSkipButton(); + } + } + } + + onPlaybackStop() { + this.currentSegment = null; + this.hideSkipButton(); + Events.off(document, EventType.SHOW_VIDEO_OSD, this.onOsdChanged); + } +} + +export const bindSkipSegment = (playbackManager: PlaybackManager) => new SkipSegment(playbackManager); diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 1adc9794c8..7ec6d03886 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1072,7 +1072,10 @@ "MediaInfoVideoRange": "Video range", "MediaIsBeingConverted": "The media is being converted into a format that is compatible with the device that is playing the media.", "MediaSegmentAction.None": "None", + "MediaSegmentAction.PromptToSkip": "Prompt To Skip", "MediaSegmentAction.Skip": "Skip", + "MediaSegmentNextEpisode": "Next Episode", + "MediaSegmentSkipPrompt": "Skip {0}", "MediaSegmentType.Commercial": "Commercial", "MediaSegmentType.Intro": "Intro", "MediaSegmentType.Outro": "Outro", From dfff2efefc66856de6d90797272511228888a740 Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:04:10 +0300 Subject: [PATCH 057/230] Don't show prompt when segment <3s --- .../playback/utils/mediaSegmentManager.ts | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts index 9618652397..d3c28bd04e 100644 --- a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts +++ b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts @@ -37,6 +37,38 @@ class MediaSegmentManager extends PlaybackSubscriber { } } + skipSegment(mediaSegment: MediaSegmentDto) { + // Ignore segment if playback progress has passed the segment's start time + if (mediaSegment.StartTicks !== undefined && this.lastTime > mediaSegment.StartTicks) { + console.info('[MediaSegmentManager] ignoring skipping segment that has been seeked back into', mediaSegment); + this.isLastSegmentIgnored = true; + } else if (mediaSegment.EndTicks) { + // If there is an end time, seek to it + // Do not skip if duration < 1s to avoid slow stream changes + if (mediaSegment.StartTicks && mediaSegment.EndTicks - mediaSegment.StartTicks < TICKS_PER_SECOND) { + console.info('[MediaSegmentManager] ignoring skipping segment with duration <1s', mediaSegment); + this.isLastSegmentIgnored = true; + return; + } + console.debug('[MediaSegmentManager] skipping to %s ms', mediaSegment.EndTicks / TICKS_PER_MILLISECOND); + this.playbackManager.seek(mediaSegment.EndTicks, this.player); + } else { + // If there is no end time, skip to the next track + console.debug('[MediaSegmentManager] skipping to next item in queue'); + this.playbackManager.nextTrack(this.player); + } + } + + promptToSkip(mediaSegment: MediaSegmentDto) { + if (mediaSegment.StartTicks && mediaSegment.EndTicks + && mediaSegment.EndTicks - mediaSegment.StartTicks < TICKS_PER_SECOND * 3) { + console.info('[MediaSegmentManager] ignoring skipping segment with duration <3s', mediaSegment); + this.isLastSegmentIgnored = true; + return; + } + this.playbackManager.promptToSkip(mediaSegment); + } + private performAction(mediaSegment: MediaSegmentDto) { if (!this.mediaSegmentTypeActions || !mediaSegment.Type || !this.mediaSegmentTypeActions[mediaSegment.Type]) { console.error('[MediaSegmentManager] segment type missing from action map', mediaSegment, this.mediaSegmentTypeActions); @@ -45,29 +77,9 @@ class MediaSegmentManager extends PlaybackSubscriber { const action = this.mediaSegmentTypeActions[mediaSegment.Type]; if (action === MediaSegmentAction.Skip) { - // Ignore segment if playback progress has passed the segment's start time - if (mediaSegment.StartTicks !== undefined && this.lastTime > mediaSegment.StartTicks) { - console.info('[MediaSegmentManager] ignoring skipping segment that has been seeked back into', mediaSegment); - this.isLastSegmentIgnored = true; - return; - } else if (mediaSegment.EndTicks) { - // If there is an end time, seek to it - // Do not skip if duration < 1s to avoid slow stream changes - if (mediaSegment.StartTicks && mediaSegment.EndTicks - mediaSegment.StartTicks < TICKS_PER_SECOND) { - console.info('[MediaSegmentManager] ignoring skipping segment with duration <1s', mediaSegment); - this.isLastSegmentIgnored = true; - return; - } - - console.debug('[MediaSegmentManager] skipping to %s ms', mediaSegment.EndTicks / TICKS_PER_MILLISECOND); - this.playbackManager.seek(mediaSegment.EndTicks, this.player); - } else { - // If there is no end time, skip to the next track - console.debug('[MediaSegmentManager] skipping to next item in queue'); - this.playbackManager.nextTrack(this.player); - } + this.skipSegment(mediaSegment); } else if (action === MediaSegmentAction.PromptToSkip) { - this.playbackManager.promptToSkip(mediaSegment); + this.promptToSkip(mediaSegment); } } From 0008f89267557f3d656854284c56c8e75d3eb49e Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Tue, 15 Oct 2024 12:52:05 +0300 Subject: [PATCH 058/230] Fix OSD event after player reset --- src/components/playback/skipsegment.ts | 35 +++++++++++++++----------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/components/playback/skipsegment.ts b/src/components/playback/skipsegment.ts index d4210350a4..fa8762dd48 100644 --- a/src/components/playback/skipsegment.ts +++ b/src/components/playback/skipsegment.ts @@ -23,21 +23,6 @@ class SkipSegment extends PlaybackSubscriber { super(playbackManager); this.onOsdChanged = this.onOsdChanged.bind(this); - - Events.on(document, EventType.SHOW_VIDEO_OSD, this.onOsdChanged); - } - - onOsdChanged(_e: Event, isOpen: boolean) { - if (this.currentSegment) { - if (isOpen) { - this.showSkipButton({ - animate: false, - keep: true - }); - } else if (!this.hideTimeout) { - this.hideSkipButton(); - } - } } onHideComplete() { @@ -129,6 +114,19 @@ class SkipSegment extends PlaybackSubscriber { } } + onOsdChanged(_e: Event, isOpen: boolean) { + if (this.currentSegment) { + if (isOpen) { + this.showSkipButton({ + animate: false, + keep: true + }); + } else if (!this.hideTimeout) { + this.hideSkipButton(); + } + } + } + onPromptSkip(segment: MediaSegmentDto) { if (!this.currentSegment) { this.currentSegment = segment; @@ -152,6 +150,13 @@ class SkipSegment extends PlaybackSubscriber { } } + onPlayerChange(): void { + if (this.playbackManager.getCurrentPlayer()) { + Events.off(document, EventType.SHOW_VIDEO_OSD, this.onOsdChanged); + Events.on(document, EventType.SHOW_VIDEO_OSD, this.onOsdChanged); + } + } + onPlaybackStop() { this.currentSegment = null; this.hideSkipButton(); From 198d4b157c1fd4bd83dd94c91744d4c54c1af6e3 Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:09:54 +0300 Subject: [PATCH 059/230] Rename to ask to skip --- .../stable/features/playback/constants/mediaSegmentAction.ts | 2 +- src/apps/stable/features/playback/utils/mediaSegmentManager.ts | 2 +- src/strings/en-us.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/stable/features/playback/constants/mediaSegmentAction.ts b/src/apps/stable/features/playback/constants/mediaSegmentAction.ts index 87b54f4bce..86a6a759f4 100644 --- a/src/apps/stable/features/playback/constants/mediaSegmentAction.ts +++ b/src/apps/stable/features/playback/constants/mediaSegmentAction.ts @@ -3,6 +3,6 @@ */ export enum MediaSegmentAction { None = 'None', - PromptToSkip = 'PromptToSkip', + AskToSkip = 'AskToSkip', Skip = 'Skip' } diff --git a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts index d3c28bd04e..faf75f9c7f 100644 --- a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts +++ b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts @@ -78,7 +78,7 @@ class MediaSegmentManager extends PlaybackSubscriber { const action = this.mediaSegmentTypeActions[mediaSegment.Type]; if (action === MediaSegmentAction.Skip) { this.skipSegment(mediaSegment); - } else if (action === MediaSegmentAction.PromptToSkip) { + } else if (action === MediaSegmentAction.AskToSkip) { this.promptToSkip(mediaSegment); } } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 7ec6d03886..d06e779771 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1072,7 +1072,7 @@ "MediaInfoVideoRange": "Video range", "MediaIsBeingConverted": "The media is being converted into a format that is compatible with the device that is playing the media.", "MediaSegmentAction.None": "None", - "MediaSegmentAction.PromptToSkip": "Prompt To Skip", + "MediaSegmentAction.AskToSkip": "Ask To Skip", "MediaSegmentAction.Skip": "Skip", "MediaSegmentNextEpisode": "Next Episode", "MediaSegmentSkipPrompt": "Skip {0}", From 64b9ab2a19d0ce14dd9c14e02c212b0598e04931 Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:10:13 +0300 Subject: [PATCH 060/230] Keep button for 8 seconds --- src/components/playback/skipsegment.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/playback/skipsegment.ts b/src/components/playback/skipsegment.ts index fa8762dd48..b3c50daf9a 100644 --- a/src/components/playback/skipsegment.ts +++ b/src/components/playback/skipsegment.ts @@ -85,7 +85,7 @@ class SkipSegment extends PlaybackSubscriber { elem.classList.remove('skip-button-hidden'); if (!options.keep) { - this.hideTimeout = setTimeout(this.hideSkipButton.bind(this), 6000); + this.hideTimeout = setTimeout(this.hideSkipButton.bind(this), 8000); } }); } From 7ad7f07b7c793ab0c7b45d83fadced17eee1bb24 Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:20:39 +0300 Subject: [PATCH 061/230] Do nothing if there is 1 second left --- src/components/playback/skipsegment.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/playback/skipsegment.ts b/src/components/playback/skipsegment.ts index b3c50daf9a..10d9e32248 100644 --- a/src/components/playback/skipsegment.ts +++ b/src/components/playback/skipsegment.ts @@ -1,5 +1,5 @@ import { PlaybackManager } from './playbackmanager'; -import { TICKS_PER_MILLISECOND } from 'constants/time'; +import { TICKS_PER_MILLISECOND, TICKS_PER_SECOND } from 'constants/time'; import { MediaSegmentDto, MediaSegmentType } from '@jellyfin/sdk/lib/generated-client'; import { PlaybackSubscriber } from 'apps/stable/features/playback/utils/playbackSubscriber'; import { isInSegment } from 'apps/stable/features/playback/utils/mediaSegments'; @@ -39,8 +39,13 @@ class SkipSegment extends PlaybackSubscriber { elem.classList.add('skip-button-hidden'); elem.addEventListener('click', () => { - if (this.currentSegment) { - this.playbackManager.seek(this.currentSegment.EndTicks); + const time = this.playbackManager.currentTime() * TICKS_PER_MILLISECOND; + if (this.currentSegment?.EndTicks) { + if (time < this.currentSegment.EndTicks - TICKS_PER_SECOND) { + this.playbackManager.seek(this.currentSegment.EndTicks); + } else { + this.hideSkipButton(); + } } }); From 386562fec83e48d4f6684bff7c1179dde26b05ad Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 17:22:41 +0000 Subject: [PATCH 062/230] Update Sass to v1.79.5 --- package-lock.json | 778 +++++++++++++++++++++++++++++++++++----------- package.json | 4 +- 2 files changed, 606 insertions(+), 176 deletions(-) diff --git a/package-lock.json b/package-lock.json index 945b9930e8..ad59c0325a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,7 +110,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.6", "postcss-scss": "4.0.9", - "sass": "1.79.4", + "sass": "1.79.5", "sass-loader": "16.0.2", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", @@ -136,7 +136,7 @@ "yarn": "YARN NO LONGER USED - use npm instead." }, "optionalDependencies": { - "sass-embedded": "1.79.4" + "sass-embedded": "1.79.5" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -5391,6 +5391,305 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -15763,6 +16062,13 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-fetch": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", @@ -19961,12 +20267,13 @@ "dev": true }, "node_modules/sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", + "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", "dev": true, "license": "MIT", "dependencies": { + "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" @@ -19979,9 +20286,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.4.tgz", - "integrity": "sha512-3AATrtStMgxYjkit02/Ix8vx/P7qderYG6DHjmehfk5jiw53OaWVScmcGJSwp/d77kAkxDQ+Y0r+79VynGmrkw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.5.tgz", + "integrity": "sha512-QFdalnjGFkbNvb6/uQGmP4OIN+GQ5/R77eu0PsXduDB1YP5JW5DSWFVDAyK6l6C54P+3J3eXkjuPYC0mcwX+AA==", "license": "MIT", "optional": true, "dependencies": { @@ -20000,32 +20307,32 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.79.4", - "sass-embedded-android-arm64": "1.79.4", - "sass-embedded-android-ia32": "1.79.4", - "sass-embedded-android-riscv64": "1.79.4", - "sass-embedded-android-x64": "1.79.4", - "sass-embedded-darwin-arm64": "1.79.4", - "sass-embedded-darwin-x64": "1.79.4", - "sass-embedded-linux-arm": "1.79.4", - "sass-embedded-linux-arm64": "1.79.4", - "sass-embedded-linux-ia32": "1.79.4", - "sass-embedded-linux-musl-arm": "1.79.4", - "sass-embedded-linux-musl-arm64": "1.79.4", - "sass-embedded-linux-musl-ia32": "1.79.4", - "sass-embedded-linux-musl-riscv64": "1.79.4", - "sass-embedded-linux-musl-x64": "1.79.4", - "sass-embedded-linux-riscv64": "1.79.4", - "sass-embedded-linux-x64": "1.79.4", - "sass-embedded-win32-arm64": "1.79.4", - "sass-embedded-win32-ia32": "1.79.4", - "sass-embedded-win32-x64": "1.79.4" + "sass-embedded-android-arm": "1.79.5", + "sass-embedded-android-arm64": "1.79.5", + "sass-embedded-android-ia32": "1.79.5", + "sass-embedded-android-riscv64": "1.79.5", + "sass-embedded-android-x64": "1.79.5", + "sass-embedded-darwin-arm64": "1.79.5", + "sass-embedded-darwin-x64": "1.79.5", + "sass-embedded-linux-arm": "1.79.5", + "sass-embedded-linux-arm64": "1.79.5", + "sass-embedded-linux-ia32": "1.79.5", + "sass-embedded-linux-musl-arm": "1.79.5", + "sass-embedded-linux-musl-arm64": "1.79.5", + "sass-embedded-linux-musl-ia32": "1.79.5", + "sass-embedded-linux-musl-riscv64": "1.79.5", + "sass-embedded-linux-musl-x64": "1.79.5", + "sass-embedded-linux-riscv64": "1.79.5", + "sass-embedded-linux-x64": "1.79.5", + "sass-embedded-win32-arm64": "1.79.5", + "sass-embedded-win32-ia32": "1.79.5", + "sass-embedded-win32-x64": "1.79.5" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.4.tgz", - "integrity": "sha512-YOVpDGDcwWUQvktpJhYo4zOkknDpdX6ALpaeHDTX6GBUvnZfx+Widh76v+QFUhiJQ/I/hndXg1jv/PKilOHRrw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.5.tgz", + "integrity": "sha512-gYtpQAE2uNFa5IBKBIzUq5ETDS6gnVRmhP5j+N5JGrOThYaGPcG4KrjlU9R3BfCmc7zP5WvlHFZsxSz+2JRT2w==", "cpu": [ "arm" ], @@ -20039,9 +20346,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.4.tgz", - "integrity": "sha512-0JAZ8TtXYv9yI3Yasaq03xvo7DLJOmD+Exb30oJKxXcWTAV9TB0ZWKoIRsFxbCyPxyn7ouxkaCEXQtaTRKrmfw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.5.tgz", + "integrity": "sha512-pq1RJTENkRmEUMLiVuSGYwuLk8zXovWzrjQxlWZTF/Jn5F7Ypi/3v5huMmgJF5n+etsxjio1PN1idaQ5tPLBmg==", "cpu": [ "arm64" ], @@ -20055,9 +20362,9 @@ } }, "node_modules/sass-embedded-android-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.4.tgz", - "integrity": "sha512-IjO3RoyvNN84ZyfAR5s/a8TIdNPfClb7CLGrswB3BN/NElYIJUJMVHD6+Y8W9QwBIZ8DrK1IdLFSTV8nn82xMA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.5.tgz", + "integrity": "sha512-CgJZjLxYRkgjTP/76WumLlF7+1aW0LA+DSEJhkVaCxe5avndRCmPrNcX0PrtYSDvUgeQDvY7xF+fT9QXN1+NgQ==", "cpu": [ "ia32" ], @@ -20071,9 +20378,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.4.tgz", - "integrity": "sha512-uOT8nXmKxSwuIdcqvElVWBFcm/+YcIvmwfoKbpuuSOSxUe9eqFzxo+fk7ILhynzf6FBlvRUH5DcjGj+sXtCc3w==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.5.tgz", + "integrity": "sha512-OLbdmDSM/eOjO01PUYbS54BQOCM/HHHHWk/4M8HHdxwF3ojy5eqQaA63R1YQ3IJvLEE7dnudofOXmL01B5+yvQ==", "cpu": [ "riscv64" ], @@ -20087,9 +20394,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.4.tgz", - "integrity": "sha512-W2FQoj3Z2J2DirNs3xSBVvrhMuqLnsqvOPulxOkhL/074+faKOZZnPx2tZ5zsHbY97SonciiU0SV0mm98xI42w==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.5.tgz", + "integrity": "sha512-UbXxk/rdR3aVBkB7Fh/eAUL7oUADWgQrYpLe9Xu5A0gmthw0/zo/pu7kweBSrbgHnPfWIt/uxwmW4eEAmqqZWQ==", "cpu": [ "x64" ], @@ -20103,9 +20410,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.4.tgz", - "integrity": "sha512-pcYtbN1VUAAcfgyHeX8ySndDWGjIvcq6rldduktPbGGuAlEWFDfnwjTbv0hS945ggdzZ6TFnaFlLEDr0SjKzBA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.5.tgz", + "integrity": "sha512-qeEl9XhYetZSY1j4nqvh3hB8tfYOAGsOQyVOCaxyX1bubMRSGPvPNIyftm14QzK7EDrE/K/0+FwCvflarOV4NQ==", "cpu": [ "arm64" ], @@ -20119,9 +20426,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.4.tgz", - "integrity": "sha512-ir8CFTfc4JLx/qCP8LK1/3pWv35nRyAQkUK7lBIKM6hWzztt64gcno9rZIk4SpHr7Z/Bp1IYWWRS4ZT+4HmsbA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.5.tgz", + "integrity": "sha512-y4pvkYCQhgruxlncub/2j+cZSmlpsZX9Rp1aTRIKvlNagqFStYzFZ6kX3CErlfCEAMYwRVEhP8z/OOoDqnjaZA==", "cpu": [ "x64" ], @@ -20135,9 +20442,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.4.tgz", - "integrity": "sha512-H/XEE3rY7c+tY0qDaELjPjC6VheAhBo1tPJQ6UHoBEf8xrbT/RT3dWiIS8grp9Vk54RCn05BEB/+POaljvvKGA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.5.tgz", + "integrity": "sha512-rX6qAR8pE1pevYhGzbCpGFexdH4z6QMnw3IeiCNmkpJ4zMXNEN336xl6SZN0xaPiGuNDhUFcq0wgSq3RDKS5vQ==", "cpu": [ "arm" ], @@ -20151,9 +20458,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.4.tgz", - "integrity": "sha512-XIVn2mCuA422SR2kmKjF6jhjMs1Vrt1DbZ/ktSp+eR0sU4ugu2htg45GajiUFSKKRj7Sc+cBdThq1zPPsDLf1w==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.5.tgz", + "integrity": "sha512-kiUbrLiNAA7vOe6kpdukRhCad1u7ebwhB0ZE63+IgF5HFZ/Qo6GkhHIrVM9AfeLxUT3N6Z4BNtgdcRa9na4Pwg==", "cpu": [ "arm64" ], @@ -20167,9 +20474,9 @@ } }, "node_modules/sass-embedded-linux-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.4.tgz", - "integrity": "sha512-3nqZxV4nuUTb1ahLexVl4hsnx1KKwiGdHEf1xHWTZai6fYFMcwyNPrHySCQzFHqb5xiqSpPzzrKjuDhF6+guuQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.5.tgz", + "integrity": "sha512-12pj3fBV0+VAX/RI6uYFxi/MoUoihRKP7iVpo9MaT/m+EtvN6mYsDpi/T4pTq2dKQYljoaFq8Rb6tR+FinS1zg==", "cpu": [ "ia32" ], @@ -20183,9 +20490,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.4.tgz", - "integrity": "sha512-HnbU1DEiQdUayioNzxh2WlbTEgQRBPTgIIvof8J63QLmVItUqE7EkWYkSUy4RhO+8NsuN9wzGmGTzFBvTImU7g==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.5.tgz", + "integrity": "sha512-EHFrbTgRymEFTf3JnjHzC24PO0WHFjLUEWUJqSuWKZw0+BCL7120MvYIrfkYymPp5UYk+STIjj+Fd9dYSWBrAg==", "cpu": [ "arm" ], @@ -20199,9 +20506,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.4.tgz", - "integrity": "sha512-C6qX06waPEfDgOHR8jXoYxl0EtIXOyBDyyonrLO3StRjWjGx7XMQj2hA/KXSsV+Hr71fBOsaViosqWXPzTbEiQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.5.tgz", + "integrity": "sha512-Qg1HuQ+ebz3wfPT7xty2G8BpDLXdyfMk7WqKd+X1DlFEcY/kcNapwMVFXS2fCYTTR3gcbIZ4p7eUiQySlkj93A==", "cpu": [ "arm64" ], @@ -20215,9 +20522,9 @@ } }, "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.4.tgz", - "integrity": "sha512-y5b0fdOPWyhj4c+mc88GvQiC5onRH1V0iNaWNjsiZ+L4hHje6T98nDLrCJn0fz5GQnXjyLCLZduMWbfV0QjHGg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.5.tgz", + "integrity": "sha512-2qdsGIcdCnpsw8Ijuq8uk4RifxV/lTd1mqjrfge7AfFBtQIExbxZoYBtbSrcY63ONa+UWEf9Z1p6rZ3QySKWlg==", "cpu": [ "ia32" ], @@ -20231,9 +20538,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.4.tgz", - "integrity": "sha512-G2M5ADMV9SqnkwpM0S+UzDz7xR2njCOhofku/sDMZABzAjQQWTsAykKoGmzlT98fTw2HbNhb6u74umf2WLhCfw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.5.tgz", + "integrity": "sha512-wrc6s8YQt95koSkaLoP5HtvAAKxTPWqYZVxnoqp2bHgkKWlr4ymJll9vMcdU3//VxTgJbuH83U5ajzNCtHd0NQ==", "cpu": [ "riscv64" ], @@ -20247,9 +20554,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.4.tgz", - "integrity": "sha512-kQm8dCU3DXf7DtUGWYPiPs03KJYKvFeiZJHhSx993DCM8D2b0wCXWky0S0Z46gf1sEur0SN4Lvnt1WczTqxIBw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.5.tgz", + "integrity": "sha512-1J6JrGpVp07GsBEzEGj/9u6UkVUuga2U7kpfkQxIdYOLmXmXmni6zNx89VehaP7X5OSscwJc/Zufh++6VcRQHw==", "cpu": [ "x64" ], @@ -20263,9 +20570,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.4.tgz", - "integrity": "sha512-GaTI/mXYWYSzG5wxtM4H2cozLpATyh+4l+rO9FFKOL8e1sUOLAzTeRdU2nSBYCuRqsxRuTZIwCXhSz9Q3NRuNA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.5.tgz", + "integrity": "sha512-G45UKRAUgvxXhLROowTgVmyIVyGtRZoCMVH1vPi0EG5SePy43AkhjQVaUb6Ol6lfRRNpQqBFKw3UabxaMCM0Ow==", "cpu": [ "riscv64" ], @@ -20279,9 +20586,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.4.tgz", - "integrity": "sha512-f9laGkqHgC01h99Qt4LsOV+OLMffjvUcTu14hYWqMS9QVX5a4ihMwpf1NoAtTUytb7cVF3rYY/NVGuXt6G3ppQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.5.tgz", + "integrity": "sha512-EOk6pULzxM9b5B8uuuZbQXqfg2BQheAovQeYAw4ueHikaFoESOfaA8OG4kl0v1m5v5tKqAHOjy7xFhtpbEpqEw==", "cpu": [ "x64" ], @@ -20295,9 +20602,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.4.tgz", - "integrity": "sha512-cidBvtaA2cJ6dNlwQEa8qak+ezypurzKs0h0QAHLH324+j/6Jum7LCnQhZRPYJBFjHl+WYd7KwzPnJ2X5USWnQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.5.tgz", + "integrity": "sha512-KdkJOmJSe5lhR4Kxn522GbZo4jRUnQ+V4JQSaIbyxKndBpD81NGPYhDs0ikpJciqrwbmiBxVD5Qqeim6B1gdxA==", "cpu": [ "arm64" ], @@ -20311,9 +20618,9 @@ } }, "node_modules/sass-embedded-win32-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.4.tgz", - "integrity": "sha512-hexdmNTIZGTKNTzlMcdvEXzYuxOJcY89zqgsf45aQ2YMy4y2M8dTOxRI/Vz7p4iRxVp1Jow6LCtaLHrNI2Ordg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.5.tgz", + "integrity": "sha512-1YX4TVw6j3eqxRyPK3t45V5WSyAzql6EgKIEtjPQ0+ByRyqLRuHXlotHPX6KOcc0rA3LMUHmdskN1o08sRIDhA==", "cpu": [ "ia32" ], @@ -20327,9 +20634,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.4.tgz", - "integrity": "sha512-73yrpiWIbti6DkxhWURklkgSLYKfU9itDmvHxB+oYSb4vQveIApqTwSyTOuIUb/6Da/EsgEpdJ4Lbj4sLaMZWA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.5.tgz", + "integrity": "sha512-8Tj9hBpOd6e+j23uTDecFb1ezQhvjQ+jvgKdVg9VlvwKUWmEStnHKA0x1uIQTThIM3dLCsYe63b/wX43gP8tBA==", "cpu": [ "x64" ], @@ -29190,6 +29497,122 @@ "fastq": "^1.6.0" } }, + "@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "requires": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1", + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "dependencies": { + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + } + } + }, + "@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "dev": true, + "optional": true + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -36660,6 +37083,12 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true + }, "node-fetch": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", @@ -39285,11 +39714,12 @@ "dev": true }, "sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", + "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", "dev": true, "requires": { + "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" @@ -39313,9 +39743,9 @@ } }, "sass-embedded": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.4.tgz", - "integrity": "sha512-3AATrtStMgxYjkit02/Ix8vx/P7qderYG6DHjmehfk5jiw53OaWVScmcGJSwp/d77kAkxDQ+Y0r+79VynGmrkw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.5.tgz", + "integrity": "sha512-QFdalnjGFkbNvb6/uQGmP4OIN+GQ5/R77eu0PsXduDB1YP5JW5DSWFVDAyK6l6C54P+3J3eXkjuPYC0mcwX+AA==", "optional": true, "requires": { "@bufbuild/protobuf": "^2.0.0", @@ -39323,26 +39753,26 @@ "colorjs.io": "^0.5.0", "immutable": "^4.0.0", "rxjs": "^7.4.0", - "sass-embedded-android-arm": "1.79.4", - "sass-embedded-android-arm64": "1.79.4", - "sass-embedded-android-ia32": "1.79.4", - "sass-embedded-android-riscv64": "1.79.4", - "sass-embedded-android-x64": "1.79.4", - "sass-embedded-darwin-arm64": "1.79.4", - "sass-embedded-darwin-x64": "1.79.4", - "sass-embedded-linux-arm": "1.79.4", - "sass-embedded-linux-arm64": "1.79.4", - "sass-embedded-linux-ia32": "1.79.4", - "sass-embedded-linux-musl-arm": "1.79.4", - "sass-embedded-linux-musl-arm64": "1.79.4", - "sass-embedded-linux-musl-ia32": "1.79.4", - "sass-embedded-linux-musl-riscv64": "1.79.4", - "sass-embedded-linux-musl-x64": "1.79.4", - "sass-embedded-linux-riscv64": "1.79.4", - "sass-embedded-linux-x64": "1.79.4", - "sass-embedded-win32-arm64": "1.79.4", - "sass-embedded-win32-ia32": "1.79.4", - "sass-embedded-win32-x64": "1.79.4", + "sass-embedded-android-arm": "1.79.5", + "sass-embedded-android-arm64": "1.79.5", + "sass-embedded-android-ia32": "1.79.5", + "sass-embedded-android-riscv64": "1.79.5", + "sass-embedded-android-x64": "1.79.5", + "sass-embedded-darwin-arm64": "1.79.5", + "sass-embedded-darwin-x64": "1.79.5", + "sass-embedded-linux-arm": "1.79.5", + "sass-embedded-linux-arm64": "1.79.5", + "sass-embedded-linux-ia32": "1.79.5", + "sass-embedded-linux-musl-arm": "1.79.5", + "sass-embedded-linux-musl-arm64": "1.79.5", + "sass-embedded-linux-musl-ia32": "1.79.5", + "sass-embedded-linux-musl-riscv64": "1.79.5", + "sass-embedded-linux-musl-x64": "1.79.5", + "sass-embedded-linux-riscv64": "1.79.5", + "sass-embedded-linux-x64": "1.79.5", + "sass-embedded-win32-arm64": "1.79.5", + "sass-embedded-win32-ia32": "1.79.5", + "sass-embedded-win32-x64": "1.79.5", "supports-color": "^8.1.1", "varint": "^6.0.0" }, @@ -39365,123 +39795,123 @@ } }, "sass-embedded-android-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.4.tgz", - "integrity": "sha512-YOVpDGDcwWUQvktpJhYo4zOkknDpdX6ALpaeHDTX6GBUvnZfx+Widh76v+QFUhiJQ/I/hndXg1jv/PKilOHRrw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.5.tgz", + "integrity": "sha512-gYtpQAE2uNFa5IBKBIzUq5ETDS6gnVRmhP5j+N5JGrOThYaGPcG4KrjlU9R3BfCmc7zP5WvlHFZsxSz+2JRT2w==", "optional": true }, "sass-embedded-android-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.4.tgz", - "integrity": "sha512-0JAZ8TtXYv9yI3Yasaq03xvo7DLJOmD+Exb30oJKxXcWTAV9TB0ZWKoIRsFxbCyPxyn7ouxkaCEXQtaTRKrmfw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.5.tgz", + "integrity": "sha512-pq1RJTENkRmEUMLiVuSGYwuLk8zXovWzrjQxlWZTF/Jn5F7Ypi/3v5huMmgJF5n+etsxjio1PN1idaQ5tPLBmg==", "optional": true }, "sass-embedded-android-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.4.tgz", - "integrity": "sha512-IjO3RoyvNN84ZyfAR5s/a8TIdNPfClb7CLGrswB3BN/NElYIJUJMVHD6+Y8W9QwBIZ8DrK1IdLFSTV8nn82xMA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.5.tgz", + "integrity": "sha512-CgJZjLxYRkgjTP/76WumLlF7+1aW0LA+DSEJhkVaCxe5avndRCmPrNcX0PrtYSDvUgeQDvY7xF+fT9QXN1+NgQ==", "optional": true }, "sass-embedded-android-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.4.tgz", - "integrity": "sha512-uOT8nXmKxSwuIdcqvElVWBFcm/+YcIvmwfoKbpuuSOSxUe9eqFzxo+fk7ILhynzf6FBlvRUH5DcjGj+sXtCc3w==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.5.tgz", + "integrity": "sha512-OLbdmDSM/eOjO01PUYbS54BQOCM/HHHHWk/4M8HHdxwF3ojy5eqQaA63R1YQ3IJvLEE7dnudofOXmL01B5+yvQ==", "optional": true }, "sass-embedded-android-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.4.tgz", - "integrity": "sha512-W2FQoj3Z2J2DirNs3xSBVvrhMuqLnsqvOPulxOkhL/074+faKOZZnPx2tZ5zsHbY97SonciiU0SV0mm98xI42w==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.5.tgz", + "integrity": "sha512-UbXxk/rdR3aVBkB7Fh/eAUL7oUADWgQrYpLe9Xu5A0gmthw0/zo/pu7kweBSrbgHnPfWIt/uxwmW4eEAmqqZWQ==", "optional": true }, "sass-embedded-darwin-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.4.tgz", - "integrity": "sha512-pcYtbN1VUAAcfgyHeX8ySndDWGjIvcq6rldduktPbGGuAlEWFDfnwjTbv0hS945ggdzZ6TFnaFlLEDr0SjKzBA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.5.tgz", + "integrity": "sha512-qeEl9XhYetZSY1j4nqvh3hB8tfYOAGsOQyVOCaxyX1bubMRSGPvPNIyftm14QzK7EDrE/K/0+FwCvflarOV4NQ==", "optional": true }, "sass-embedded-darwin-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.4.tgz", - "integrity": "sha512-ir8CFTfc4JLx/qCP8LK1/3pWv35nRyAQkUK7lBIKM6hWzztt64gcno9rZIk4SpHr7Z/Bp1IYWWRS4ZT+4HmsbA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.5.tgz", + "integrity": "sha512-y4pvkYCQhgruxlncub/2j+cZSmlpsZX9Rp1aTRIKvlNagqFStYzFZ6kX3CErlfCEAMYwRVEhP8z/OOoDqnjaZA==", "optional": true }, "sass-embedded-linux-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.4.tgz", - "integrity": "sha512-H/XEE3rY7c+tY0qDaELjPjC6VheAhBo1tPJQ6UHoBEf8xrbT/RT3dWiIS8grp9Vk54RCn05BEB/+POaljvvKGA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.5.tgz", + "integrity": "sha512-rX6qAR8pE1pevYhGzbCpGFexdH4z6QMnw3IeiCNmkpJ4zMXNEN336xl6SZN0xaPiGuNDhUFcq0wgSq3RDKS5vQ==", "optional": true }, "sass-embedded-linux-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.4.tgz", - "integrity": "sha512-XIVn2mCuA422SR2kmKjF6jhjMs1Vrt1DbZ/ktSp+eR0sU4ugu2htg45GajiUFSKKRj7Sc+cBdThq1zPPsDLf1w==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.5.tgz", + "integrity": "sha512-kiUbrLiNAA7vOe6kpdukRhCad1u7ebwhB0ZE63+IgF5HFZ/Qo6GkhHIrVM9AfeLxUT3N6Z4BNtgdcRa9na4Pwg==", "optional": true }, "sass-embedded-linux-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.4.tgz", - "integrity": "sha512-3nqZxV4nuUTb1ahLexVl4hsnx1KKwiGdHEf1xHWTZai6fYFMcwyNPrHySCQzFHqb5xiqSpPzzrKjuDhF6+guuQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.5.tgz", + "integrity": "sha512-12pj3fBV0+VAX/RI6uYFxi/MoUoihRKP7iVpo9MaT/m+EtvN6mYsDpi/T4pTq2dKQYljoaFq8Rb6tR+FinS1zg==", "optional": true }, "sass-embedded-linux-musl-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.4.tgz", - "integrity": "sha512-HnbU1DEiQdUayioNzxh2WlbTEgQRBPTgIIvof8J63QLmVItUqE7EkWYkSUy4RhO+8NsuN9wzGmGTzFBvTImU7g==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.5.tgz", + "integrity": "sha512-EHFrbTgRymEFTf3JnjHzC24PO0WHFjLUEWUJqSuWKZw0+BCL7120MvYIrfkYymPp5UYk+STIjj+Fd9dYSWBrAg==", "optional": true }, "sass-embedded-linux-musl-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.4.tgz", - "integrity": "sha512-C6qX06waPEfDgOHR8jXoYxl0EtIXOyBDyyonrLO3StRjWjGx7XMQj2hA/KXSsV+Hr71fBOsaViosqWXPzTbEiQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.5.tgz", + "integrity": "sha512-Qg1HuQ+ebz3wfPT7xty2G8BpDLXdyfMk7WqKd+X1DlFEcY/kcNapwMVFXS2fCYTTR3gcbIZ4p7eUiQySlkj93A==", "optional": true }, "sass-embedded-linux-musl-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.4.tgz", - "integrity": "sha512-y5b0fdOPWyhj4c+mc88GvQiC5onRH1V0iNaWNjsiZ+L4hHje6T98nDLrCJn0fz5GQnXjyLCLZduMWbfV0QjHGg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.5.tgz", + "integrity": "sha512-2qdsGIcdCnpsw8Ijuq8uk4RifxV/lTd1mqjrfge7AfFBtQIExbxZoYBtbSrcY63ONa+UWEf9Z1p6rZ3QySKWlg==", "optional": true }, "sass-embedded-linux-musl-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.4.tgz", - "integrity": "sha512-G2M5ADMV9SqnkwpM0S+UzDz7xR2njCOhofku/sDMZABzAjQQWTsAykKoGmzlT98fTw2HbNhb6u74umf2WLhCfw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.5.tgz", + "integrity": "sha512-wrc6s8YQt95koSkaLoP5HtvAAKxTPWqYZVxnoqp2bHgkKWlr4ymJll9vMcdU3//VxTgJbuH83U5ajzNCtHd0NQ==", "optional": true }, "sass-embedded-linux-musl-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.4.tgz", - "integrity": "sha512-kQm8dCU3DXf7DtUGWYPiPs03KJYKvFeiZJHhSx993DCM8D2b0wCXWky0S0Z46gf1sEur0SN4Lvnt1WczTqxIBw==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.5.tgz", + "integrity": "sha512-1J6JrGpVp07GsBEzEGj/9u6UkVUuga2U7kpfkQxIdYOLmXmXmni6zNx89VehaP7X5OSscwJc/Zufh++6VcRQHw==", "optional": true }, "sass-embedded-linux-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.4.tgz", - "integrity": "sha512-GaTI/mXYWYSzG5wxtM4H2cozLpATyh+4l+rO9FFKOL8e1sUOLAzTeRdU2nSBYCuRqsxRuTZIwCXhSz9Q3NRuNA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.5.tgz", + "integrity": "sha512-G45UKRAUgvxXhLROowTgVmyIVyGtRZoCMVH1vPi0EG5SePy43AkhjQVaUb6Ol6lfRRNpQqBFKw3UabxaMCM0Ow==", "optional": true }, "sass-embedded-linux-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.4.tgz", - "integrity": "sha512-f9laGkqHgC01h99Qt4LsOV+OLMffjvUcTu14hYWqMS9QVX5a4ihMwpf1NoAtTUytb7cVF3rYY/NVGuXt6G3ppQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.5.tgz", + "integrity": "sha512-EOk6pULzxM9b5B8uuuZbQXqfg2BQheAovQeYAw4ueHikaFoESOfaA8OG4kl0v1m5v5tKqAHOjy7xFhtpbEpqEw==", "optional": true }, "sass-embedded-win32-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.4.tgz", - "integrity": "sha512-cidBvtaA2cJ6dNlwQEa8qak+ezypurzKs0h0QAHLH324+j/6Jum7LCnQhZRPYJBFjHl+WYd7KwzPnJ2X5USWnQ==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.5.tgz", + "integrity": "sha512-KdkJOmJSe5lhR4Kxn522GbZo4jRUnQ+V4JQSaIbyxKndBpD81NGPYhDs0ikpJciqrwbmiBxVD5Qqeim6B1gdxA==", "optional": true }, "sass-embedded-win32-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.4.tgz", - "integrity": "sha512-hexdmNTIZGTKNTzlMcdvEXzYuxOJcY89zqgsf45aQ2YMy4y2M8dTOxRI/Vz7p4iRxVp1Jow6LCtaLHrNI2Ordg==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.5.tgz", + "integrity": "sha512-1YX4TVw6j3eqxRyPK3t45V5WSyAzql6EgKIEtjPQ0+ByRyqLRuHXlotHPX6KOcc0rA3LMUHmdskN1o08sRIDhA==", "optional": true }, "sass-embedded-win32-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.4.tgz", - "integrity": "sha512-73yrpiWIbti6DkxhWURklkgSLYKfU9itDmvHxB+oYSb4vQveIApqTwSyTOuIUb/6Da/EsgEpdJ4Lbj4sLaMZWA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.5.tgz", + "integrity": "sha512-8Tj9hBpOd6e+j23uTDecFb1ezQhvjQ+jvgKdVg9VlvwKUWmEStnHKA0x1uIQTThIM3dLCsYe63b/wX43gP8tBA==", "optional": true }, "sass-loader": { diff --git a/package.json b/package.json index e79a43ac1a..bdad4a50f8 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.0.6", "postcss-scss": "4.0.9", - "sass": "1.79.4", + "sass": "1.79.5", "sass-loader": "16.0.2", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", @@ -127,7 +127,7 @@ "whatwg-fetch": "3.6.20" }, "optionalDependencies": { - "sass-embedded": "1.79.4" + "sass-embedded": "1.79.5" }, "browserslist": [ "last 2 Firefox versions", From 9180465d560b9dd86d5c45ee1324a56f639dff35 Mon Sep 17 00:00:00 2001 From: AfmanS Date: Sat, 19 Oct 2024 16:53:24 +0000 Subject: [PATCH 063/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 59 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index df41be0227..15686a7489 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -637,7 +637,7 @@ "BirthPlaceValue": "Local de nascimento: {0}", "Blacklist": "Lista de exclusão", "Books": "Livros", - "BurnSubtitlesHelp": "Escolha se o servidor deve integrar as legendas enquanto converte vídeos. Evitar a integração de legendas melhora o desempenho do servidor. Selecione Auto para que legendas baseadas em imagem (VobSub, PGS, SUB/IDX) e certos formatos ASS/SSA sejam integrados.", + "BurnSubtitlesHelp": "Escolha se o servidor deve integrar as legendas. Evitar a integração de legendas melhora o desempenho do servidor. Selecione Auto para que legendas baseadas em imagem (VobSub, PGS, SUB/IDX) e certos formatos ASS/SSA sejam integrados.", "Channels": "Canais", "Collections": "Colecções", "Favorites": "Favoritos", @@ -1312,7 +1312,7 @@ "EveryXMinutes": "A cada {0} minutos", "OnWakeFromSleep": "Ao acordar da suspensão", "DailyAt": "Diariamente às {0}", - "LastSeen": "Última visita a {0}", + "LastSeen": "Última atividade a {0}", "PersonRole": "como {0}", "ListPaging": "{0}-{1} de {2}", "WriteAccessRequired": "O Jellyfin necessita de acesso de escrita a esta pasta. Garanta acesso de escrita e tente novamente.", @@ -1442,7 +1442,7 @@ "LabelTonemappingDesat": "Dessaturação do Tone mapping", "LabelSSDPTracingFilterHelp": "Endereço IP opcional, no qual será filtrado o tráfego SSDP registado.", "LabelSSDPTracingFilter": "Filtro SSDP", - "LabelPublishedServerUriHelp": "Substituir o URI utilizado pelo Jellyfin, com base no interface, ou no endereço IP do cliente.", + "LabelPublishedServerUriHelp": "Substituir o URI utilizado pelo Jellyfin, com base no interface, ou no endereço IP do cliente. Por exemplo: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, ou all=https://jellyfin.example.com", "LabelPublishedServerUri": "URIs do servidor publicados", "LabelIsForced": "Forçado", "LabelHDHomerunPortRangeHelp": "Restringir o intervalo das portas UDP de HD Homerun a este valor. (O padrão é 1024 - 65535).", @@ -1766,7 +1766,7 @@ "LabelBackdropScreensaverIntervalHelp": "O tempo em segundos entre a mudança de diferentes imagens de fundo na proteção de ecrã.", "LabelBackdropScreensaverInterval": "Intervalo do fundo do protetor de ecrã", "HeaderAllRecordings": "Todas as Gravações", - "SelectAudioNormalizationHelp": "Ganho de faixa - ajusta o volume de cada faixa para que sejam reproduzidas com o mesmo volume. Ganho do álbum - ajusta o volume de todas as faixas apenas de um álbum, mantendo a faixa dinâmica do álbum.", + "SelectAudioNormalizationHelp": "Ganho de faixa - ajusta o volume de cada faixa para que sejam reproduzidas com o mesmo volume. Ganho do álbum - ajusta o volume de todas as faixas apenas de um álbum, mantendo a faixa dinâmica do álbum. Alternar entre \"Desativado\" e outras opções requer o reinício da reprodução atual.", "LogoScreensaver": "Logotipo de proteção de ecrã", "TonemappingModeHelp": "Selecione o modo de mapeamento de tons. Se você tiver destaques estourados, tente mudar para o modo RGB.", "MachineTranslated": "Traduzido Automaticamente", @@ -1895,5 +1895,54 @@ "Translator": "Tradutor", "LabelSelectPreferredTranscodeVideoCodec": "Codec de vídeo transcodificado preferido", "SelectPreferredTranscodeVideoCodecHelp": "Seleciona o codec de vídeo preferido para transcodificar. Se o codec preferido não for suportado, o servidor utilizará o próximo melhor codec disponível.", - "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã." + "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã.", + "AlwaysRemuxMp3AudioFilesHelp": "Se tem ficheiros para os quais o seu navegador calcula mal as marcas de tempo, habilite isto como alternativa.", + "FallbackMaxStreamingBitrateHelp": "A taxa de bits máxima de streaming é usada como alternativa quando o ffprobe é incapaz de determinar a taxa de bits da fonte. Isto ajuda a prevenir que clientes peçam taxas de bit excessivas ao transcodificar, que pode causar falha no reprodutor e sobrecarregar o codificador.", + "LabelQsvDeviceHelp": "Especificar o dispositivo para Intel QSV num sistema multi-GPU. Em Linux, este é o nodo de render, e.g. /dev/dri/renderD128. Em Windows, este é o índice do dispositivo, começando do 0. Deixar em branco a não ser que saiba o que está a fazer.", + "DateModified": "Data de modificação", + "DisableVbrAudioEncodingHelp": "Impedir que o servidor codifique o áudio com VBR para este cliente.", + "EnableHi10pHelp": "Habilite para evitar transcodificar vídeos H.264 de 10 bit. Desabilite esta opção se o vídeo exibir quadros vazios.", + "HeaderAudioAdvanced": "Áudio avançado", + "LabelRepository": "Repositório", + "LabelSaveTrickplayLocally": "Guardar imagens trickplay junto à média", + "LabelLyricDownloaders": "Transferidores de letra", + "LabelEnablePlugin": "Habilitar plugin", + "EditLyrics": "Editar letra", + "HeaderAddLyrics": "Adicionar letra", + "HeaderPreviewLyrics": "Pré-visualizar letra", + "HeaderUploadLyrics": "Fazer upload da letra", + "LabelDuration": "Duração", + "LabelIsSynced": "Está sincronizado", + "LabelDropLyricsHere": "Largar letra aqui, ou clique para explorar.", + "LabelAudioTagSettings": "Definições de etiquetas de áudio", + "LabelCustomTagDelimiters": "Delimitador de Etiqueta personalizado", + "LabelCustomTagDelimitersHelp": "Caracteres considerados como delimitadores para separar etiquetas.", + "LabelDelimiterWhitelist": "Lista de delimitadores permitidos", + "LabelDelimiterWhitelistHelp": "Itens a ser excluídos te separação de etiquetas. Um ítem por linha.", + "LabelScreensaverTime": "Tempo de protetor de ecrã", + "AllowFmp4TranscodingContainerHelp": "Permitir o contentor de transcodificação fMP4 para este sintonizador para habilitar conteúdos HEVC e HDR. Nem todos os sintonizadores são compatíveis com este contentor. Desabilite isto se tiver problemas de reprodução.", + "AllowStreamSharingHelp": "Permitir que o Jellyfin duplique a transmissão mpegts do sintonizador e partilhe esta transmissão duplicada aos seus clientes. Isto é útil quando o sintonizador tem um limite de contagens de transmissões totais mas pode também causar problemas de reprodução.", + "HeaderEditPlaylist": "Editar lista de reprodução", + "HeaderNewPlaylist": "Nova lista de reprodução", + "LabelAllowFmp4TranscodingContainer": "Permitir contentor de transcodificação do fMP4", + "LabelAlwaysRemuxFlacAudioFiles": "Fazer sempre remux de ficheiros de áudio FLAC", + "LabelAlwaysRemuxMp3AudioFiles": "Fazer sempre remux de ficheiros de áudio MP3", + "LabelAllowStreamSharing": "Permitir partilha de transmissão", + "LabelDisableVbrAudioEncoding": "Desabilitar codificação de áudio VBR", + "LabelFallbackMaxStreamingBitrate": "Taxa de bits máxima por omissão (Mbps)", + "LabelInstalled": "Instalado", + "LabelMediaSegmentsType": "{0} Segmentos", + "LabelNoChangelog": "Nenhum registo de alterações foi disponibilizado para esta versão.", + "LabelNotInstalled": "Não instalado", + "AndOtherArtists": "{0} e {1} outros artistas.", + "AlwaysRemuxFlacAudioFilesHelp": "Se tem ficheiros que o seu navegador recusa-se a reproduzir ou onde calcula incorretamente marcas de tempo, habilite isto como alternativa.", + "AllowTonemappingSoftwareHelp": "Mapear os tons pode transformar a gama dinâmica de um vídeo de HDR a SDR mantendo os detalhes e cores da imagens, que são informação muito importante para representar a cena original. De momento funciona apenas com vídeos HDR10 de 10 bits, HLG e DoVi.", + "LabelQsvDevice": "Dispositivo QSV", + "LabelSaveTrickplayLocallyHelp": "Guardar imagens de trickplay nas pastas de média colocar-las-a junto à sua média para migração e acesso fáceis.", + "AlwaysBurnInSubtitleWhenTranscoding": "Embeber sempre legendas durante a transcodificação", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Embeber todas as legendas quando a transcodificação for provocada. Isto garante a sincronização das legendas após transcodificar, ao custo da velocidade de transcodificação diminuída.", + "EnableHi10p": "Habilitar o perfil H.264 High 10", + "HeaderMediaSegmentActions": "Ações de segmentos de média", + "HeaderNextItem": "Seguinte {0}", + "HeaderNextItemPlayingInValue": "Seguinte {0} Reproduzindo em {1}" } From e0d2b19ed21805b04ad47e64dbb7f4a340f29420 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Sat, 19 Oct 2024 17:19:07 +0000 Subject: [PATCH 064/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 15686a7489..389230184d 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -639,7 +639,7 @@ "Books": "Livros", "BurnSubtitlesHelp": "Escolha se o servidor deve integrar as legendas. Evitar a integração de legendas melhora o desempenho do servidor. Selecione Auto para que legendas baseadas em imagem (VobSub, PGS, SUB/IDX) e certos formatos ASS/SSA sejam integrados.", "Channels": "Canais", - "Collections": "Colecções", + "Collections": "Coleções", "Favorites": "Favoritos", "Folders": "Pastas", "Genres": "Géneros", @@ -823,7 +823,7 @@ "ScanForNewAndUpdatedFiles": "Procurar ficheiros novos ou atualizados", "SaveSubtitlesIntoMediaFoldersHelp": "Guardar ficheiros de legendas junto aos ficheiros vídeo facilita a gestão.", "SaveSubtitlesIntoMediaFolders": "Guardar legendas em pastas multimédia", - "Runtime": "Duração", + "Runtime": "Tempo de execução", "ResumeAt": "Retomar a partir de {0}", "ReplaceAllMetadata": "Substituir todos os metadados", "RepeatOne": "Repetir este", From 6c02aaab2bbebe1221781179d189c3708b9b79c9 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Sat, 19 Oct 2024 17:14:56 +0000 Subject: [PATCH 065/230] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 219bed695e..2ebf59b192 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -87,7 +87,7 @@ "SaveSubtitlesIntoMediaFolders": "Guardar legendas em pastas multimédia", "Save": "Guardar", "Saturday": "Sábado", - "Runtime": "Duração", + "Runtime": "Tempo de execução", "Rewind": "Retroceder", "ResumeAt": "Retomar a partir de {0}", "ReplaceExistingImages": "Substituir imagens existentes", @@ -1897,5 +1897,6 @@ "EditLyrics": "Editar letra", "HeaderAddLyrics": "Adicionar letra", "HeaderPreviewLyrics": "Pré-visualizar letra", - "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã." + "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã.", + "LabelDuration": "Duração" } From 665ccfac7f433d96c40d6a8cd66b852d40da6739 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 17:29:37 +0000 Subject: [PATCH 066/230] Update dependency @jellyfin/sdk to v0.0.0-unstable.202410191409 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad59c0325a..a15bc64a5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410190501", + "@jellyfin/sdk": "0.0.0-unstable.202410191409", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.20.0", @@ -4846,9 +4846,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202410190501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410190501.tgz", - "integrity": "sha512-358kIN6wRfBNLy0vR3vEqcTfwPuT0gLeLEJ3AqfYD6dPZWbcdr/OtxMVJj88P0K7vshGtT7Z8LPPlI3N6cAWeg==", + "version": "0.0.0-unstable.202410191409", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410191409.tgz", + "integrity": "sha512-pTjvvT6Bx4J6tGusPPfJu9A9gWINKYHOOmAoCKziKbZ6gWD710dBb1mbED8tVpbygsy2AGFWoZ7+CT6iDnrmqQ==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -29213,9 +29213,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202410190501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410190501.tgz", - "integrity": "sha512-358kIN6wRfBNLy0vR3vEqcTfwPuT0gLeLEJ3AqfYD6dPZWbcdr/OtxMVJj88P0K7vshGtT7Z8LPPlI3N6cAWeg==", + "version": "0.0.0-unstable.202410191409", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410191409.tgz", + "integrity": "sha512-pTjvvT6Bx4J6tGusPPfJu9A9gWINKYHOOmAoCKziKbZ6gWD710dBb1mbED8tVpbygsy2AGFWoZ7+CT6iDnrmqQ==", "requires": {} }, "@jridgewell/gen-mapping": { diff --git a/package.json b/package.json index bdad4a50f8..443d5c14d5 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410190501", + "@jellyfin/sdk": "0.0.0-unstable.202410191409", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.20.0", From 9b269296fe565c6a6590a1ab01ac05fefcd567ee Mon Sep 17 00:00:00 2001 From: viown <48097677+viown@users.noreply.github.com> Date: Sat, 19 Oct 2024 20:08:27 +0300 Subject: [PATCH 067/230] Use UpNextDialog for outro segments --- .../playback/constants/playerEvent.ts | 1 + .../playback/utils/mediaSegmentManager.ts | 2 +- .../playback/utils/playbackSubscriber.ts | 3 +++ src/components/playback/playbackmanager.js | 6 ++++-- src/components/playback/skipsegment.ts | 21 +++++++++---------- src/controllers/playback/video/index.js | 18 +++++++++++++--- src/strings/en-us.json | 1 - 7 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/apps/stable/features/playback/constants/playerEvent.ts b/src/apps/stable/features/playback/constants/playerEvent.ts index c236475383..ad9d558a13 100644 --- a/src/apps/stable/features/playback/constants/playerEvent.ts +++ b/src/apps/stable/features/playback/constants/playerEvent.ts @@ -14,6 +14,7 @@ export enum PlayerEvent { PlaylistItemAdd = 'playlistitemadd', PlaylistItemMove = 'playlistitemmove', PlaylistItemRemove = 'playlistitemremove', + PromptSkip = 'promptskip', RepeatModeChange = 'repeatmodechange', ShuffleModeChange = 'shufflequeuemodechange', Stopped = 'stopped', diff --git a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts index faf75f9c7f..6a79838aa8 100644 --- a/src/apps/stable/features/playback/utils/mediaSegmentManager.ts +++ b/src/apps/stable/features/playback/utils/mediaSegmentManager.ts @@ -62,7 +62,7 @@ class MediaSegmentManager extends PlaybackSubscriber { promptToSkip(mediaSegment: MediaSegmentDto) { if (mediaSegment.StartTicks && mediaSegment.EndTicks && mediaSegment.EndTicks - mediaSegment.StartTicks < TICKS_PER_SECOND * 3) { - console.info('[MediaSegmentManager] ignoring skipping segment with duration <3s', mediaSegment); + console.info('[MediaSegmentManager] ignoring segment prompt with duration <3s', mediaSegment); this.isLastSegmentIgnored = true; return; } diff --git a/src/apps/stable/features/playback/utils/playbackSubscriber.ts b/src/apps/stable/features/playback/utils/playbackSubscriber.ts index d492469f71..ccbbfb2c00 100644 --- a/src/apps/stable/features/playback/utils/playbackSubscriber.ts +++ b/src/apps/stable/features/playback/utils/playbackSubscriber.ts @@ -11,6 +11,7 @@ import Events, { type Event } from 'utils/events'; import { PlaybackManagerEvent } from '../constants/playbackManagerEvent'; import { PlayerEvent } from '../constants/playerEvent'; import type { ManagedPlayerStopInfo, MovedItem, PlayerError, PlayerErrorCode, PlayerStopInfo, RemovedItems } from '../types/callbacks'; +import { MediaSegmentDto } from '@jellyfin/sdk/lib/generated-client'; export interface PlaybackSubscriber { onPlaybackCancelled?(e: Event): void @@ -18,6 +19,7 @@ export interface PlaybackSubscriber { onPlaybackStart?(e: Event, player: Plugin, state: PlayerState): void onPlaybackStop?(e: Event, info: PlaybackStopInfo): void onPlayerChange?(e: Event, player: Plugin, target: PlayTarget, previousPlayer: Plugin): void + onPromptSkip?(e: Event, mediaSegment: MediaSegmentDto): void onPlayerError?(e: Event, error: PlayerError): void onPlayerFullscreenChange?(e: Event): void onPlayerItemStarted?(e: Event, item?: BaseItemDto, mediaSource?: MediaSourceInfo): void @@ -62,6 +64,7 @@ export abstract class PlaybackSubscriber { [PlayerEvent.PlaylistItemAdd]: this.onPlayerPlaylistItemAdd?.bind(this), [PlayerEvent.PlaylistItemMove]: this.onPlayerPlaylistItemMove?.bind(this), [PlayerEvent.PlaylistItemRemove]: this.onPlayerPlaylistItemRemove?.bind(this), + [PlayerEvent.PromptSkip]: this.onPromptSkip?.bind(this), [PlayerEvent.RepeatModeChange]: this.onPlayerRepeatModeChange?.bind(this), [PlayerEvent.ShuffleModeChange]: this.onPlayerShuffleModeChange?.bind(this), [PlayerEvent.Stopped]: this.onPlayerStopped?.bind(this), diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index a7a5ca4bb9..35001ad9da 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -935,9 +935,11 @@ export class PlaybackManager { return Promise.resolve(self._playQueueManager.getPlaylist()); }; - self.promptToSkip = function (mediaSegment) { + self.promptToSkip = function (mediaSegment, player) { + player = player || self._currentPlayer; + if (mediaSegment && this._skipSegment) { - this._skipSegment.onPromptSkip(mediaSegment); + Events.trigger(player, 'promptskip', [mediaSegment]); } }; diff --git a/src/components/playback/skipsegment.ts b/src/components/playback/skipsegment.ts index 10d9e32248..9169e81b8c 100644 --- a/src/components/playback/skipsegment.ts +++ b/src/components/playback/skipsegment.ts @@ -56,16 +56,7 @@ class SkipSegment extends PlaybackSubscriber { setButtonText() { if (this.skipElement && this.currentSegment) { - if (this.player && this.currentSegment.EndTicks - && this.currentSegment.Type === MediaSegmentType.Outro - && this.currentSegment.EndTicks >= this.playbackManager.currentItem(this.player).RunTimeTicks - && this.playbackManager.getNextItem() - ) { - // Display "Next Episode" if it's an outro segment, exceeds or is equal to the runtime, and if there is a next track. - this.skipElement.innerHTML += globalize.translate('MediaSegmentNextEpisode'); - } else { - this.skipElement.innerHTML = globalize.translate('MediaSegmentSkipPrompt', globalize.translate(`MediaSegmentType.${this.currentSegment.Type}`)); - } + this.skipElement.innerHTML = globalize.translate('MediaSegmentSkipPrompt', globalize.translate(`MediaSegmentType.${this.currentSegment.Type}`)); this.skipElement.innerHTML += ''; } } @@ -132,7 +123,15 @@ class SkipSegment extends PlaybackSubscriber { } } - onPromptSkip(segment: MediaSegmentDto) { + onPromptSkip(e: Event, segment: MediaSegmentDto) { + if (this.player && segment.EndTicks != null + && segment.Type === MediaSegmentType.Outro + && segment.EndTicks >= this.playbackManager.currentItem(this.player).RunTimeTicks + && this.playbackManager.getNextItem() + ) { + // Don't display button when UpNextDialog is expected. + return; + } if (!this.currentSegment) { this.currentSegment = segment; diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 779b68f9f6..fb7cad1f9a 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -29,9 +29,8 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components import { pluginManager } from '../../../components/pluginManager'; import { PluginType } from '../../../types/plugin.ts'; import { EventType } from 'types/eventType'; - -const TICKS_PER_MINUTE = 600000000; -const TICKS_PER_SECOND = 10000000; +import { MediaSegmentType } from '@jellyfin/sdk/lib/generated-client'; +import { TICKS_PER_MINUTE, TICKS_PER_SECOND } from 'constants/time'; function getOpenedDialog() { return document.querySelector('.dialogContainer .dialog.opened'); @@ -579,6 +578,7 @@ export default function (view) { }, state); Events.on(player, 'playbackstart', onPlaybackStart); Events.on(player, 'playbackstop', onPlaybackStopped); + Events.on(player, 'promptskip', onPromptSkip); Events.on(player, 'volumechange', onVolumeChanged); Events.on(player, 'pause', onPlayPauseStateChanged); Events.on(player, 'unpause', onPlayPauseStateChanged); @@ -603,6 +603,7 @@ export default function (view) { if (player) { Events.off(player, 'playbackstart', onPlaybackStart); Events.off(player, 'playbackstop', onPlaybackStopped); + Events.off(player, 'promptskip', onPromptSkip); Events.off(player, 'volumechange', onVolumeChanged); Events.off(player, 'pause', onPlayPauseStateChanged); Events.off(player, 'unpause', onPlayPauseStateChanged); @@ -631,6 +632,17 @@ export default function (view) { } } + function onPromptSkip(e, mediaSegment) { + const player = this; + if (mediaSegment && player && mediaSegment.EndTicks != null + && mediaSegment.Type === MediaSegmentType.Outro + && mediaSegment.EndTicks >= playbackManager.duration(player) + && playbackManager.getNextItem() + ) { + showComingUpNext(player); + } + } + function showComingUpNextIfNeeded(player, currentItem, currentTimeTicks, runtimeTicks) { if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && currentItem.Type === 'Episode' && userSettings.enableNextVideoInfoOverlay()) { let showAtSecondsLeft = 30; diff --git a/src/strings/en-us.json b/src/strings/en-us.json index d06e779771..c58225bc23 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1074,7 +1074,6 @@ "MediaSegmentAction.None": "None", "MediaSegmentAction.AskToSkip": "Ask To Skip", "MediaSegmentAction.Skip": "Skip", - "MediaSegmentNextEpisode": "Next Episode", "MediaSegmentSkipPrompt": "Skip {0}", "MediaSegmentType.Commercial": "Commercial", "MediaSegmentType.Intro": "Intro", From 27cff85aaac02dcfef4e99e2bb1952f6caad7b50 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Sat, 19 Oct 2024 17:46:05 +0000 Subject: [PATCH 068/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 389230184d..74cc5ca185 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -6,7 +6,7 @@ "All": "Todos", "Audio": "Áudio", "Backdrops": "Imagens de Fundo", - "MessageBrowsePluginCatalog": "Procure extensões disponíveis no nosso catálogo.", + "MessageBrowsePluginCatalog": "Explora as extensões disponíveis no nosso catálogo.", "ButtonAddMediaLibrary": "Adicionar Biblioteca de Multimédia", "ButtonAddScheduledTaskTrigger": "Adicionar tarefa agendada", "ButtonAddServer": "Adicionar servidor", @@ -829,9 +829,9 @@ "RepeatOne": "Repetir este", "RepeatMode": "Modo de Repetição", "ServerRestartNeededAfterPluginInstall": "O Jellyfin terá que reiniciar após instalar uma extensão.", - "MessageNoPluginConfiguration": "Esta extensão não tem definições que possa alterar.", - "MessagePluginInstallDisclaimer": "AVISO: A instalação de um plugin de terceiros acarreta riscos. Ele pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas plugins de autores em quem confias e tem em atenção os potenciais efeitos que podem ter, incluindo consultas de serviços externos, análises mais longas da biblioteca ou processamento adicional em segundo plano.", - "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicie sessão localmente no servidor.", + "MessageNoPluginConfiguration": "Esta extensão não tem definições que possas alterar.", + "MessagePluginInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias e tem em atenção os potenciais efeitos que podem ter, incluindo consultas de serviços externos, análises mais longas da biblioteca ou processamento adicional em segundo plano.", + "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicia sessão localmente no servidor.", "HeaderPluginInstallation": "Instalação de extensão", "MessagePluginInstalled": "A extensão foi instalada com sucesso. O servidor terá que reiniciar para aplicar as alterações.", "PleaseRestartServerName": "Por favor, reinicie o Jellyfin no {0}.", @@ -1442,7 +1442,7 @@ "LabelTonemappingDesat": "Dessaturação do Tone mapping", "LabelSSDPTracingFilterHelp": "Endereço IP opcional, no qual será filtrado o tráfego SSDP registado.", "LabelSSDPTracingFilter": "Filtro SSDP", - "LabelPublishedServerUriHelp": "Substituir o URI utilizado pelo Jellyfin, com base no interface, ou no endereço IP do cliente. Por exemplo: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, ou all=https://jellyfin.example.com", + "LabelPublishedServerUriHelp": "Substituir o URI utilizado pelo Jellyfin, com base na interface, ou no endereço IP do cliente. Por exemplo: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, ou all=https://jellyfin.example.com", "LabelPublishedServerUri": "URIs do servidor publicados", "LabelIsForced": "Forçado", "LabelHDHomerunPortRangeHelp": "Restringir o intervalo das portas UDP de HD Homerun a este valor. (O padrão é 1024 - 65535).", @@ -1741,7 +1741,7 @@ "LogLevel.Critical": "Crítico", "LogLevel.None": "Nenhum", "LogLevel.Warning": "Aviso", - "HeaderConfirmRepositoryInstallation": "Confirmar a Instalação do Repositório de Plugins", + "HeaderConfirmRepositoryInstallation": "Confirmar a instalação do repositório de extensões", "AllowSegmentDeletion": "Eliminar segmentos", "AllowSegmentDeletionHelp": "Elimina segmentos antigos depois de terem sido descarregados pelo cliente. Isto evita ter de armazenar todo o ficheiro transcodificado no disco. Desativa esta opção se tiveres problemas de reprodução.", "LabelThrottleDelaySeconds": "Estrangular depois", @@ -1773,7 +1773,7 @@ "ForeignPartsOnly": "Apenas partes forçadas/externas", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Os extras geralmente têm o mesmo nome incorporado do parente, marque isto para usar títulos incorporados de qualquer maneira.", "SaveRecordingImagesHelp": "Guardar imagens do fornecedor de listas EPG juntamente com os ficheiros multimédia.", - "MessageRepositoryInstallDisclaimer": "AVISO: Instalar um repositório de plugins de terceiros traz riscos. Ele pode conter código instável ou malicioso e pode mudar a qualquer momento. Instale apenas repositórios de autores em quem você confia.", + "MessageRepositoryInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias.", "SaveRecordingNFO": "Guardar metadados EPG da gravação no NFO", "SaveRecordingNFOHelp": "Guardar metadados do fornecedor de listagens EPG juntamente com os ficheiros multimédia.", "SaveRecordingImages": "Guardar imagens da gravação EPG", @@ -1841,7 +1841,7 @@ "LabelTrickplayThreads": "Threads FFmpeg", "LimitSupportedVideoResolution": "Limitar a resolução máxima de vídeo suportada", "DeleteEntireSeries": "Eliminar {0} episódios", - "DlnaMovedMessage": "A funcionalidade DLNA foi transferida para um plug-in.", + "DlnaMovedMessage": "A funcionalidade DLNA foi transferida para uma extensão.", "EnableSmoothScroll": "Ativar deslocação suave", "LabelAllowContentWithTags": "Permitir items com etiquetas", "PlaybackError.NETWORK_ERROR": "A reprodução falhou devido a um erro de rede.", @@ -1906,19 +1906,19 @@ "LabelRepository": "Repositório", "LabelSaveTrickplayLocally": "Guardar imagens trickplay junto à média", "LabelLyricDownloaders": "Transferidores de letra", - "LabelEnablePlugin": "Habilitar plugin", + "LabelEnablePlugin": "Ativar extensão", "EditLyrics": "Editar letra", "HeaderAddLyrics": "Adicionar letra", "HeaderPreviewLyrics": "Pré-visualizar letra", "HeaderUploadLyrics": "Fazer upload da letra", "LabelDuration": "Duração", "LabelIsSynced": "Está sincronizado", - "LabelDropLyricsHere": "Largar letra aqui, ou clique para explorar.", + "LabelDropLyricsHere": "Arrasta e larga a letra aqui, ou clica para explorar.", "LabelAudioTagSettings": "Definições de etiquetas de áudio", "LabelCustomTagDelimiters": "Delimitador de Etiqueta personalizado", "LabelCustomTagDelimitersHelp": "Caracteres considerados como delimitadores para separar etiquetas.", "LabelDelimiterWhitelist": "Lista de delimitadores permitidos", - "LabelDelimiterWhitelistHelp": "Itens a ser excluídos te separação de etiquetas. Um ítem por linha.", + "LabelDelimiterWhitelistHelp": "Itens a ser excluídos da separação de etiquetas. Um item por linha.", "LabelScreensaverTime": "Tempo de protetor de ecrã", "AllowFmp4TranscodingContainerHelp": "Permitir o contentor de transcodificação fMP4 para este sintonizador para habilitar conteúdos HEVC e HDR. Nem todos os sintonizadores são compatíveis com este contentor. Desabilite isto se tiver problemas de reprodução.", "AllowStreamSharingHelp": "Permitir que o Jellyfin duplique a transmissão mpegts do sintonizador e partilhe esta transmissão duplicada aos seus clientes. Isto é útil quando o sintonizador tem um limite de contagens de transmissões totais mas pode também causar problemas de reprodução.", @@ -1928,7 +1928,7 @@ "LabelAlwaysRemuxFlacAudioFiles": "Fazer sempre remux de ficheiros de áudio FLAC", "LabelAlwaysRemuxMp3AudioFiles": "Fazer sempre remux de ficheiros de áudio MP3", "LabelAllowStreamSharing": "Permitir partilha de transmissão", - "LabelDisableVbrAudioEncoding": "Desabilitar codificação de áudio VBR", + "LabelDisableVbrAudioEncoding": "Desativar a codificação de áudio VBR", "LabelFallbackMaxStreamingBitrate": "Taxa de bits máxima por omissão (Mbps)", "LabelInstalled": "Instalado", "LabelMediaSegmentsType": "{0} Segmentos", From e0c45956e75aeb08f0fa926311c425990b100cc8 Mon Sep 17 00:00:00 2001 From: AfmanS Date: Sat, 19 Oct 2024 17:38:38 +0000 Subject: [PATCH 069/230] Translated using Weblate (Portuguese (Portugal)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_PT/ --- src/strings/pt-pt.json | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 74cc5ca185..a0013fbd97 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -828,7 +828,7 @@ "ReplaceAllMetadata": "Substituir todos os metadados", "RepeatOne": "Repetir este", "RepeatMode": "Modo de Repetição", - "ServerRestartNeededAfterPluginInstall": "O Jellyfin terá que reiniciar após instalar uma extensão.", + "ServerRestartNeededAfterPluginInstall": "O Jellyfin terá que reiniciar após instalar a extensão.", "MessageNoPluginConfiguration": "Esta extensão não tem definições que possas alterar.", "MessagePluginInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias e tem em atenção os potenciais efeitos que podem ter, incluindo consultas de serviços externos, análises mais longas da biblioteca ou processamento adicional em segundo plano.", "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicia sessão localmente no servidor.", @@ -1944,5 +1944,41 @@ "EnableHi10p": "Habilitar o perfil H.264 High 10", "HeaderMediaSegmentActions": "Ações de segmentos de média", "HeaderNextItem": "Seguinte {0}", - "HeaderNextItemPlayingInValue": "Seguinte {0} Reproduzindo em {1}" + "HeaderNextItemPlayingInValue": "Seguinte {0} Reproduzindo em {1}", + "VideoCodecTagNotSupported": "Etiqueta de codec de vídeo não é compatível", + "PreviewLyrics": "Pré-visualizar letra", + "MoveToBottom": "Mover para o fundo", + "MessageCancelSeriesTimerError": "Um erro ocorreu ao cancelar o temporizador da série", + "MoveToTop": "Mover para o início", + "PluginLoadRepoError": "Um erro ocorreu ao obter os detalhes da extensão a partir do repositório.", + "RenderPgsSubtitleHelp": "Determinar se o cliente deve renderizar legendas PGS em vez de usar legendas embebidas. Isto pode evitar transcodificação do lado do servidor em ao custo do desempenho do lado do cliente.", + "UseCustomTagDelimiters": "Usar delimitador de etiqueta personalizado", + "UseCustomTagDelimitersHelp": "Dividir etiquetas de artistas/género com caracteres personalizados.", + "LabelTrickplayKeyFrameOnlyExtraction": "Só gerar imagens a partir de quadros-chave", + "PluginEnableError": "Um erro ocorreu ao habilitar a extensão.", + "PluginLoadConfigError": "Um erro ocorreu ao obter as páginas de configuração da extensão.", + "PluginDisableError": "Um erro ocorreu ao desabilitar a extensão.", + "NoLyricsSearchResultsFound": "Letra não encontrada.", + "PreferNonstandardArtistsTag": "Preferir a etiqueta ARTISTS se disponível", + "PreferNonstandardArtistsTagHelp": "Usar a etiqueta não standard ARTISTS em vez da etiqueta ARTIST quando disponível.", + "MessageSplitVersionsError": "Um erro ocorreu ao dividir versões", + "SearchForLyrics": "Procurar letra", + "RenderPgsSubtitle": "Renderização de legendas experimental PGS", + "LyricDownloadersHelp": "Habilite e classifique os seus transferidores de legendas por ordem de prioridade.", + "MediaSegmentAction.None": "Nenhum", + "MediaSegmentAction.Skip": "Saltar", + "MediaSegmentType.Commercial": "Publicidade", + "MediaSegmentType.Intro": "Genérico", + "MediaSegmentType.Outro": "Créditos", + "MediaSegmentType.Preview": "Pré-visualização", + "MediaSegmentType.Recap": "Recapitulação", + "PlaylistError.UpdateFailed": "Erro ao atualizar lista de reprodução", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "Extrair quadros-chave só para processamento significativamente mais rápido com temporização menos precisa. Se o descodificador de hardware configurado não apoiar este modo, usará o descodificador de software.", + "PluginUninstallError": "Um erro ocorreu ao desinstalar a extensão.", + "LibraryInvalidItemIdError": "A biblioteca está num estado inválido e não pode ser editada. Possivelmente está a encontrar um bug: o caminho na base de dados não é o caminho correto no sistema de ficheiros.", + "MediaInfoRotation": "Rotação", + "MessageCancelTimerError": "Um erro ocorreu ao cancelar o temporizador", + "PasswordMissingSaveError": "Nova palavra-passe não pode ser em branco.", + "ReplaceTrickplayImages": "Substituir imagens de trickplay existentes", + "Reset": "Redefinir" } From 3f247b27d653bb3f88186e36f0ec7dee32bcf320 Mon Sep 17 00:00:00 2001 From: Blackspirits Date: Sat, 19 Oct 2024 17:46:25 +0000 Subject: [PATCH 070/230] Translated using Weblate (Portuguese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt/ --- src/strings/pt.json | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/strings/pt.json b/src/strings/pt.json index 2ebf59b192..5e735cb45a 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -23,7 +23,7 @@ "UserAgentHelp": "Forneça um 'User-Agent' HTTP personalizado.", "Unplayed": "Por reproduzir", "Unmute": "Activar som", - "HeaderUninstallPlugin": "Desinstalar Extensão", + "HeaderUninstallPlugin": "Desinstalar extensão", "UninstallPluginConfirmation": "Tem a certeza que deseja desinstalar {0}?", "Uniform": "Uniforme", "Tuesday": "Terça", @@ -576,7 +576,7 @@ "OptionAllUsers": "Todos os utilizadores", "OptionAdminUsers": "Administradores", "OneChannel": "Um canal", - "MessageNoPluginConfiguration": "Esta extensão não é configurável.", + "MessageNoPluginConfiguration": "Esta extensão não tem definições que possas alterar.", "MessageNoNextUpItems": "Nenhum encontrado. Comece a ver os seus programas!", "News": "Notícias", "NewCollectionNameExample": "Exemplo: Colecção Guerra das Estrelas", @@ -590,8 +590,8 @@ "MessageUnableToConnectToServer": "Não foi possível estabelecer ligação ao servidor. Por favor, certifique-se que o servidor está a correr e tente de novo.", "MessageTheFollowingLocationWillBeRemovedFromLibrary": "As seguintes pastas multimédia serão removidas da Biblioteca", "MessageReenableUser": "Veja abaixo como reactivar", - "MessagePluginInstallDisclaimer": "AVISO: A instalação de um plugin de terceiros acarreta riscos. Ele pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas plugins de autores em quem confias e tem em atenção os potenciais efeitos que podem ter, incluindo consultas de serviços externos, análises mais longas da biblioteca ou processamento adicional em segundo plano.", - "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicie sessão localmente no servidor.", + "MessagePluginInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias e tem em atenção os potenciais efeitos que podem ter, incluindo consultas de serviços externos, análises mais longas da biblioteca ou processamento adicional em segundo plano.", + "MessagePluginConfigurationRequiresLocalAccess": "Para configurar esta extensão, inicia sessão localmente no servidor.", "MessagePleaseEnsureInternetMetadata": "Certifique-se de que a transferência de metadados da Internet está ativada.", "MessagePasswordResetForUsers": "Os seguintes utilizadores tiveram as suas palavras-passe redefinidas. Podem agora iniciar sessão com os códigos PIN que foram utilizados para efetuar a redefinição.", "MessageNothingHere": "Nada aqui.", @@ -902,7 +902,7 @@ "ButtonAddMediaLibrary": "Adicionar Biblioteca de Multimédia", "ButtonAddImage": "Adicionar Imagem", "BurnSubtitlesHelp": "Determina se o servidor deve integrar as legendas durante a conversão de vídeo, dependendo do formato da legenda. Evitar a integração de legendas melhora o desempenho do servidor. Selecione Automático para que legendas baseadas em imagem (VOBSUB, PGS, SUB/IDX) e certos formatos ASS/SSA sejam integrados.", - "MessageBrowsePluginCatalog": "Explore as extensões disponíveis no nosso catálogo.", + "MessageBrowsePluginCatalog": "Explora as extensões disponíveis no nosso catálogo.", "Browse": "Explorar", "BoxRear": "Caixa (verso)", "Box": "Caixa", @@ -966,7 +966,7 @@ "HeaderConnectToServer": "Ligar ao Servidor", "HeaderConfirmRevokeApiKey": "Revogar Chave da API", "HeaderConfirmProfileDeletion": "Confirmar Remoção do Perfil", - "HeaderConfirmPluginInstallation": "Confirmar Instalação de Extensão", + "HeaderConfirmPluginInstallation": "Confirmar instalação da extensão", "HeaderConfigureRemoteAccess": "Configurar Acesso Remoto", "HeaderCodecProfileHelp": "Os perfis do Codec indicam as limitações de um dispositivo ao reproduzir codecs específicos. Se uma limitação ocorrer, o ficheiro multimédia será transcodificado, mesmo se o codec estiver configurado para reprodução direta.", "HeaderCodecProfile": "Perfil do Codec", @@ -1253,7 +1253,7 @@ "LabelRepositoryNameHelp": "Um nome personalizado para distinguir este repositório de qualquer outro adicionado ao seu servidor.", "LabelRepositoryName": "Nome do Repositório", "LabelQuickConnectCode": "Código de Ligação Rápida", - "LabelPublishedServerUriHelp": "Substitua o URI usado pelo Jellyfin, com base na interface, ou endereço IP do cliente.", + "LabelPublishedServerUriHelp": "Substituir o URI utilizado pelo Jellyfin, com base na interface, ou no endereço IP do cliente. Por exemplo: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, ou all=https://jellyfin.example.com", "LabelPublishedServerUri": "URIs de Servidor Publicado", "LabelOpenclDeviceHelp": "Este é o dispositivo OpenCL usado para mapeamento de tom. O lado esquerdo do ponto é o número da plataforma e o lado direito é o número do dispositivo na plataforma. O valor padrão é 0.0. O arquivo do aplicativo ffmpeg contendo o método de aceleração de hardware OpenCL é necessário.", "LabelOpenclDevice": "Dispositivo OpenCL", @@ -1314,9 +1314,9 @@ "EnablePlugin": "Ativar", "DirectPlayHelp": "O arquivo de origem é totalmente compatível com este cliente e a sessão está recebendo o arquivo sem modificações.", "MessageSent": "Mensagem enviada.", - "MessagePluginInstallError": "Ocorreu um erro ao instalar a extensão.", + "MessagePluginInstallError": "Ocorreu um erro durante a instalação da extensão.", "MessageNoRepositories": "Sem repositórios.", - "MessageGetInstalledPluginsError": "Ocorreu um erro ao obter a lista das extensões instaladas.", + "MessageGetInstalledPluginsError": "Ocorreu um erro ao tentar obter a lista de extensões atualmente instaladas.", "MediaInfoColorPrimaries": "Cores primárias", "LastSeen": "Visto pela ultima vez em {0}", "LabelUserMaxActiveSessions": "Número máximo de sessões em simultâneo", @@ -1424,7 +1424,7 @@ "LabelParallelImageEncodingLimitHelp": "Número máxima de imagens codificadas que são permitidas rodar em paralelo. Ajustar este valor para 0 irá selecionar um limite baseado no número de núcleos do seu sistema.", "GoHome": "Ir ao início", "GridView": "Visão em grade", - "HeaderConfirmRepositoryInstallation": "Confirme a instalação do repositório de plugin", + "HeaderConfirmRepositoryInstallation": "Confirmar a instalação do repositório de extensões", "AllowSegmentDeletion": "Eliminar segmentos", "AllowSegmentDeletionHelp": "Elimina segmentos antigos depois de terem sido descarregados pelo cliente. Isto evita ter de armazenar todo o ficheiro transcodificado no disco. Desativa esta opção se tiveres problemas de reprodução.", "LabelSegmentKeepSeconds": "Tempo em segundos para manter os segmentos", @@ -1601,7 +1601,7 @@ "LogLevel.Trace": "Vestígio", "LogLevel.Debug": "Depurar", "LogLevel.Information": "Informação", - "MessageRepositoryInstallDisclaimer": "AVISO: Instalar um repositório de plugins de terceiros traz riscos. Ele pode conter código instável ou malicioso e pode mudar a qualquer momento. Instale apenas repositórios de autores em que você confia.", + "MessageRepositoryInstallDisclaimer": "AVISO: A instalação de uma extensão de terceiros acarreta riscos. Ela pode conter código instável ou malicioso e pode ser alterado a qualquer momento. Instala apenas extensões de autores em quem confias.", "OptionAllowContentDownload": "Permitir transferências de multimédia", "StoryArc": "Arco da história", "TabNetworking": "Rede", @@ -1845,7 +1845,7 @@ "EnableSmoothScroll": "Ativar deslocação suave", "LimitSupportedVideoResolution": "Limitar a resolução máxima de vídeo suportada", "PlaybackError.SERVER_ERROR": "A reprodução falhou devido a um erro do servidor.", - "DlnaMovedMessage": "A funcionalidade DLNA foi transferida para um plug-in.", + "DlnaMovedMessage": "A funcionalidade DLNA foi transferida para uma extensão.", "DeleteEntireSeries": "Eliminar {0} episódios", "DeleteEpisode": "Eliminar episódio", "HeaderDeleteSeries": "Eliminar séries", @@ -1898,5 +1898,9 @@ "HeaderAddLyrics": "Adicionar letra", "HeaderPreviewLyrics": "Pré-visualizar letra", "LabelScreensaverTimeHelp": "A quantidade de tempo, em segundos, de inatividade necessária para iniciar a proteção de ecrã.", - "LabelDuration": "Duração" + "LabelDuration": "Duração", + "LabelDisableVbrAudioEncoding": "Desativar a codificação de áudio VBR", + "LabelEnablePlugin": "Ativar extensão", + "LabelDelimiterWhitelistHelp": "Itens a ser excluídos da separação de etiquetas. Um item por linha.", + "LabelDropLyricsHere": "Arrasta e larga a letra aqui, ou clica para explorar." } From 078b188d0e73eaa3ca6daacec858fea37c9ad5d1 Mon Sep 17 00:00:00 2001 From: Roi Gabay Date: Sun, 20 Oct 2024 05:11:42 +0000 Subject: [PATCH 071/230] Translated using Weblate (Hebrew) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/he/ --- src/strings/he.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/he.json b/src/strings/he.json index edf81341e5..acbe141f84 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -1419,5 +1419,7 @@ "LabelSyncPlaySettingsSkipToSync": "אפשר דלג-לסנכרון", "LabelSyncPlaySettingsSpeedToSyncHelp": "טכניקת תיקון סנכרון שמאיצה את הניגון. תיקון סנכרון חייב להיות מאופשר.", "LabelSyncPlaySettingsSkipToSyncHelp": "טכניקת תיקון סנכרון שמדלגת למקום המשוער. תיקון סנכרון חייב להיות מאופשר.", - "LabelTonemappingAlgorithm": "בחירת אלגוריתם מיפוי הגוונים" + "LabelTonemappingAlgorithm": "בחירת אלגוריתם מיפוי הגוונים", + "LabelTonemappingDesatHelp": "החסרת רוויה לאורות שעוברים רמת בהירות זו. ככל שהפרמטר גבוה יותר, כך יותר צבעים יישמקו. הגדרה זו עוזרת במניעת צבעים חזקים באופן לא טהעי ואורות גבוהים מדי ע\"י החלקתם ללבן במקום. התמונה תיראה טבעית יותר, במחיר של איבוד מידע על צבעים מחוץ לטווח. הערכים המומלצים וברירת המחדל הם 0 ו-0.5.", + "LabelTonemappingDesat": "מיפוי גוונים חוסר רוויה" } From 5e5b3ab019f002c897cdffe26e2a4182f41ca71d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BlueM=C3=B6hre?= Date: Sun, 20 Oct 2024 08:56:23 +0200 Subject: [PATCH 072/230] Use "Save" in Metadata Editor and remove "SaveChanges". (#6212) --- src/components/metadataEditor/metadataEditor.template.html | 3 +-- src/strings/en-us.json | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/metadataEditor/metadataEditor.template.html b/src/components/metadataEditor/metadataEditor.template.html index 6d35fee02b..9c71040720 100644 --- a/src/components/metadataEditor/metadataEditor.template.html +++ b/src/components/metadataEditor/metadataEditor.template.html @@ -268,11 +268,10 @@ ${Reset} - diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 1adc9794c8..96c619a77f 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1440,7 +1440,6 @@ "Runtime": "Runtime", "Saturday": "Saturday", "Save": "Save", - "SaveChanges": "Save changes", "SaveLyricsIntoMediaFolders": "Save lyrics into media folders", "SaveLyricsIntoMediaFoldersHelp": "Storing lyrics next to audio files will allow them to be more easily managed.", "SavePassword": "Save Password", From 90b41c8389d684d25f5ccdccbcae0e86184c0633 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 20 Oct 2024 07:02:57 +0000 Subject: [PATCH 073/230] Update dependency @jellyfin/sdk to v0.0.0-unstable.202410200501 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c5482d96d..990371874a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410191409", + "@jellyfin/sdk": "0.0.0-unstable.202410200501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.20.0", @@ -4846,9 +4846,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202410191409", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410191409.tgz", - "integrity": "sha512-pTjvvT6Bx4J6tGusPPfJu9A9gWINKYHOOmAoCKziKbZ6gWD710dBb1mbED8tVpbygsy2AGFWoZ7+CT6iDnrmqQ==", + "version": "0.0.0-unstable.202410200501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410200501.tgz", + "integrity": "sha512-Zas0kaSGrcY7UqQtqSzx8pFHkNrsp86gTTivyrFfCbYe82eI/6OfUDa8jN7DVMe5eeuG0IqmdiJNNlaTUKXsBw==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -29214,9 +29214,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202410191409", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410191409.tgz", - "integrity": "sha512-pTjvvT6Bx4J6tGusPPfJu9A9gWINKYHOOmAoCKziKbZ6gWD710dBb1mbED8tVpbygsy2AGFWoZ7+CT6iDnrmqQ==", + "version": "0.0.0-unstable.202410200501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202410200501.tgz", + "integrity": "sha512-Zas0kaSGrcY7UqQtqSzx8pFHkNrsp86gTTivyrFfCbYe82eI/6OfUDa8jN7DVMe5eeuG0IqmdiJNNlaTUKXsBw==", "requires": {} }, "@jridgewell/gen-mapping": { diff --git a/package.json b/package.json index a376a00241..1fe257d50f 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@fontsource/noto-sans-sc": "5.1.0", "@fontsource/noto-sans-tc": "5.1.0", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202410191409", + "@jellyfin/sdk": "0.0.0-unstable.202410200501", "@mui/icons-material": "5.16.7", "@mui/material": "5.16.7", "@mui/x-date-pickers": "7.20.0", From 568b5f607f84b932397a6f1b6de25074651603d1 Mon Sep 17 00:00:00 2001 From: Andrejs Date: Sun, 20 Oct 2024 10:17:24 +0000 Subject: [PATCH 074/230] Translated using Weblate (Latvian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/lv/ --- src/strings/lv.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/strings/lv.json b/src/strings/lv.json index 7c306d5da9..56fd071fbe 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -946,7 +946,7 @@ "ColorTransfer": "Krāsu pārsūtīšana", "ClientSettings": "Klientu iestatījumi", "ButtonTogglePlaylist": "Atskaņošanas saraksts", - "BurnSubtitlesHelp": "Nosaka, vai serverim ir jāiededzina subtitri video transkodēšanas laikā. Izvairīšanās no tā ievērojami uzlabos veiktspēju. Izvēlietiess Auto lai iededzinātu uz attēliem bāzētus formātus (VOBSUB, PGS, SUB, IDX u.c.) un noteiktus ASS vai SSA subtitrus.", + "BurnSubtitlesHelp": "Nosaka, vai serverim ir jāiededzina subtitri video transkodēšanas laikā. Izvairīšanās no tā ievērojami uzlabos veiktspēju. Izvēlieties Auto, lai iededzinātu uz attēliem bāzētus formātus (VOBSUB, PGS, SUB, IDX u.c.) un noteiktus ASS vai SSA subtitrus.", "Artist": "Izpildītājs", "AllowOnTheFlySubtitleExtractionHelp": "Iegultie subtitri var tikt izvilkti no video un nogādāti klientiem kā parasts teksts, lai nevajadzētu veikt lieku video transkodēšanu. Uz dažām sistēmām tas var aizņemt ilgu laiku un likt video atskaņošanai uzkārties izvilkšanas procesa laikā. Atspējo šo, lai iegultos subtitrus iededzinātu video transkodēšanas veidā, kad tos noklusēti neatbalsta klienta ierīce.", "AlbumArtist": "Albuma izpildītājs", @@ -1235,7 +1235,7 @@ "Casual": "Ikdienišķs", "Arranger": "Aranžetājs", "AgeValue": "({0} gadu vecs)", - "LabelPublishedServerUriHelp": "Pārrakstīt URI, ko izmanto Jellyfin, vadoties pēc tīkla interfeisa vai klienta IP adreses.", + "LabelPublishedServerUriHelp": "Pārrakstīt URI, ko izmanto Jellyfin, vadoties pēc tīkla interfeisa vai klienta IP adreses. Piemēram: internal=http://jellyfin.example.com, external=https://jellyfin.example.com vai all=https://jellyfin.example.com", "LabelPublishedServerUri": "Publicētā servera URI", "LabelProtocolInfoHelp": "Vērtība, kas tiks izmantota, atbildot uz GetProtocolInfo pieprasījumiem no ierīces.", "LabelPostProcessorArguments": "Pēcapstrādes komandrindas argumenti", @@ -1642,7 +1642,7 @@ "ResumeAt": "Atsākt no {0}", "SearchForMissingMetadata": "Trūkstošo metadatu meklēšana", "Unreleased": "Pagaidām nav publicēts", - "Series": "Sērijas", + "Series": "Seriāli", "TonemappingAlgorithmHelp": "Toņu kartēšana var tikt precīzi pielāgota. Ja šīs opcijas jums nav pazīstamas, saglabājiet noklusējuma iestatījumus. Ieteicamā vērtība ir \"BT.2390\".", "EnableIntelLowPowerH264HwEncoder": "Iespējot Intel zema enerģijas patēriņa H.264 aparatūras kodētāju", "EnableIntelLowPowerHevcHwEncoder": "Iespējot Intel zema enerģijas patēriņa HEVC aparatūras kodētāju", @@ -1733,15 +1733,15 @@ "AllowContentWithTagsHelp": "Rādīt multimediju tikai ar viss maz vienu norādītu birku.", "BlockContentWithTagsHelp": "Paslēpt multimediju ar viss maz vienu no norādītajām birkām.", "ChannelResolutionHD": "HD", - "DeleteSeries": "Dzēst sēriju", + "DeleteSeries": "Dzēst seriālu", "DeleteEpisode": "Dzēst epizodi", "LabelAllowContentWithTags": "Atļaut vienumus ar birkām", "LabelAlbumGain": "Albuma pastiprinājums", "LabelServerVersion": "Servera versija", - "ConfirmDeleteSeries": "Dzēšot šo sēriju, tiks izdzēstas VISAS {0} sērijas gan no failu sistēmas, gan no multivides bibliotēkas. Vai tiešām vēlaties turpināt?", + "ConfirmDeleteSeries": "Dzēšot šo seriālu, tiks izdzēstas VISAS {0} sērijas gan no failu sistēmas, gan no multivides bibliotēkas. Vai tiešām vēlaties turpināt?", "DeleteEntireSeries": "Dzēst {0} sērijas", "DlnaMovedMessage": "DLNA funkcionalitāte ir pārvietota uz spraudni.", - "HeaderDeleteSeries": "Dzēst sēriju", + "HeaderDeleteSeries": "Dzēst seriālu", "EnableLibrary": "Iespējot bibliotēku", "EnableLibraryHelp": "Atspējojot bibliotēku, tā tiks paslēpta no visiem lietotājiem.", "AllowSubtitleManagement": "Atļaut šim lietotājam rediģēt subtitrus", From 956f9bf7e47d1156cd2c852ec6aadfc59e799b30 Mon Sep 17 00:00:00 2001 From: gnattu Date: Sun, 20 Oct 2024 21:40:55 +0800 Subject: [PATCH 075/230] Fix tags and schedule edit for parental control --- .../routes/users/parentalcontrol.tsx | 127 +++++++----------- .../dashboard/users/AccessScheduleList.tsx | 9 +- src/components/dashboard/users/TagList.tsx | 9 +- src/elements/IconButtonElement.tsx | 4 +- 4 files changed, 69 insertions(+), 80 deletions(-) diff --git a/src/apps/dashboard/routes/users/parentalcontrol.tsx b/src/apps/dashboard/routes/users/parentalcontrol.tsx index da7262af1b..70c299bf43 100644 --- a/src/apps/dashboard/routes/users/parentalcontrol.tsx +++ b/src/apps/dashboard/routes/users/parentalcontrol.tsx @@ -70,6 +70,13 @@ const UserParentalControl = () => { const [ blockedTags, setBlockedTags ] = useState([]); const libraryMenu = useMemo(async () => ((await import('../../../../scripts/libraryMenu')).default), []); + // The following are meant to be reset on each render. + // These are to prevent multiple callbacks to be added to a single element in one render as useEffect may be executed multiple times in each render. + let allowedTagsPopupCallback: (() => void) | null = null; + let blockedTagsPopupCallback: (() => void) | null = null; + let accessSchedulesPopupCallback: (() => void) | null = null; + let formSubmissionCallback: ((e: Event) => void) | null = null; + const element = useRef(null); const populateRatings = useCallback((allParentalRatings: ParentalRating[]) => { @@ -146,48 +153,6 @@ const UserParentalControl = () => { blockUnratedItems.dispatchEvent(new CustomEvent('create')); }, []); - const loadAllowedTags = useCallback((tags: string[]) => { - const page = element.current; - - if (!page) { - console.error('[userparentalcontrol] Unexpected null page reference'); - return; - } - - setAllowedTags(tags); - - const allowedTagsElem = page.querySelector('.allowedTags') as HTMLDivElement; - - for (const btnDeleteTag of allowedTagsElem.querySelectorAll('.btnDeleteTag')) { - btnDeleteTag.addEventListener('click', function () { - const tag = btnDeleteTag.getAttribute('data-tag'); - const newTags = tags.filter(t => t !== tag); - loadAllowedTags(newTags); - }); - } - }, []); - - const loadBlockedTags = useCallback((tags: string[]) => { - const page = element.current; - - if (!page) { - console.error('[userparentalcontrol] Unexpected null page reference'); - return; - } - - setBlockedTags(tags); - - const blockedTagsElem = page.querySelector('.blockedTags') as HTMLDivElement; - - for (const btnDeleteTag of blockedTagsElem.querySelectorAll('.btnDeleteTag')) { - btnDeleteTag.addEventListener('click', function () { - const tag = btnDeleteTag.getAttribute('data-tag'); - const newTags = tags.filter(t => t !== tag); - loadBlockedTags(newTags); - }); - } - }, []); - const loadUser = useCallback((user: UserDto, allParentalRatings: ParentalRating[]) => { const page = element.current; @@ -200,8 +165,8 @@ const UserParentalControl = () => { void libraryMenu.then(menu => menu.setTitle(user.Name)); loadUnratedItems(user); - loadAllowedTags(user.Policy?.AllowedTags || []); - loadBlockedTags(user.Policy?.BlockedTags || []); + setAllowedTags(user.Policy?.AllowedTags || []); + setBlockedTags(user.Policy?.BlockedTags || []); populateRatings(allParentalRatings); let ratingValue = ''; @@ -222,7 +187,7 @@ const UserParentalControl = () => { } setAccessSchedules(user.Policy?.AccessSchedules || []); loading.hide(); - }, [loadAllowedTags, loadBlockedTags, loadUnratedItems, populateRatings]); + }, [setAllowedTags, setBlockedTags, loadUnratedItems, populateRatings]); const loadData = useCallback(() => { if (!userId) { @@ -296,7 +261,7 @@ const UserParentalControl = () => { if (tags.indexOf(value) == -1) { tags.push(value); - loadAllowedTags(tags); + setAllowedTags(tags); } }).catch(() => { // prompt closed @@ -317,7 +282,7 @@ const UserParentalControl = () => { if (tags.indexOf(value) == -1) { tags.push(value); - loadBlockedTags(tags); + setBlockedTags(tags); } }).catch(() => { // prompt closed @@ -348,7 +313,11 @@ const UserParentalControl = () => { return false; }; - (page.querySelector('#btnAddSchedule') as HTMLButtonElement).addEventListener('click', function () { + // FIXME: The following is still hacky and should migrate to pure react implementation for callbacks in the future + if (accessSchedulesPopupCallback) { + (page.querySelector('#btnAddSchedule') as HTMLButtonElement).removeEventListener('click', accessSchedulesPopupCallback); + } + accessSchedulesPopupCallback = function () { showSchedulePopup({ Id: 0, UserId: '', @@ -356,37 +325,27 @@ const UserParentalControl = () => { StartHour: 0, EndHour: 0 }, -1); - }); + }; + (page.querySelector('#btnAddSchedule') as HTMLButtonElement).addEventListener('click', accessSchedulesPopupCallback); - (page.querySelector('#btnAddAllowedTag') as HTMLButtonElement).addEventListener('click', function () { - showAllowedTagPopup(); - }); - - (page.querySelector('#btnAddBlockedTag') as HTMLButtonElement).addEventListener('click', function () { - showBlockedTagPopup(); - }); - - (page.querySelector('.userParentalControlForm') as HTMLFormElement).addEventListener('submit', onSubmit); - }, [loadAllowedTags, loadBlockedTags, loadData, userId]); - - useEffect(() => { - const page = element.current; - - if (!page) { - console.error('[userparentalcontrol] Unexpected null page reference'); - return; + if (allowedTagsPopupCallback) { + (page.querySelector('#btnAddAllowedTag') as HTMLButtonElement).removeEventListener('click', allowedTagsPopupCallback); } + allowedTagsPopupCallback = showAllowedTagPopup; + (page.querySelector('#btnAddAllowedTag') as HTMLButtonElement).addEventListener('click', allowedTagsPopupCallback); - const accessScheduleList = page.querySelector('.accessScheduleList') as HTMLDivElement; - - for (const btnDelete of accessScheduleList.querySelectorAll('.btnDelete')) { - btnDelete.addEventListener('click', function () { - const index = parseInt(btnDelete.getAttribute('data-index') ?? '0', 10); - const newindex = accessSchedules.filter((_e, i) => i != index); - setAccessSchedules(newindex); - }); + if (blockedTagsPopupCallback) { + (page.querySelector('#btnAddBlockedTag') as HTMLButtonElement).removeEventListener('click', blockedTagsPopupCallback); } - }, [accessSchedules]); + blockedTagsPopupCallback = showBlockedTagPopup; + (page.querySelector('#btnAddBlockedTag') as HTMLButtonElement).addEventListener('click', blockedTagsPopupCallback); + + if (formSubmissionCallback) { + (page.querySelector('.userParentalControlForm') as HTMLFormElement).removeEventListener('submit', formSubmissionCallback); + } + formSubmissionCallback = onSubmit; + (page.querySelector('.userParentalControlForm') as HTMLFormElement).addEventListener('submit', formSubmissionCallback); + }, [setAllowedTags, setBlockedTags, loadData, userId]); const optionMaxParentalRating = () => { let content = ''; @@ -397,6 +356,21 @@ const UserParentalControl = () => { return content; }; + const removeAllowedTagsCallback = useCallback((tag: string) => { + const newTags = allowedTags.filter(t => t !== tag); + setAllowedTags(newTags); + }, [allowedTags, setAllowedTags]); + + const removeBlockedTagsTagsCallback = useCallback((tag: string) => { + const newTags = blockedTags.filter(t => t !== tag); + setBlockedTags(newTags); + }, [blockedTags, setBlockedTags]); + + const removeScheduleCallback = useCallback((index: number) => { + const newSchedules = accessSchedules.filter((_e, i) => i != index); + setAccessSchedules(newSchedules); + }, [accessSchedules, setAccessSchedules]); + return ( { key={tag} tag={tag} tagType='allowedTag' + removeTagCallback={removeAllowedTagsCallback} />; })} @@ -485,6 +460,7 @@ const UserParentalControl = () => { key={tag} tag={tag} tagType='blockedTag' + removeTagCallback={removeBlockedTagsTagsCallback} />; })} @@ -508,6 +484,7 @@ const UserParentalControl = () => { DayOfWeek={accessSchedule.DayOfWeek} StartHour={accessSchedule.StartHour} EndHour={accessSchedule.EndHour} + removeScheduleCallback={removeScheduleCallback} />; })} diff --git a/src/components/dashboard/users/AccessScheduleList.tsx b/src/components/dashboard/users/AccessScheduleList.tsx index 7303ec7e50..91a789017f 100644 --- a/src/components/dashboard/users/AccessScheduleList.tsx +++ b/src/components/dashboard/users/AccessScheduleList.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent } from 'react'; +import React, { FunctionComponent, useCallback } from 'react'; import datetime from '../../../scripts/datetime'; import globalize from '../../../lib/globalize'; import IconButtonElement from '../../../elements/IconButtonElement'; @@ -8,6 +8,7 @@ type AccessScheduleListProps = { DayOfWeek?: string; StartHour?: number ; EndHour?: number; + removeScheduleCallback?: (index: number) => void; }; function getDisplayTime(hours = 0) { @@ -21,7 +22,10 @@ function getDisplayTime(hours = 0) { return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0)); } -const AccessScheduleList: FunctionComponent = ({ index, DayOfWeek, StartHour, EndHour }: AccessScheduleListProps) => { +const AccessScheduleList: FunctionComponent = ({ index, DayOfWeek, StartHour, EndHour, removeScheduleCallback }: AccessScheduleListProps) => { + const onClick = useCallback(() => { + index !== undefined && removeScheduleCallback !== undefined && removeScheduleCallback(index); + }, [index, removeScheduleCallback]); return (
= ({ index, title='Delete' icon='delete' dataIndex={index} + onClick={onClick} />
); diff --git a/src/components/dashboard/users/TagList.tsx b/src/components/dashboard/users/TagList.tsx index 531ee2f6e6..172ee0196e 100644 --- a/src/components/dashboard/users/TagList.tsx +++ b/src/components/dashboard/users/TagList.tsx @@ -1,12 +1,16 @@ -import React, { FunctionComponent } from 'react'; +import React, { FunctionComponent, useCallback } from 'react'; import IconButtonElement from '../../../elements/IconButtonElement'; type IProps = { tag?: string, tagType?: string; + removeTagCallback?: (tag: string) => void; }; -const TagList: FunctionComponent = ({ tag, tagType }: IProps) => { +const TagList: FunctionComponent = ({ tag, tagType, removeTagCallback }: IProps) => { + const onClick = useCallback(() => { + tag !== undefined && removeTagCallback !== undefined && removeTagCallback(tag); + }, [tag, removeTagCallback]); return (
@@ -21,6 +25,7 @@ const TagList: FunctionComponent = ({ tag, tagType }: IProps) => { title='Delete' icon='delete' dataTag={tag} + onClick={onClick} />
diff --git a/src/elements/IconButtonElement.tsx b/src/elements/IconButtonElement.tsx index 93e3fd2b87..3970d72392 100644 --- a/src/elements/IconButtonElement.tsx +++ b/src/elements/IconButtonElement.tsx @@ -11,6 +11,7 @@ type IProps = { dataIndex?: string | number; dataTag?: string | number; dataProfileid?: string | number; + onClick?: () => void; }; const createIconButtonElement = ({ is, id, className, title, icon, dataIndex, dataTag, dataProfileid }: IProps) => ({ @@ -28,7 +29,7 @@ const createIconButtonElement = ({ is, id, className, title, icon, dataIndex, da ` }); -const IconButtonElement: FunctionComponent = ({ is, id, className, title, icon, dataIndex, dataTag, dataProfileid }: IProps) => { +const IconButtonElement: FunctionComponent = ({ is, id, className, title, icon, dataIndex, dataTag, dataProfileid, onClick }: IProps) => { return (
= ({ is, id, className, title dataTag: dataTag ? `data-tag="${dataTag}"` : '', dataProfileid: dataProfileid ? `data-profileid="${dataProfileid}"` : '' })} + onClick={onClick} /> ); }; From 88f9c3d31b81f3f88c12ebca1ca358c72adad234 Mon Sep 17 00:00:00 2001 From: gnattu Date: Sun, 20 Oct 2024 21:54:49 +0800 Subject: [PATCH 076/230] =?UTF-8?q?Don=E2=80=99t=20use=20FIXME?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apps/dashboard/routes/users/parentalcontrol.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps/dashboard/routes/users/parentalcontrol.tsx b/src/apps/dashboard/routes/users/parentalcontrol.tsx index 70c299bf43..e54a78eb02 100644 --- a/src/apps/dashboard/routes/users/parentalcontrol.tsx +++ b/src/apps/dashboard/routes/users/parentalcontrol.tsx @@ -313,7 +313,7 @@ const UserParentalControl = () => { return false; }; - // FIXME: The following is still hacky and should migrate to pure react implementation for callbacks in the future + // The following is still hacky and should migrate to pure react implementation for callbacks in the future if (accessSchedulesPopupCallback) { (page.querySelector('#btnAddSchedule') as HTMLButtonElement).removeEventListener('click', accessSchedulesPopupCallback); } From 7eda53f795e72e23f24715072d236002d4effb2b Mon Sep 17 00:00:00 2001 From: gnattu Date: Sun, 20 Oct 2024 22:15:26 +0800 Subject: [PATCH 077/230] Use anchor for onClick --- src/elements/IconButtonElement.tsx | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/elements/IconButtonElement.tsx b/src/elements/IconButtonElement.tsx index 3970d72392..552c407fea 100644 --- a/src/elements/IconButtonElement.tsx +++ b/src/elements/IconButtonElement.tsx @@ -30,19 +30,29 @@ const createIconButtonElement = ({ is, id, className, title, icon, dataIndex, da }); const IconButtonElement: FunctionComponent = ({ is, id, className, title, icon, dataIndex, dataTag, dataProfileid, onClick }: IProps) => { + const button = createIconButtonElement({ + is: is, + id: id ? `id="${id}"` : '', + className: className, + title: title ? `title="${globalize.translate(title)}"` : '', + icon: icon, + dataIndex: (dataIndex || dataIndex === 0) ? `data-index="${dataIndex}"` : '', + dataTag: dataTag ? `data-tag="${dataTag}"` : '', + dataProfileid: dataProfileid ? `data-profileid="${dataProfileid}"` : '' + }); + + if (onClick !== undefined) { + return ( + + ) + } + return (
); }; From 84f7cf1997b433abb3911afa26e1c51fbe78e085 Mon Sep 17 00:00:00 2001 From: gnattu Date: Sun, 20 Oct 2024 22:17:50 +0800 Subject: [PATCH 078/230] Use button --- src/elements/IconButtonElement.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elements/IconButtonElement.tsx b/src/elements/IconButtonElement.tsx index 552c407fea..e72cf9bb51 100644 --- a/src/elements/IconButtonElement.tsx +++ b/src/elements/IconButtonElement.tsx @@ -43,7 +43,7 @@ const IconButtonElement: FunctionComponent = ({ is, id, className, title if (onClick !== undefined) { return ( - From d9786d4d245431edaeb298c8109c820fadb8deb1 Mon Sep 17 00:00:00 2001 From: gnattu Date: Sun, 20 Oct 2024 22:20:59 +0800 Subject: [PATCH 079/230] Unset button style --- src/elements/IconButtonElement.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/elements/IconButtonElement.tsx b/src/elements/IconButtonElement.tsx index e72cf9bb51..258a062baf 100644 --- a/src/elements/IconButtonElement.tsx +++ b/src/elements/IconButtonElement.tsx @@ -44,6 +44,7 @@ const IconButtonElement: FunctionComponent = ({ is, id, className, title if (onClick !== undefined) { return (