diff --git a/.escheckrc b/.escheckrc index 37003a295a..5cdc1dd4d3 100644 --- a/.escheckrc +++ b/.escheckrc @@ -1,6 +1,5 @@ { "ecmaVersion": "es5", - "modules": "false", "files": "./dist/**/*.js", "not": [ "./dist/libraries/pdf.worker.js", diff --git a/.github/workflows/__codeql.yml b/.github/workflows/__codeql.yml index 0300f6e37a..d3e8eae914 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@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 + uses: github/codeql-action/init@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 with: queries: security-and-quality languages: ${{ matrix.language }} - name: Autobuild 📦 - uses: github/codeql-action/autobuild@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 + uses: github/codeql-action/autobuild@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 - name: Perform CodeQL Analysis 🧪 - uses: github/codeql-action/analyze@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 + uses: github/codeql-action/analyze@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/__deploy.yml b/.github/workflows/__deploy.yml index caa90e5cc0..655a872d1c 100644 --- a/.github/workflows/__deploy.yml +++ b/.github/workflows/__deploy.yml @@ -29,13 +29,13 @@ jobs: steps: - name: Download workflow artifact ⬇️ - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 with: name: ${{ inputs.artifact_name }} path: dist - name: Publish to Cloudflare Pages 📃 - uses: cloudflare/wrangler-action@392082e81ffbcb9ebdde27400634aa004b35ea37 # v3.14.0 + uses: cloudflare/wrangler-action@da0e0dfe58b7a431659754fdf3f186c529afbe65 # v3.14.1 id: cf with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/__package.yml b/.github/workflows/__package.yml index f2c3d2afc8..b3af5861d3 100644 --- a/.github/workflows/__package.yml +++ b/.github/workflows/__package.yml @@ -19,7 +19,7 @@ jobs: ref: ${{ inputs.commit || github.sha }} - name: Setup node environment - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 with: node-version: 20 cache: npm @@ -39,7 +39,7 @@ jobs: mv dist/config.tmp.json dist/config.json - name: Upload artifact - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: frontend path: dist diff --git a/.github/workflows/__quality_checks.yml b/.github/workflows/__quality_checks.yml index b3674f7159..f35282a5ed 100644 --- a/.github/workflows/__quality_checks.yml +++ b/.github/workflows/__quality_checks.yml @@ -48,7 +48,7 @@ jobs: show-progress: false - name: Setup node environment ⚙️ - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 with: node-version: 20 cache: npm diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index b972d461ce..0c8180e24d 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -85,7 +85,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - name: Setup node environment - uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 + uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0 with: node-version: 20 cache: npm @@ -95,6 +95,6 @@ jobs: run: npm ci --no-audit - name: Run eslint - uses: CatChen/eslint-suggestion-action@3ba53ce078667d5f60a73a8005627cf95ab57dce # v4.1.9 + uses: CatChen/eslint-suggestion-action@623ecbafb1dd3f127bc56596b1145e474fc26c6c # v4.1.11 with: github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/eslint.config.mjs b/eslint.config.mjs index 5ddd5a00c5..e094230ec9 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -98,7 +98,7 @@ export default tseslint.config( 'sonarjs/fixme-tag': 'warn', 'sonarjs/todo-tag': 'off', - 'sonarjs/deprecation': 'warn', + 'sonarjs/deprecation': 'off', 'sonarjs/no-alphabetical-sort': 'warn', 'sonarjs/no-inverted-boolean-check': 'error', 'sonarjs/no-selector-parameter': 'off', @@ -329,6 +329,7 @@ export default tseslint.config( } } ], + '@typescript-eslint/no-deprecated': 'warn', '@typescript-eslint/no-floating-promises': 'error', '@typescript-eslint/prefer-string-starts-ends-with': 'error' } @@ -366,7 +367,6 @@ export default tseslint.config( rules: { '@typescript-eslint/no-floating-promises': 'off', '@typescript-eslint/no-this-alias': 'off', - '@typescript-eslint/no-unused-vars': 'warn', 'sonarjs/public-static-readonly': 'off', diff --git a/package-lock.json b/package-lock.json index 2fce5b58d3..bb0cbda73a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,27 +9,27 @@ "version": "10.11.0", "license": "GPL-2.0-or-later", "dependencies": { - "@emotion/react": "11.13.3", - "@emotion/styled": "11.13.0", - "@fontsource/noto-sans": "5.1.1", - "@fontsource/noto-sans-hk": "5.1.1", - "@fontsource/noto-sans-jp": "5.1.1", - "@fontsource/noto-sans-kr": "5.1.1", - "@fontsource/noto-sans-sc": "5.1.1", - "@fontsource/noto-sans-tc": "5.1.1", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", + "@fontsource/noto-sans": "5.2.6", + "@fontsource/noto-sans-hk": "5.2.5", + "@fontsource/noto-sans-jp": "5.2.5", + "@fontsource/noto-sans-kr": "5.2.5", + "@fontsource/noto-sans-sc": "5.2.5", + "@fontsource/noto-sans-tc": "5.2.5", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202502210501", - "@mui/icons-material": "5.16.14", - "@mui/material": "5.16.14", - "@mui/x-date-pickers": "7.26.0", + "@jellyfin/sdk": "0.0.0-unstable.202503260501", + "@mui/icons-material": "6.4.8", + "@mui/material": "6.4.8", + "@mui/x-date-pickers": "7.28.0", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.62.16", - "@tanstack/react-query-devtools": "5.62.16", + "@tanstack/react-query": "5.69.0", + "@tanstack/react-query-devtools": "5.69.0", "abortcontroller-polyfill": "1.7.8", "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.5.1", - "core-js": "3.38.1", + "core-js": "3.41.0", "date-fns": "2.30.0", "dompurify": "2.5.8", "epubjs": "0.3.93", @@ -48,14 +48,14 @@ "lodash-es": "4.17.21", "markdown-it": "14.1.0", "material-design-icons-iconfont": "6.7.0", - "material-react-table": "2.13.3", + "material-react-table": "3.2.1", "native-promise-only": "0.8.1", "pdfjs-dist": "3.11.174", "react": "18.3.1", "react-blurhash": "0.3.0", "react-dom": "18.3.1", - "react-lazy-load-image-component": "1.6.2", - "react-router-dom": "6.27.0", + "react-lazy-load-image-component": "1.6.3", + "react-router-dom": "6.30.0", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.6", @@ -65,70 +65,71 @@ "whatwg-fetch": "3.6.20" }, "devDependencies": { - "@babel/core": "7.26.9", + "@babel/core": "7.26.10", "@babel/plugin-transform-modules-umd": "7.25.9", "@babel/preset-env": "7.26.9", "@babel/preset-react": "7.26.3", "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", - "@eslint/js": "9.20.0", - "@stylistic/eslint-plugin": "3.1.0", + "@eslint/js": "9.23.0", + "@stylistic/eslint-plugin": "4.2.0", "@stylistic/stylelint-plugin": "3.1.2", "@types/dompurify": "3.0.5", "@types/escape-html": "1.0.4", "@types/loadable__component": "5.13.9", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/react": "18.3.11", - "@types/react-dom": "18.3.1", + "@types/react": "18.3.19", + "@types/react-dom": "18.3.5", "@types/react-lazy-load-image-component": "1.6.4", "@types/sortablejs": "1.15.8", - "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/parser": "8.27.0", "@uupaa/dynamic-import-polyfill": "1.0.2", - "@vitest/coverage-v8": "3.0.5", - "autoprefixer": "10.4.20", - "babel-loader": "9.2.1", + "@vitest/coverage-v8": "3.0.9", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", "clean-webpack-plugin": "4.0.0", "confusing-browser-globals": "1.0.11", - "copy-webpack-plugin": "12.0.2", + "copy-webpack-plugin": "13.0.0", "cross-env": "7.0.3", "css-loader": "7.1.2", "cssnano": "7.0.6", - "es-check": "7.2.1", - "eslint": "9.20.1", + "es-check": "8.0.2", + "eslint": "9.23.0", "eslint-plugin-compat": "6.0.2", "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.4", - "eslint-plugin-react-hooks": "5.1.0", + "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-sonarjs": "3.0.2", "expose-loader": "5.0.1", + "fast-glob": "3.3.3", "fork-ts-checker-webpack-plugin": "9.0.2", - "globals": "15.15.0", + "globals": "16.0.0", "html-loader": "5.1.0", "html-webpack-plugin": "5.6.3", - "jsdom": "25.0.1", + "jsdom": "26.0.0", "mini-css-extract-plugin": "2.9.2", - "postcss": "8.5.2", + "postcss": "8.5.3", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.1.4", + "postcss-preset-env": "10.1.5", "postcss-scss": "4.0.9", - "sass": "1.85.0", + "sass": "1.86.0", "sass-loader": "16.0.5", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", "style-loader": "4.0.0", - "stylelint": "16.14.1", + "stylelint": "16.16.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.3.0", "stylelint-order": "6.0.4", - "stylelint-scss": "6.11.0", + "stylelint-scss": "6.11.1", "ts-loader": "9.5.2", - "typescript": "5.7.3", - "typescript-eslint": "8.24.1", - "vitest": "3.0.5", + "typescript": "5.8.2", + "typescript-eslint": "8.27.0", + "vitest": "3.0.9", "webpack": "5.98.0", "webpack-bundle-analyzer": "4.10.2", - "webpack-cli": "5.1.4", + "webpack-cli": "6.0.1", "webpack-dev-server": "5.2.0", "webpack-merge": "6.0.1", "worker-loader": "3.0.8" @@ -139,7 +140,7 @@ "yarn": "YARN NO LONGER USED - use npm instead." }, "optionalDependencies": { - "sass-embedded": "1.85.0" + "sass-embedded": "1.86.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -165,6 +166,27 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.1.tgz", + "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -190,22 +212,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", + "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -228,13 +250,13 @@ "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -507,26 +529,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -1730,9 +1752,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1756,16 +1778,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1782,9 +1804,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -1846,9 +1868,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "dev": true, "funding": [ { @@ -1866,9 +1888,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", - "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", "dev": true, "funding": [ { @@ -1890,9 +1912,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", - "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", "dev": true, "funding": [ { @@ -1906,8 +1928,8 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.1" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" }, "engines": { "node": ">=18" @@ -2049,9 +2071,9 @@ } }, "node_modules/@csstools/postcss-color-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.7.tgz", - "integrity": "sha512-aDHYmhNIHR6iLw4ElWhf+tRqqaXwKnMl0YsQ/X105Zc4dQwe6yJpMrTN6BwOoESrkDjOYMOfORviSSLeDTJkdQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.8.tgz", + "integrity": "sha512-9dUvP2qpZI6PlGQ/sob+95B3u5u7nkYt9yhZFCC7G9HBRHBxj+QxS/wUlwaMGYW0waf+NIierI8aoDTssEdRYw==", "dev": true, "funding": [ { @@ -2065,7 +2087,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2079,9 +2101,9 @@ } }, "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.7.tgz", - "integrity": "sha512-e68Nev4CxZYCLcrfWhHH4u/N1YocOfTmw67/kVX5Rb7rnguqqLyxPjhHWjSBX8o4bmyuukmNf3wrUSU3//kT7g==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.8.tgz", + "integrity": "sha512-yuZpgWUzqZWQhEqfvtJufhl28DgO9sBwSbXbf/59gejNuvZcoUTRGQZhzhwF4ccqb53YAGB+u92z9+eSKoB4YA==", "dev": true, "funding": [ { @@ -2095,7 +2117,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2138,9 +2160,9 @@ } }, "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.6.tgz", - "integrity": "sha512-IgJA5DQsQLu/upA3HcdvC6xEMR051ufebBTIXZ5E9/9iiaA7juXWz1ceYj814lnDYP/7eWjZnw0grRJlX4eI6g==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.7.tgz", + "integrity": "sha512-XTb6Mw0v2qXtQYRW9d9duAjDnoTbBpsngD7sRNLmYDjvwU2ebpIHplyxgOeo6jp/Kr52gkLi5VaK5RDCqzMzZQ==", "dev": true, "funding": [ { @@ -2154,7 +2176,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2193,9 +2215,9 @@ } }, "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.7.tgz", - "integrity": "sha512-gzFEZPoOkY0HqGdyeBXR3JP218Owr683u7KOZazTK7tQZBE8s2yhg06W1tshOqk7R7SWvw9gkw2TQogKpIW8Xw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.8.tgz", + "integrity": "sha512-/K8u9ZyGMGPjmwCSIjgaOLKfic2RIGdFHHes84XW5LnmrvdhOTVxo255NppHi3ROEvoHPW7MplMJgjZK5Q+TxA==", "dev": true, "funding": [ { @@ -2209,7 +2231,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2221,9 +2243,9 @@ } }, "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.7.tgz", - "integrity": "sha512-WgEyBeg6glUeTdS2XT7qeTFBthTJuXlS9GFro/DVomj7W7WMTamAwpoP4oQCq/0Ki2gvfRYFi/uZtmRE14/DFA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.8.tgz", + "integrity": "sha512-CoHQ/0UXrvxLovu0ZeW6c3/20hjJ/QRg6lyXm3dZLY/JgvRU6bdbQZF/Du30A4TvowfcgvIHQmP1bNXUxgDrAw==", "dev": true, "funding": [ { @@ -2237,7 +2259,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2251,9 +2273,9 @@ } }, "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.7.tgz", - "integrity": "sha512-LKYqjO+wGwDCfNIEllessCBWfR4MS/sS1WXO+j00KKyOjm7jDW2L6jzUmqASEiv/kkJO39GcoIOvTTfB3yeBUA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.8.tgz", + "integrity": "sha512-LpFKjX6hblpeqyych1cKmk+3FJZ19QmaJtqincySoMkbkG/w2tfbnO5oE6mlnCTXcGUJ0rCEuRHvTqKK0nHYUQ==", "dev": true, "funding": [ { @@ -2267,7 +2289,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2547,9 +2569,9 @@ } }, "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.6.tgz", - "integrity": "sha512-J1+4Fr2W3pLZsfxkFazK+9kr96LhEYqoeBszLmFjb6AjYs+g9oDAw3J5oQignLKk3rC9XHW+ebPTZ9FaW5u5pg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.7.tgz", + "integrity": "sha512-LB6tIP7iBZb5CYv8iRenfBZmbaG3DWNEziOnPjGoQX5P94FBPvvTBy68b/d9NnS5PELKwFmmOYsAEIgEhDPCHA==", "dev": true, "funding": [ { @@ -2563,7 +2585,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/media-query-list-parser": "^4.0.2" @@ -2705,9 +2727,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.7.tgz", - "integrity": "sha512-I6WFQIbEKG2IO3vhaMGZDkucbCaUSXMxvHNzDdnfsTCF5tc0UlV3Oe2AhamatQoKFjBi75dSEMrgWq3+RegsOQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.8.tgz", + "integrity": "sha512-+5aPsNWgxohXoYNS1f+Ys0x3Qnfehgygv3qrPyv+Y25G0yX54/WlVB+IXprqBLOXHM1gsVF+QQSjlArhygna0Q==", "dev": true, "funding": [ { @@ -2721,7 +2743,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2761,9 +2783,9 @@ } }, "node_modules/@csstools/postcss-random-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.2.tgz", - "integrity": "sha512-vBCT6JvgdEkvRc91NFoNrLjgGtkLWt47GKT6E2UDn3nd8ZkMBiziQ1Md1OiKoSsgzxsSnGKG3RVdhlbdZEkHjA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.3.tgz", + "integrity": "sha512-dbNeEEPHxAwfQJ3duRL5IPpuD77QAHtRl4bAHRs0vOVhVbHrsL7mHnwe0irYjbs9kYwhAHZBQTLBgmvufPuRkA==", "dev": true, "funding": [ { @@ -2777,7 +2799,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2789,9 +2811,9 @@ } }, "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.7.tgz", - "integrity": "sha512-apbT31vsJVd18MabfPOnE977xgct5B1I+Jpf+Munw3n6kKb1MMuUmGGH+PT9Hm/fFs6fe61Q/EWnkrb4bNoNQw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.8.tgz", + "integrity": "sha512-eGE31oLnJDoUysDdjS9MLxNZdtqqSxjDXMdISpLh80QMaYrKs7VINpid34tWQ+iU23Wg5x76qAzf1Q/SLLbZVg==", "dev": true, "funding": [ { @@ -2805,7 +2827,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -2859,9 +2881,9 @@ } }, "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.1.tgz", - "integrity": "sha512-MslYkZCeMQDxetNkfmmQYgKCy4c+w9pPDfgOBCJOo/RI1RveEUdZQYtOfrC6cIZB7sD7/PHr2VGOcMXlZawrnA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.2.tgz", + "integrity": "sha512-4EcAvXTUPh7n6UoZZkCzgtCf/wPzMlTNuddcKg7HG8ozfQkUcHsJ2faQKeLmjyKdYPyOUn4YA7yDPf8K/jfIxw==", "dev": true, "funding": [ { @@ -2875,7 +2897,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2887,9 +2909,9 @@ } }, "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.6.tgz", - "integrity": "sha512-/dwlO9w8vfKgiADxpxUbZOWlL5zKoRIsCymYoh1IPuBsXODKanKnfuZRr32DEqT0//3Av1VjfNZU9yhxtEfIeA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.7.tgz", + "integrity": "sha512-rdrRCKRnWtj5FyRin0u/gLla7CIvZRw/zMGI1fVJP0Sg/m1WGicjPVHRANL++3HQtsiXKAbPrcPr+VkyGck0IA==", "dev": true, "funding": [ { @@ -2903,7 +2925,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -2915,9 +2937,9 @@ } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", - "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", "dev": true, "funding": [ { @@ -2931,7 +2953,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/color-helpers": "^5.0.1", + "@csstools/color-helpers": "^5.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -2942,9 +2964,9 @@ } }, "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.6.tgz", - "integrity": "sha512-c4Y1D2Why/PeccaSouXnTt6WcNHJkoJRidV2VW9s5gJ97cNxnLgQ4Qj8qOqkIR9VmTQKJyNcbF4hy79ZQnWD7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.7.tgz", + "integrity": "sha512-qTrZgLju3AV7Djhzuh2Bq/wjFqbcypnk0FhHjxW8DWJQcZLS1HecIus4X2/RLch1ukX7b+YYCdqbEnpIQO5ccg==", "dev": true, "funding": [ { @@ -2958,7 +2980,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" }, @@ -3047,16 +3069,16 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", - "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -3111,17 +3133,17 @@ "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.13.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", - "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, @@ -3135,15 +3157,15 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz", - "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, @@ -3154,17 +3176,17 @@ "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", - "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", + "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -3183,9 +3205,9 @@ "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0" @@ -3676,10 +3698,20 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3690,9 +3722,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3792,10 +3824,11 @@ } }, "node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -3811,13 +3844,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", - "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.11.0", + "@eslint/core": "^0.12.0", "levn": "^0.4.1" }, "engines": { @@ -3825,40 +3858,58 @@ } }, "node_modules/@fontsource/noto-sans": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.1.1.tgz", - "integrity": "sha512-WesuII3BzvzVr0JqYIgnEeJPwXvpFAo9tNCMH1AqoLSCdStKJugMaIcVJ/sT+Pw9ytIlUO3ccbqbe+BhhsXm9g==", - "license": "OFL-1.1" + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.2.6.tgz", + "integrity": "sha512-46D39T1/QJ16LSbCTaNjjrGS6Y69FMLS9FeHKsrXSQg15Z2MFqmlnNMpURx2l6Sr3x9t9EVdr3CAkHnZyvea+w==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } }, "node_modules/@fontsource/noto-sans-hk": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.1.1.tgz", - "integrity": "sha512-RZaCbu6U5PLl7umS0PQkH6draUPKPRfNJKuwu7LTrec7TRody+8FuaM4YnPn6C4u7qiVvVjSErRk2wToLWcu7A==", - "license": "OFL-1.1" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.2.5.tgz", + "integrity": "sha512-dQK+2kLRChvlbvsXadnvfjBy1+hQojKu/zobeLiKXquFWJis9CdwNIaxTFa4Khwsq8HzR9JzxGb6L1tSK6JWYw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } }, "node_modules/@fontsource/noto-sans-jp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.1.1.tgz", - "integrity": "sha512-PXk7mDjiaW99xU85IIxRGekzxLz91h2usk0rfDXSVwds9Nuo4sdlDUEE8PQ1P3VLnV00FsCHfSH54uR217VXpg==", - "license": "OFL-1.1" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.5.tgz", + "integrity": "sha512-ISoJUQlsuSo4y56P+eJD+g022BRAF1BC2uCyEFGRsob0g8VvQAoWNMlWh+P0VQw68QzZHHj41zRzeRFpzAdA7w==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } }, "node_modules/@fontsource/noto-sans-kr": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.1.1.tgz", - "integrity": "sha512-YOa3i3+ze8wtlvsN9TMNQVD2NUOTQEShBz9HZQ6j9SqWuQeOREq2ux//32IzDfNnGNZC0ddeH7oNb1F9OsS3UA==", - "license": "OFL-1.1" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.2.5.tgz", + "integrity": "sha512-9swPyua410J00z+GhemPKK/StWdiW07dchS9JcskesdQrhnPBLD6zVQtQsrj+ZPXTFBftbcrMlWFsWhmFn6S9w==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } }, "node_modules/@fontsource/noto-sans-sc": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.1.1.tgz", - "integrity": "sha512-v20RiW0Hp9qnHjLV5IAIwloL3IIKy2elMyMSeLuMzqyhYTCD2kHuRoe4w0aA+sd19IaWtdo2diHskIFL0Asfgw==", - "license": "OFL-1.1" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.2.5.tgz", + "integrity": "sha512-rYAl3Alcjo2PnI0sqzRfnA022H8yWePNrjYalApQwYE+fFlaXmD6Mm3E9wmJCpmJM8clwhQWq/E8IlPl1bmZHQ==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } }, "node_modules/@fontsource/noto-sans-tc": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.1.1.tgz", - "integrity": "sha512-uJyenCRVZdiz+iRUyKwn99FDKQ0xMmLTOVHNzscqnp4ZwqYOl5S7fuL3IfH5FRRGYW+FTKtuY43D6gtVNtmrug==", - "license": "OFL-1.1" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.2.5.tgz", + "integrity": "sha512-+qQKW1slXsS5H5AvsiBfNo7krmuxyKkb6vV2l/nE7Uyd5TBpaomub+kuIO3iwgLBtVOesSkl6HwtR4SNxry+FA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } }, "node_modules/@humanfs/core": { "version": "0.19.1", @@ -4013,9 +4064,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.202502210501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202502210501.tgz", - "integrity": "sha512-IFfgfESaHoHsLZbo+eKd+cGtwjgW7bj1hmX8Igc1eV0UHJ1SlLTvjRecm4pp85vvE7u6elrwgVhIsFS0hYucqA==", + "version": "0.0.0-unstable.202503260501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202503260501.tgz", + "integrity": "sha512-wsiDOwE+5eiy4FZ3UDfxgOL7PZMAh1W1VAScbb+OUeuJCfsSh8UKZM9B9mAvuotWxx8Orw9yLmvT57g/UthOqQ==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.3.4" @@ -4133,9 +4184,9 @@ } }, "node_modules/@keyv/serialize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.2.tgz", - "integrity": "sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", "dev": true, "license": "MIT", "dependencies": { @@ -4149,9 +4200,10 @@ "dev": true }, "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", "optional": true, "dependencies": { "detect-libc": "^2.0.0", @@ -4168,10 +4220,39 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@mapbox/node-pre-gyp/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "optional": true, "dependencies": { "glob": "^7.1.3" @@ -4184,13 +4265,11 @@ } }, "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -4219,9 +4298,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.14.tgz", - "integrity": "sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.8.tgz", + "integrity": "sha512-vjP4+A1ybyCRhDZC7r5EPWu/gLseFZxaGyPdDl94vzVvk6Yj6gahdaqcjbhkaCrJjdZj90m3VioltWPAnWF/zw==", "license": "MIT", "funding": { "type": "opencollective", @@ -4229,22 +4308,22 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.14.tgz", - "integrity": "sha512-heL4S+EawrP61xMXBm59QH6HODsu0gxtZi5JtnXF2r+rghzyU/3Uftlt1ij8rmJh+cFdKTQug1L9KkZB5JgpMQ==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.8.tgz", + "integrity": "sha512-LKGWiLWRyoOw3dWxZQ+lV//mK+4DVTTAiLd2ljmJdD6XV0rDB8JFKjRD9nyn9cJAU5XgWnii7ZR3c93ttUnMKg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9" + "@babel/runtime": "^7.26.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^5.0.0", + "@mui/material": "^6.4.8", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -4255,26 +4334,26 @@ } }, "node_modules/@mui/material": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.14.tgz", - "integrity": "sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.8.tgz", + "integrity": "sha512-5S9UTjKZZBd9GfbcYh/nYfD9cv6OXmj5Y7NgKYfk7JcSoshp8/pW5zP4wecRiroBSZX8wcrywSgogpVNO+5W0Q==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.14", - "@mui/system": "^5.16.14", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.14", + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.4.8", + "@mui/system": "^6.4.8", + "@mui/types": "~7.2.24", + "@mui/utils": "^6.4.8", "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^19.0.0", "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -4283,6 +4362,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.4.8", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4294,6 +4374,9 @@ "@emotion/styled": { "optional": true }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } @@ -4306,17 +4389,17 @@ "license": "MIT" }, "node_modules/@mui/private-theming": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.14.tgz", - "integrity": "sha512-12t7NKzvYi819IO5IapW2BcR33wP/KAVrU8d7gLhGHoAmhDxyXlRoKiRij3TOD8+uzk0B6R9wHUNKi4baJcRNg==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.8.tgz", + "integrity": "sha512-sWwQoNSn6elsPTAtSqCf+w5aaGoh7AASURNmpy+QTTD/zwJ0Jgwt0ZaaP6mXq2IcgHxYnYloM/+vJgHPMkRKTQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.14", + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.4.8", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -4333,18 +4416,20 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", - "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.8.tgz", + "integrity": "sha512-oyjx1b1FvUCI85ZMO4trrjNxGm90eLN3Ohy0AP/SqK5gWvRQg1677UjNf7t6iETOKAleHctJjuq0B3aXO2gtmw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", + "@babel/runtime": "^7.26.0", "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -4365,22 +4450,22 @@ } }, "node_modules/@mui/system": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.14.tgz", - "integrity": "sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.8.tgz", + "integrity": "sha512-gV7iBHoqlsIenU2BP0wq14BefRoZcASZ/4LeyuQglayBl+DfLX5rEd3EYR3J409V2EZpR0NOM1LATAGlNk2cyA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.14", - "@mui/styled-engine": "^5.16.14", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.14", - "clsx": "^2.1.0", + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.4.8", + "@mui/styled-engine": "^6.4.8", + "@mui/types": "~7.2.24", + "@mui/utils": "^6.4.8", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -4405,11 +4490,12 @@ } }, "node_modules/@mui/types": { - "version": "7.2.15", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", - "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4418,20 +4504,20 @@ } }, "node_modules/@mui/utils": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz", - "integrity": "sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.8.tgz", + "integrity": "sha512-C86gfiZ5BfZ51KqzqoHi1WuuM2QdSKoFhbkZeAfQRB+jCc4YNhhj11UXFVMMsqBgZ+Zy8IHNJW3M9Wj/LOwRXQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", + "@babel/runtime": "^7.26.0", + "@mui/types": "~7.2.24", + "@types/prop-types": "^15.7.14", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^19.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -4454,14 +4540,14 @@ "license": "MIT" }, "node_modules/@mui/x-date-pickers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.26.0.tgz", - "integrity": "sha512-bhSDce1b5MBYYlCdHQJBThe10LGTE3D/u53TDQ41+IRj+iiNCun8jivw3DxKhmoBxlB+hVdkcltpTtIGlPjQZQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.28.0.tgz", + "integrity": "sha512-m1bfkZLOw3cMogeh6q92SjykVmLzfptnz3ZTgAlFKV7UBnVFuGUITvmwbgTZ1Mz3FmLVnGUQYUpZWw0ZnoghNA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-internals": "7.26.0", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", + "@mui/x-internals": "7.28.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -4477,8 +4563,8 @@ "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0", - "@mui/system": "^5.15.14 || ^6.0.0", + "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", "dayjs": "^1.10.7", @@ -4520,13 +4606,13 @@ } }, "node_modules/@mui/x-internals": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.26.0.tgz", - "integrity": "sha512-VxTCYQcZ02d3190pdvys2TDg9pgbvewAVakEopiOgReKAUhLdRlgGJHcOA/eAuGLyK1YIo26A6Ow6ZKlSRLwMg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.28.0.tgz", + "integrity": "sha512-p4GEp/09bLDumktdIMiw+OF4p+pJOOjTG0VUvzNxjbHB9GxbBKoMcHrmyrURqoBnQpWIeFnN/QAoLMFSpfwQbw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0" + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta" }, "engines": { "node": ">=14.0.0" @@ -4931,9 +5017,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", - "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -5193,26 +5279,14 @@ "dev": true, "license": "MIT" }, - "node_modules/@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@stylistic/eslint-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.1.0.tgz", - "integrity": "sha512-pA6VOrOqk0+S8toJYhQGv2MWpQQR0QpeUo9AhNkC49Y26nxBQ/nH1rta9bUU1rPw2fJ1zZEMV5oCX5AazT7J2g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz", + "integrity": "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.13.0", + "@typescript-eslint/utils": "^8.23.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", @@ -5222,7 +5296,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=8.40.0" + "eslint": ">=9.0.0" } }, "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { @@ -5311,9 +5385,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.16.tgz", - "integrity": "sha512-9Sgft7Qavcd+sN0V25xVyo0nfmcZXBuODy3FVG7BMWTg1HMLm8wwG5tNlLlmSic1u7l1v786oavn+STiFaPH2g==", + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.69.0.tgz", + "integrity": "sha512-Kn410jq6vs1P8Nm+ZsRj9H+U3C0kjuEkYLxbiCyn3MDEiYor1j2DGVULqAz62SLZtUZ/e9Xt6xMXiJ3NJ65WyQ==", "license": "MIT", "funding": { "type": "github", @@ -5321,9 +5395,9 @@ } }, "node_modules/@tanstack/query-devtools": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.62.16.tgz", - "integrity": "sha512-3ff6UBJr0H3nIhfLSl9911rvKqXf0u4B58jl0uYdDWLqPk9pCvYIbxC35cGxK2+8INl4IaFVUHb/IdgWrNkg3Q==", + "version": "5.67.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.67.2.tgz", + "integrity": "sha512-O4QXFFd7xqp6EX7sdvc9tsVO8nm4lpWBqwpgjpVLW5g7IeOY6VnS/xvs/YzbRhBVkKTMaJMOUGU7NhSX+YGoNg==", "license": "MIT", "funding": { "type": "github", @@ -5331,12 +5405,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.16.tgz", - "integrity": "sha512-XJIZNj65d2IdvU8VBESmrPakfIm6FSdHDzrS1dPrAwmq3ZX+9riMh/ZfbNQHAWnhrgmq7KoXpgZSRyXnqMYT9A==", + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.69.0.tgz", + "integrity": "sha512-Ift3IUNQqTcaFa1AiIQ7WCb/PPy8aexZdq9pZWLXhfLcLxH0+PZqJ2xFImxCpdDZrFRZhLJrh76geevS5xjRhA==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.62.16" + "@tanstack/query-core": "5.69.0" }, "funding": { "type": "github", @@ -5347,26 +5421,26 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.62.16.tgz", - "integrity": "sha512-EjF0tgHnWYcqhk8KxGKnmGlYcnldhWjW3bbH2WZqxo7t41ytzkIQtZ/UyLph//YMmZZE/RVTmSo3rGq/EG9iCA==", + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.69.0.tgz", + "integrity": "sha512-sYklnou3IKAemqB5wJeBwjmG5bUGDKAL5/I4pVA+aqSnsNibVLt8/pAU976uuJ5K71w71bHtI/AMxiIs3gtkEA==", "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.62.16" + "@tanstack/query-devtools": "5.67.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.62.16", + "@tanstack/react-query": "^5.69.0", "react": "^18 || ^19" } }, "node_modules/@tanstack/react-table": { - "version": "8.20.5", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", - "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "version": "8.20.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.6.tgz", + "integrity": "sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==", "license": "MIT", "dependencies": { "@tanstack/table-core": "8.20.5" @@ -5384,20 +5458,20 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.10.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.6.tgz", - "integrity": "sha512-xaSy6uUxB92O8mngHZ6CvbhGuqxQ5lIZWCBy+FjhrbHmOwc6BnOnKkYm2FsB1/BpKw/+FVctlMbEtI+F6I1aJg==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz", + "integrity": "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.10.6" + "@tanstack/virtual-core": "3.11.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@tanstack/table-core": { @@ -5414,9 +5488,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.10.6", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.6.tgz", - "integrity": "sha512-1giLc4dzgEKLMx5pgKjL6HlG5fjZMgCjzlKAlpr7yoUtetVPELgER1NtephAI910nMwfPTHNyWKSFmJdHkz2Cw==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz", + "integrity": "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==", "license": "MIT", "funding": { "type": "github", @@ -5705,9 +5779,10 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.7", @@ -5722,9 +5797,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "version": "18.3.19", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.19.tgz", + "integrity": "sha512-fcdJqaHOMDbiAwJnXv6XCzX0jDW77yI3tJqYh1Byn8EL5/S628WRx9b/y3DnNe55zTukUQKrfYxiZls2dHcUMw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -5732,13 +5807,13 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, "license": "MIT", - "dependencies": { - "@types/react": "*" + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/react-lazy-load-image-component": { @@ -5753,10 +5828,11 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", - "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", - "dependencies": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { "@types/react": "*" } }, @@ -5866,16 +5942,47 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.27.0.tgz", + "integrity": "sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.27.0", + "@typescript-eslint/type-utils": "8.27.0", + "@typescript-eslint/utils": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.27.0.tgz", + "integrity": "sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.27.0", + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/typescript-estree": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0", "debug": "^4.3.4" }, "engines": { @@ -5887,17 +5994,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.27.0.tgz", + "integrity": "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5907,11 +6015,36 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.27.0.tgz", + "integrity": "sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==", "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.27.0", + "@typescript-eslint/utils": "8.27.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.27.0.tgz", + "integrity": "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==", + "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5920,14 +6053,15 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.27.0.tgz", + "integrity": "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5943,131 +6077,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.24.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -6097,9 +6107,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { @@ -6110,16 +6120,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.27.0.tgz", + "integrity": "sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" + "@typescript-eslint/scope-manager": "8.27.0", + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/typescript-estree": "8.27.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6130,17 +6140,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.27.0.tgz", + "integrity": "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/types": "8.27.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -6171,10 +6181,11 @@ "dev": true }, "node_modules/@vitest/coverage-v8": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.5.tgz", - "integrity": "sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.9.tgz", + "integrity": "sha512-15OACZcBtQ34keIEn19JYTVuMFTlFrClclwWjHo/IRPg/8ELpkgNTl0o7WLP9WO9XGH6+tip9CPYtEOrIDJvBA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", @@ -6193,8 +6204,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.0.5", - "vitest": "3.0.5" + "@vitest/browser": "3.0.9", + "vitest": "3.0.9" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -6203,14 +6214,15 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", - "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", + "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/spy": "3.0.9", + "@vitest/utils": "3.0.9", + "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, "funding": { @@ -6218,12 +6230,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", - "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", + "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.5", + "@vitest/spy": "3.0.9", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -6244,10 +6257,11 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", - "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", + "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", "dev": true, + "license": "MIT", "dependencies": { "tinyrainbow": "^2.0.0" }, @@ -6256,49 +6270,40 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", - "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", + "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.5", - "pathe": "^2.0.2" + "@vitest/utils": "3.0.9", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", - "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", + "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.5", + "@vitest/pretty-format": "3.0.9", "magic-string": "^0.30.17", - "pathe": "^2.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", - "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", - "dev": true, - "dependencies": { - "tinyrainbow": "^2.0.0" + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/spy": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", - "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", + "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", "dev": true, + "license": "MIT", "dependencies": { "tinyspy": "^3.0.2" }, @@ -6307,25 +6312,14 @@ } }, "node_modules/@vitest/utils": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", - "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "3.0.5", - "loupe": "^3.1.2", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", - "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", + "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", "dev": true, + "license": "MIT", "dependencies": { + "@vitest/pretty-format": "3.0.9", + "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, "funding": { @@ -6494,42 +6488,45 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.15.0" + "node": ">=18.12.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.15.0" + "node": ">=18.12.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.15.0" + "node": ">=18.12.0" }, "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -6563,6 +6560,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC", "optional": true }, "node_modules/abortcontroller-polyfill": { @@ -6585,9 +6583,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", "bin": { @@ -6607,24 +6605,26 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -6722,12 +6722,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "license": "ISC", "optional": true }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "optional": true, "dependencies": { "delegates": "^1.0.0", @@ -6741,6 +6744,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "optional": true, "dependencies": { "inherits": "^2.0.3", @@ -7067,9 +7071,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -7087,11 +7091,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -7131,9 +7135,10 @@ } }, "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", + "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", + "license": "MIT", "peer": true, "dependencies": { "follow-redirects": "^1.15.6", @@ -7152,21 +7157,85 @@ } }, "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", "dev": true, "license": "MIT", "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" + "find-up": "^5.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", - "webpack": ">=5" + "webpack": ">=5.61.0" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/babel-plugin-macros": { @@ -7416,6 +7485,64 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/blurhash": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", @@ -7700,24 +7827,24 @@ } }, "node_modules/cacheable": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.8.tgz", - "integrity": "sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.9.tgz", + "integrity": "sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.7.0", - "keyv": "^5.2.3" + "hookified": "^1.7.1", + "keyv": "^5.3.1" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.3.tgz", - "integrity": "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.2.tgz", + "integrity": "sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==", "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.0.2" + "@keyv/serialize": "^1.0.3" } }, "node_modules/call-bind": { @@ -7743,7 +7870,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7839,9 +7965,9 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", + "version": "1.0.30001706", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", + "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", "dev": true, "funding": [ { @@ -7860,18 +7986,20 @@ "license": "CC-BY-4.0" }, "node_modules/canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.1.0.tgz", + "integrity": "sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==", + "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1" }, "engines": { - "node": ">=6" + "node": "^18.12.0 || >= 20.9.0" } }, "node_modules/ccount": { @@ -7989,13 +8117,13 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC", "optional": true, - "engines": { - "node": ">=10" - } + "peer": true }, "node_modules/chrome-trace-event": { "version": "1.0.3", @@ -8178,6 +8306,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", "optional": true, "bin": { "color-support": "bin.js" @@ -8238,12 +8367,6 @@ "node": ">= 10" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -8320,6 +8443,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC", "optional": true }, "node_modules/content-disposition": { @@ -8398,17 +8522,17 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", "dev": true, + "license": "MIT", "dependencies": { - "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^14.0.0", "normalize-path": "^3.0.0", "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" }, "engines": { "node": ">= 18.12.0" @@ -8426,6 +8550,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -8433,54 +8558,10 @@ "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^1.0.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/core-js": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", - "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8980,13 +9061,14 @@ "license": "CC0-1.0" }, "node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", + "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", "dev": true, "license": "MIT", "dependencies": { - "rrweb-cssom": "^0.7.1" + "@asamuzakjp/css-color": "^3.1.1", + "rrweb-cssom": "^0.8.0" }, "engines": { "node": ">=18" @@ -9176,15 +9258,21 @@ } }, "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "mimic-response": "^2.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/deep-eql": { @@ -9196,6 +9284,18 @@ "node": ">=6" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -9369,6 +9469,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT", "optional": true }, "node_modules/depd": { @@ -9392,9 +9493,10 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" @@ -9533,7 +9635,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -9601,6 +9702,18 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -9635,10 +9748,11 @@ } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -9737,17 +9851,18 @@ } }, "node_modules/es-check": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/es-check/-/es-check-7.2.1.tgz", - "integrity": "sha512-4sxU2OZ1aYYRRX2ajL3hDDBaY96Yr/OcH6MTRerIuOSyil6SQYQQ0b48uqVfYGRCiI0NgJbtY6Sbmf75oPaTeQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/es-check/-/es-check-8.0.2.tgz", + "integrity": "sha512-m/8jzwE6rasRx+Lhz7J5OIZzt2LmEC53kBPkUqQHk/6BMjo77HoHsdoQKeps8mgLASlb8nRuKZnuRai/iZHrHg==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "8.11.3", - "commander": "12.0.0", - "fast-glob": "^3.3.2", - "supports-color": "^8.1.1", - "winston": "3.13.0" + "acorn": "8.14.0", + "acorn-walk": "^8.3.4", + "commander": "13.1.0", + "fast-glob": "^3.3.3", + "supports-color": "8.1.1", + "winston": "3.17.0" }, "bin": { "es-check": "index.js" @@ -9757,9 +9872,9 @@ } }, "node_modules/es-check/node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { @@ -9796,7 +9911,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9806,7 +9920,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -9850,7 +9963,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -9862,7 +9974,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -10000,22 +10111,23 @@ } }, "node_modules/eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -10023,7 +10135,7 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -10163,6 +10275,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-compat/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-compat/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -10350,9 +10475,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", - "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", "engines": { @@ -10582,9 +10707,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10774,19 +10899,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", @@ -10985,6 +11097,18 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "license": "(MIT OR WTFPL)", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/expect-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", @@ -11253,7 +11377,6 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -11390,119 +11513,6 @@ "node": ">= 0.8" } }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -11560,9 +11570,9 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, @@ -11906,12 +11916,14 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -11962,6 +11974,15 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -11980,6 +12001,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", "optional": true, "dependencies": { "minipass": "^3.0.0" @@ -11992,6 +12014,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", "optional": true, "dependencies": { "yallist": "^4.0.0" @@ -12081,6 +12104,8 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -12110,7 +12135,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -12135,7 +12159,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -12184,6 +12207,15 @@ "node": ">=0.10.0" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -12261,10 +12293,11 @@ } }, "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -12339,7 +12372,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12465,7 +12497,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12478,7 +12509,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -12493,6 +12523,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC", "optional": true }, "node_modules/has-value": { @@ -12590,12 +12621,13 @@ "integrity": "sha512-iXnAafUm3FdzfJ91uixLws2hkKI1jC8bAKK/pt7XYr8Ie1jO7xbK48Ycpl9tUPyBgkzuj1p/PhJS0fy4E/5anA==" }, "node_modules/highlight-words": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz", - "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-2.0.0.tgz", + "integrity": "sha512-If5n+IhSBRXTScE7wl16VPmd+44Vy7kof24EdqhjsZsDuHikpv1OCagVcJFpB4fS4UPUniedlWqrjIO8vWOsIQ==", + "license": "MIT", "engines": { - "node": ">= 16", - "npm": ">= 8" + "node": ">= 20", + "npm": ">= 9" } }, "node_modules/history": { @@ -12621,9 +12653,9 @@ } }, "node_modules/hookified": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.7.0.tgz", - "integrity": "sha512-XQdMjqC1AyeOzfs+17cnIk7Wdfu1hh2JtcyNfBf5u9jHrT3iZUlGHxLTntFBuk5lwkqJ6l3+daeQdHK5yByHVA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.8.1.tgz", + "integrity": "sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==", "dev": true, "license": "MIT" }, @@ -12940,18 +12972,6 @@ "node": ">= 14" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/http-proxy-middleware": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", @@ -12990,16 +13010,17 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/hyperdyperid": { @@ -14213,23 +14234,23 @@ } }, "node_modules/jsdom": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", "dev": true, "license": "MIT", "dependencies": { - "cssstyle": "^4.1.0", + "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", - "form-data": "^4.0.0", + "form-data": "^4.0.1", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", + "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.0.0", @@ -14237,7 +14258,7 @@ "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", + "whatwg-url": "^14.1.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, @@ -14245,7 +14266,7 @@ "node": ">=18" }, "peerDependencies": { - "canvas": "^2.11.2" + "canvas": "^3.0.0" }, "peerDependenciesMeta": { "canvas": { @@ -14253,33 +14274,6 @@ } } }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/jsesc": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", @@ -14675,9 +14669,9 @@ } }, "node_modules/logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14745,7 +14739,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -14778,6 +14772,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", "optional": true, "dependencies": { "semver": "^6.0.0" @@ -14881,15 +14876,15 @@ "integrity": "sha512-lSj71DgVv20kO0kGbs42icDzbRot61gEDBLQACzkUuznRQBUYmbxzEkGU6dNBb5fRWHMaScYlAXX96HQ4/cJWA==" }, "node_modules/material-react-table": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-2.13.3.tgz", - "integrity": "sha512-xeyAEG6UYG3qgBIo17epAP5zsWT1pH0uCEkaUxvhki9sGcP35OqfOMSZJNhISvmqEqXKYHdqKbZI6iOwsg1sYA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-3.2.1.tgz", + "integrity": "sha512-sQtTf7bETpkPN2Hm5BVtz89wrfXCVQguz6XlwMChSnfKFO5QCKAJJC5aSIKnUc3S0AvTz/k/ILi00FnnY1Gixw==", "license": "MIT", "dependencies": { "@tanstack/match-sorter-utils": "8.19.4", - "@tanstack/react-table": "8.20.5", - "@tanstack/react-virtual": "3.10.6", - "highlight-words": "1.2.2" + "@tanstack/react-table": "8.20.6", + "@tanstack/react-virtual": "3.11.2", + "highlight-words": "2.0.0" }, "engines": { "node": ">=16" @@ -14899,20 +14894,19 @@ "url": "https://github.com/sponsors/kevinvandy" }, "peerDependencies": { - "@emotion/react": ">=11.11", - "@emotion/styled": ">=11.11", - "@mui/icons-material": ">=5.11", - "@mui/material": ">=5.13", - "@mui/x-date-pickers": ">=6.15.0", - "react": ">=17.0", - "react-dom": ">=17.0" + "@emotion/react": ">=11.13", + "@emotion/styled": ">=11.13", + "@mui/icons-material": ">=6", + "@mui/material": ">=6", + "@mui/x-date-pickers": ">=7.15", + "react": ">=18.0", + "react-dom": ">=18.0" } }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15133,12 +15127,15 @@ } }, "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", "optional": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15216,6 +15213,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", "optional": true, "engines": { "node": ">=8" @@ -15225,6 +15223,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", "optional": true, "dependencies": { "minipass": "^3.0.0", @@ -15238,6 +15237,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", "optional": true, "dependencies": { "yallist": "^4.0.0" @@ -15283,6 +15283,15 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -15299,9 +15308,10 @@ "license": "MIT" }, "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "license": "MIT", "optional": true }, "node_modules/nanoid": { @@ -15344,6 +15354,15 @@ "node": ">=0.10.0" } }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/native-promise-only": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", @@ -15385,6 +15404,36 @@ "tslib": "^2.0.3" } }, + "node_modules/node-abi": { + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -15400,9 +15449,10 @@ "optional": true }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "optional": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -15423,18 +15473,21 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT", "optional": true }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause", "optional": true }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "optional": true, "dependencies": { "tr46": "~0.0.3", @@ -15461,6 +15514,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", "optional": true, "dependencies": { "abbrev": "1" @@ -15521,6 +15575,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", "optional": true, "dependencies": { "are-we-there-yet": "^2.0.0", @@ -15548,9 +15604,9 @@ "dev": true }, "node_modules/nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.19.tgz", + "integrity": "sha512-94bcyI3RsqiZufXjkr3ltkI86iEl+I7uiHVDtcq9wJUTwYQJ5odHDeSzkkrRzi80jJ8MaeZgqKjH1bAWAFw9bA==", "dev": true, "license": "MIT" }, @@ -15985,22 +16041,24 @@ } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5/node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -16173,6 +16231,60 @@ "path2d-polyfill": "^2.0.1" } }, + "node_modules/pdfjs-dist/node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pdfjs-dist/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pdfjs-dist/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pdfjs-dist/node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "license": "MIT", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -16265,9 +16377,9 @@ } }, "node_modules/postcss": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", - "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -16366,9 +16478,9 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.7.tgz", - "integrity": "sha512-EZvAHsvyASX63vXnyXOIynkxhaHRSsdb7z6yiXKIovGXAolW4cMZ3qoh7k3VdTsLBS6VGdksGfIo3r6+waLoOw==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.8.tgz", + "integrity": "sha512-S/TpMKVKofNvsxfau/+bw+IA6cSfB6/kmzFj5szUofHOVnFFMB2WwK+Zu07BeMD8T0n+ZnTO5uXiMvAKe2dPkA==", "dev": true, "funding": [ { @@ -16382,7 +16494,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -16943,9 +17055,9 @@ } }, "node_modules/postcss-lab-function": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.7.tgz", - "integrity": "sha512-+ONj2bpOQfsCKZE2T9VGMyVVdGcGUpr7u3SVfvkJlvhTRmDCfY25k4Jc8fubB9DclAPR4+w8uVtDZmdRgdAHig==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.8.tgz", + "integrity": "sha512-plV21I86Hg9q8omNz13G9fhPtLopIWH06bt/Cb5cs1XnaGU2kUtEitvVd4vtQb/VqCdNUHK5swKn3QFmMRbpDg==", "dev": true, "funding": [ { @@ -16959,7 +17071,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -17162,9 +17274,9 @@ } }, "node_modules/postcss-logical": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", - "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", "dev": true, "funding": [ { @@ -17838,9 +17950,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.4.tgz", - "integrity": "sha512-awWKS3CwyY7I4Eb3YSWOZisbj3qXyuQCrylYiu2vSHxnSZAj3LHStN6jOcpCrc6EjYunLwbeNto3M5/JBtXpzg==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.5.tgz", + "integrity": "sha512-LQybafF/K7H+6fAs4SIkgzkSCixJy0/h0gubDIAP3Ihz+IQBRwsjyvBnAZ3JUHD+A/ITaxVRPDxn//a3Qy4pDw==", "dev": true, "funding": [ { @@ -17855,14 +17967,14 @@ "license": "MIT-0", "dependencies": { "@csstools/postcss-cascade-layers": "^5.0.1", - "@csstools/postcss-color-function": "^4.0.7", - "@csstools/postcss-color-mix-function": "^3.0.7", + "@csstools/postcss-color-function": "^4.0.8", + "@csstools/postcss-color-mix-function": "^3.0.8", "@csstools/postcss-content-alt-text": "^2.0.4", - "@csstools/postcss-exponential-functions": "^2.0.6", + "@csstools/postcss-exponential-functions": "^2.0.7", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.7", - "@csstools/postcss-gradients-interpolation-method": "^5.0.7", - "@csstools/postcss-hwb-function": "^4.0.7", + "@csstools/postcss-gamut-mapping": "^2.0.8", + "@csstools/postcss-gradients-interpolation-method": "^5.0.8", + "@csstools/postcss-hwb-function": "^4.0.8", "@csstools/postcss-ic-unit": "^4.0.0", "@csstools/postcss-initial": "^2.0.1", "@csstools/postcss-is-pseudo-class": "^5.0.1", @@ -17872,19 +17984,19 @@ "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", "@csstools/postcss-logical-viewport-units": "^3.0.3", - "@csstools/postcss-media-minmax": "^2.0.6", + "@csstools/postcss-media-minmax": "^2.0.7", "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.7", + "@csstools/postcss-oklab-function": "^4.0.8", "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-random-function": "^1.0.2", - "@csstools/postcss-relative-color-syntax": "^3.0.7", + "@csstools/postcss-random-function": "^1.0.3", + "@csstools/postcss-relative-color-syntax": "^3.0.8", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.1", - "@csstools/postcss-stepped-value-functions": "^4.0.6", - "@csstools/postcss-text-decoration-shorthand": "^4.0.1", - "@csstools/postcss-trigonometric-functions": "^4.0.6", + "@csstools/postcss-sign-functions": "^1.1.2", + "@csstools/postcss-stepped-value-functions": "^4.0.7", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.7", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.19", "browserslist": "^4.24.4", @@ -17894,7 +18006,7 @@ "cssdb": "^8.2.3", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.7", + "postcss-color-functional-notation": "^7.0.8", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", "postcss-custom-media": "^11.0.5", @@ -17907,8 +18019,8 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.7", - "postcss-logical": "^8.0.0", + "postcss-lab-function": "^7.0.8", + "postcss-logical": "^8.1.0", "postcss-nesting": "^13.0.1", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", @@ -18353,6 +18465,35 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18415,6 +18556,19 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "peer": true }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -18525,6 +18679,36 @@ "node": ">=0.10.0" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, + "peer": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -18563,25 +18747,25 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-lazy-load-image-component": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.2.tgz", - "integrity": "sha512-dAdH5PsRgvDMlHC7QpZRA9oRzEZl1kPFwowmR9Mt0IUUhxk2wwq43PB6Ffwv84HFYuPmsxDUCka0E9KVXi8roQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.3.tgz", + "integrity": "sha512-kdQYUDbuISF3T9El0sBLNoWrmPohqlytcG4ognLtHYjY8bZAsJ0/Ez+VaV+0QlVyUY3K6dDXkuQAz3GpvdjBkw==", "license": "MIT", "dependencies": { "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1" }, "peerDependencies": { - "react": "^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x" + "react": "^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x || ^19.x.x" } }, "node_modules/react-router": { - "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==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.20.0" + "@remix-run/router": "1.23.0" }, "engines": { "node": ">=14.0.0" @@ -18591,13 +18775,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", - "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.20.0", - "react-router": "6.27.0" + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" }, "engines": { "node": ">=14.0.0" @@ -19068,9 +19252,9 @@ } }, "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "dev": true, "license": "MIT" }, @@ -19204,9 +19388,9 @@ } }, "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "dev": true, "license": "MIT", "engines": { @@ -19220,9 +19404,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", "dev": true, "license": "MIT", "dependencies": { @@ -19241,9 +19425,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.85.0.tgz", - "integrity": "sha512-x3Vv54g0jv1aPSW8OTA/0GzQCs/HMQOjIkLtZJ3Xsn/I4vnyjKbVTQmFTax9bQjldqLEEkdbvy6ES/cOOnYNwA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.0.tgz", + "integrity": "sha512-Ibq5DzxjSf9f/IJmKeHVeXlVqiZWdRJF+RXy6v6UupvMYVMU5Ei+teSFBvvpPD5bB2QhhnU/OJlSM0EBCtfr9g==", "license": "MIT", "optional": true, "dependencies": { @@ -19263,32 +19447,32 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.85.0", - "sass-embedded-android-arm64": "1.85.0", - "sass-embedded-android-ia32": "1.85.0", - "sass-embedded-android-riscv64": "1.85.0", - "sass-embedded-android-x64": "1.85.0", - "sass-embedded-darwin-arm64": "1.85.0", - "sass-embedded-darwin-x64": "1.85.0", - "sass-embedded-linux-arm": "1.85.0", - "sass-embedded-linux-arm64": "1.85.0", - "sass-embedded-linux-ia32": "1.85.0", - "sass-embedded-linux-musl-arm": "1.85.0", - "sass-embedded-linux-musl-arm64": "1.85.0", - "sass-embedded-linux-musl-ia32": "1.85.0", - "sass-embedded-linux-musl-riscv64": "1.85.0", - "sass-embedded-linux-musl-x64": "1.85.0", - "sass-embedded-linux-riscv64": "1.85.0", - "sass-embedded-linux-x64": "1.85.0", - "sass-embedded-win32-arm64": "1.85.0", - "sass-embedded-win32-ia32": "1.85.0", - "sass-embedded-win32-x64": "1.85.0" + "sass-embedded-android-arm": "1.86.0", + "sass-embedded-android-arm64": "1.86.0", + "sass-embedded-android-ia32": "1.86.0", + "sass-embedded-android-riscv64": "1.86.0", + "sass-embedded-android-x64": "1.86.0", + "sass-embedded-darwin-arm64": "1.86.0", + "sass-embedded-darwin-x64": "1.86.0", + "sass-embedded-linux-arm": "1.86.0", + "sass-embedded-linux-arm64": "1.86.0", + "sass-embedded-linux-ia32": "1.86.0", + "sass-embedded-linux-musl-arm": "1.86.0", + "sass-embedded-linux-musl-arm64": "1.86.0", + "sass-embedded-linux-musl-ia32": "1.86.0", + "sass-embedded-linux-musl-riscv64": "1.86.0", + "sass-embedded-linux-musl-x64": "1.86.0", + "sass-embedded-linux-riscv64": "1.86.0", + "sass-embedded-linux-x64": "1.86.0", + "sass-embedded-win32-arm64": "1.86.0", + "sass-embedded-win32-ia32": "1.86.0", + "sass-embedded-win32-x64": "1.86.0" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.85.0.tgz", - "integrity": "sha512-pPBT7Ad6G8Mlao8ypVNXW2ya7I/Bhcny+RYZ/EmrunEXfhzCNp4PWV2VAweitPO9RnPIJwvUTkLc8Fu6K3nVmw==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.0.tgz", + "integrity": "sha512-NS8v6BCbzskXUMBtzfuB+j2yQMgiwg5edKHTYfQU7gAWai2hkRhS06YNEMff3aRxV0IFInxPRHOobd8xWPHqeA==", "cpu": [ "arm" ], @@ -19302,9 +19486,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.85.0.tgz", - "integrity": "sha512-4itDzRwezwrW8+YzMLIwHtMeH+qrBNdBsRn9lTVI15K+cNLC8z5JWJi6UCZ8TNNZr9LDBfsh5jUdjSub0yF7jg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.0.tgz", + "integrity": "sha512-r7MZtlAI2VFUnKE8B5UOrpoE6OGpdf1dIB6ndoxb3oiURgMyfTVU7yvJcL12GGvtVwQ2boCj6dq//Lqq9CXPlQ==", "cpu": [ "arm64" ], @@ -19318,9 +19502,9 @@ } }, "node_modules/sass-embedded-android-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.85.0.tgz", - "integrity": "sha512-bwqKq95hzbGbMTeXCMQhH7yEdc2xJVwIXj7rGdD3McvyFWbED6362XRFFPI5YyjfD2wRJd9yWLh/hn+6VyjcYA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.0.tgz", + "integrity": "sha512-UjfElrGaOTNOnxLZLxf6MFndFIe7zyK+81f83BioZ7/jcoAd6iCHZT8yQMvu8wINyVodPcaXZl8KxlKcl62VAA==", "cpu": [ "ia32" ], @@ -19334,9 +19518,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.85.0.tgz", - "integrity": "sha512-Fgkgay+5EePJXZFHR5Vlkutnsmox2V6nX4U3mfGbSN1xjLRm8F5ST72V2s5Z0mnIFpGvEu/v7hfptgViqMvaxg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.0.tgz", + "integrity": "sha512-TsqCLxHWLFS2mbpUkL/nge3jSkaPK2VmLkkoi5iO/EQT4SFvm1lNUgPwlLXu9DplZ+aqGVzRS9Y6Psjv+qW7kw==", "cpu": [ "riscv64" ], @@ -19350,9 +19534,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.85.0.tgz", - "integrity": "sha512-/bG3JgTn3eoIDHCiJNVkLeJgUesat4ghxqYmKMZUJx++4e6iKCDj8XwQTJAgm+QDrsPKXHBacHEANJ9LEAuTqg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.0.tgz", + "integrity": "sha512-8Q263GgwGjz7Jkf7Eghp7NrwqskDL95WO9sKrNm9iOd2re/M48W7RN/lpdcZwrUnEOhueks0RRyYyZYBNRz8Tg==", "cpu": [ "x64" ], @@ -19366,9 +19550,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.85.0.tgz", - "integrity": "sha512-plp8TyMz97YFBCB3ndftEvoW29vyfsSBJILM5U84cGzr06SvLh/Npjj8psfUeRw+upEk1zkFtw5u61sRCdgwIw==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.0.tgz", + "integrity": "sha512-d8oMEaIweq1tjrb/BT43igDviOMS1TeDpc51QF7vAHkt9drSjPmqEmbqStdFYPAGZj1j0RA4WCRoVl6jVixi/w==", "cpu": [ "arm64" ], @@ -19382,9 +19566,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.85.0.tgz", - "integrity": "sha512-LP8Zv8DG57Gn6PmSwWzC0gEZUsGdg36Ps3m0i1fVTOelql7N3HZIrlPYRjJvidL8ZlB3ISxNANebTREUHn/wkQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.0.tgz", + "integrity": "sha512-5NLRtn0ZUDBkfpKOsgLGl9B34po4Qui8Nff/lXTO+YkxBQFX4GoMkYNk9EJqHwoLLzICsxIhNDMMDiPGz7Fdrw==", "cpu": [ "x64" ], @@ -19398,9 +19582,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.85.0.tgz", - "integrity": "sha512-18xOAEfazJt1MMVS2TRHV94n81VyMnywOoJ7/S7I79qno/zx26OoqqP4XvH107xu8+mZ9Gg54LrUH6ZcgHk08g==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.0.tgz", + "integrity": "sha512-b6wm0+Il+blJDleRXAqA6JISGMjRb0/thTEg4NWgmiJwUoZjDycj5FTbfYPnLXjCEIMGaYmW3patrJ3JMJcT3Q==", "cpu": [ "arm" ], @@ -19414,9 +19598,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.85.0.tgz", - "integrity": "sha512-JRIRKVOY5Y8M1zlUOv9AQGju4P6lj8i5vLJZsVYVN/uY8Cd2dDJZPC8EOhjntp+IpF8AOGIHqCeCkHBceIyIjA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.0.tgz", + "integrity": "sha512-50A+0rhahRDRkKkv+qS7GDAAkW1VPm2RCX4zY4JWydhV4NwMXr6HbkLnsJ2MGixCyibPh59iflMpNBhe7SEMNg==", "cpu": [ "arm64" ], @@ -19430,9 +19614,9 @@ } }, "node_modules/sass-embedded-linux-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.85.0.tgz", - "integrity": "sha512-4JH+h+gLt9So22nNPQtsKojEsLzjld9ol3zWcOtMGclv+HojZGbCuhJUrLUcK72F8adXYsULmWhJPKROLIwYMA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.0.tgz", + "integrity": "sha512-h0mr9w71TV3BRPk9JHr0flnRCznhkraY14gaj5T+t78vUFByOUMxp4hTr+JpZAR5mv0mIeoMwrQYwWJoqKI0mw==", "cpu": [ "ia32" ], @@ -19446,9 +19630,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.85.0.tgz", - "integrity": "sha512-Z1j4ageDVFihqNUBnm89fxY46pY0zD/Clp1D3ZdI7S+D280+AEpbm5vMoH8LLhBQfQLf2w7H++SZGpQwrisudQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.0.tgz", + "integrity": "sha512-KZU70jBMVykC9HzS+o2FhrJaprFLDk3LWXVPtBFxgLlkcQ/apCkUCh2WVNViLhI2U4NrMSnTvd4kDnC/0m8qIw==", "cpu": [ "arm" ], @@ -19462,9 +19646,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.85.0.tgz", - "integrity": "sha512-aoQjUjK28bvdw9XKTjQeayn8oWQ2QqvoTD11myklGd3IHH7Jj0nwXUstI4NxDueCKt3wghuZoIQkjOheReQxlg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.0.tgz", + "integrity": "sha512-5OZjiJIUyhvKJIGNDEjyRUWDe+W91hq4Bji27sy8gdEuDzPWLx4NzwpKwsBUALUfyW/J5dxgi0ZAQnI3HieyQg==", "cpu": [ "arm64" ], @@ -19478,9 +19662,9 @@ } }, "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.85.0.tgz", - "integrity": "sha512-/cJCSXOfXmQFH8deE+3U9x+BSz8i0d1Tt9gKV/Gat1Xm43Oumw8pmZgno+cDuGjYQInr9ryW5121pTMlj/PBXQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.0.tgz", + "integrity": "sha512-vq9wJ7kaELrsNU6Ld6kvrIHxoIUWaD+5T6TQVj4SJP/iw1NjonyCDMQGGs6UgsIEzvaIwtlSlDbRewAq+4PchA==", "cpu": [ "ia32" ], @@ -19494,9 +19678,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.85.0.tgz", - "integrity": "sha512-l+FJxMXkmg42RZq5RFKXg4InX0IA7yEiPHe4kVSdrczP7z3NLxk+W9wVkPnoRKYIMe1qZPPQ25y0TgI4HNWouA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.0.tgz", + "integrity": "sha512-UZJPu4zKe3phEzoSVRh5jcSicBBPe+jEbVNALHSSz881iOAYnDQXHITGeQ4mM1/7e/LTyryHk6EPBoaLOv6JrA==", "cpu": [ "riscv64" ], @@ -19510,9 +19694,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.85.0.tgz", - "integrity": "sha512-M9ffjcYfFcRvkFA6V3DpOS955AyvmpvPAhL/xNK45d/ma1n1ehTWpd24tVeKiNK5CZkNjjMEfyw2fHa6MpqmEA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.0.tgz", + "integrity": "sha512-8taAgbWMk4QHneJcouWmWZJlmKa2O03g4I/CFo4bfMPL87bibY90pAsSDd+C+t81g0+2aK0/lY/BoB0r3qXLiA==", "cpu": [ "x64" ], @@ -19526,9 +19710,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.85.0.tgz", - "integrity": "sha512-yqPXQWfM+qiIPkfn++48GOlbmSvUZIyL9nwFstBk0k4x40UhbhilfknqeTUpxoHfQzylTGVhrm5JE7MjM+LNZA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.0.tgz", + "integrity": "sha512-yREY6o2sLwiiA03MWHVpnUliLscz0flEmFW/wzxYZJDqg9eZteB3hUWgZD63eLm2PTZsYxDQpjAHpa48nnIEmA==", "cpu": [ "riscv64" ], @@ -19542,9 +19726,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.85.0.tgz", - "integrity": "sha512-NTDeQFZcuVR7COoaRy8pZD6/+QznwBR8kVFsj7NpmvX9aJ7TX/q+OQZHX7Bfb3tsfKXhf1YZozegPuYxRnMKAQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.0.tgz", + "integrity": "sha512-sH0F8np9PTgTbFcJWxfr1NzPkL5ID2NcpMtZyKPTdnn9NkE/L2UwXSo6xOvY0Duc4Hg+58wSrDnj6KbvdeHCPg==", "cpu": [ "x64" ], @@ -19558,9 +19742,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.85.0.tgz", - "integrity": "sha512-gO0VAuxC4AdV+uZYJESRWVVHQWCGzNs0C3OKCAdH4r1vGRugooMi7J/5wbwUdXDA1MV9ICfhlKsph2n3GiPdqA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.0.tgz", + "integrity": "sha512-4O1XVUxLTIjMOvrziYwEZgvFqC5sF6t0hTAPJ+h2uiAUZg9Joo0PvuEedXurjISgDBsb5W5DTL9hH9q1BbP4cQ==", "cpu": [ "arm64" ], @@ -19574,9 +19758,9 @@ } }, "node_modules/sass-embedded-win32-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.85.0.tgz", - "integrity": "sha512-PCyn6xeFIBUgBceNypuf73/5DWF2VWPlPqPuBprPsTvpZOMUJeBtP+Lf4mnu3dNy1z76mYVnpaCnQmzZ0zHZaA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.0.tgz", + "integrity": "sha512-zuSP2axkGm4VaJWt38P464H+4424Swr9bzFNfbbznxe3Ue4RuqSBqwiLiYdg9Q1cecTQ2WGH7G7WO56KK7WLwg==", "cpu": [ "ia32" ], @@ -19590,9 +19774,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.85.0.tgz", - "integrity": "sha512-AknE2jLp6OBwrR5hQ8pDsG94KhJCeSheFJ2xgbnk8RUjZX909JiNbgh2sNt9LG+RXf4xZa55dDL537gZoCx/iw==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.0.tgz", + "integrity": "sha512-GVX0CHtukr3kjqfqretSlPiJzV7V4JxUjpRZV+yC9gUMTiDErilJh2Chw1r0+MYiYvumCDUSDlticmvJs7v0tA==", "cpu": [ "x64" ], @@ -19958,6 +20142,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC", "optional": true }, "node_modules/set-function-length": { @@ -20195,15 +20380,33 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "optional": true }, "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "decompress-response": "^4.2.0", + "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } @@ -21067,9 +21270,9 @@ } }, "node_modules/stylelint": { - "version": "16.14.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.14.1.tgz", - "integrity": "sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw==", + "version": "16.16.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.16.0.tgz", + "integrity": "sha512-40X5UOb/0CEFnZVEHyN260HlSSUxPES+arrUphOumGWgXERHfwCD0kNBVILgQSij8iliYVwlc0V7M5bcLP9vPg==", "dev": true, "funding": [ { @@ -21096,7 +21299,7 @@ "debug": "^4.3.7", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.0.5", + "file-entry-cache": "^10.0.7", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -21110,14 +21313,14 @@ "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.1", + "postcss": "^8.5.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "supports-hyperlinks": "^3.1.0", + "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^5.0.1" @@ -22970,9 +23173,9 @@ } }, "node_modules/stylelint-scss": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.0.tgz", - "integrity": "sha512-AvJ6LVzz2iXHxPlPTR9WVy73FC/vmohH54VySNlCKX1NIXNAeuzy/VbIkMJLMyw/xKYqkgY4kAgB+qy5BfCaCg==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.1.tgz", + "integrity": "sha512-e4rYo0UY+BIMtGeGanghrvHTjcryxgZbyFxUedp8dLFqC4P70aawNdYjRrQxbnKhu3BNr4+lt5e/53tcKXiwFA==", "dev": true, "license": "MIT", "dependencies": { @@ -22982,7 +23185,7 @@ "mdn-data": "^2.15.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -23024,9 +23227,9 @@ } }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.15.0.tgz", - "integrity": "sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.18.0.tgz", + "integrity": "sha512-gtCy1yim/vpHF/tq3B4Z43x3zKWpYeb4IM3d/Mf4oMYcNuoXOYEaqtoFlLHw9zd7+WNN3jNh6/WXyUrD3OIiwQ==", "dev": true, "license": "CC0-1.0" }, @@ -23157,25 +23360,25 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.6.tgz", - "integrity": "sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.7.tgz", + "integrity": "sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.6" + "flat-cache": "^6.1.7" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.6.tgz", - "integrity": "sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.7.tgz", + "integrity": "sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.8.8", - "flatted": "^3.3.2", - "hookified": "^1.7.0" + "cacheable": "^1.8.9", + "flatted": "^3.3.3", + "hookified": "^1.7.1" } }, "node_modules/stylelint/node_modules/globby": { @@ -23295,35 +23498,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/stylelint/node_modules/postcss-safe-parser": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", @@ -23441,9 +23615,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", - "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "license": "MIT", "dependencies": { @@ -23454,7 +23628,7 @@ "node": ">=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, "node_modules/supports-hyperlinks/node_modules/has-flag": { @@ -23704,6 +23878,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", "optional": true, "dependencies": { "chownr": "^2.0.0", @@ -23717,10 +23892,72 @@ "node": ">=10" } }, + "node_modules/tar-fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", "optional": true, "bin": { "mkdirp": "bin/cmd.js" @@ -23920,6 +24157,51 @@ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinypool": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", @@ -23943,6 +24225,7 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -24058,10 +24341,11 @@ } }, "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", + "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.3.1" }, @@ -24283,6 +24567,21 @@ "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "devOptional": true }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -24402,9 +24701,9 @@ } }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -24416,14 +24715,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", - "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.27.0.tgz", + "integrity": "sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", - "@typescript-eslint/utils": "8.24.1" + "@typescript-eslint/eslint-plugin": "8.27.0", + "@typescript-eslint/parser": "8.27.0", + "@typescript-eslint/utils": "8.27.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24434,203 +24734,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.24.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/typescript-eslint/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript-eslint/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/uc.micro": { @@ -24721,18 +24825,6 @@ "node": ">=4" } }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unified": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", @@ -25165,15 +25257,16 @@ } }, "node_modules/vite-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", - "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", + "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { @@ -25186,59 +25279,32 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/vitest": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", - "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", + "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.5", - "@vitest/mocker": "3.0.5", - "@vitest/pretty-format": "^3.0.5", - "@vitest/runner": "3.0.5", - "@vitest/snapshot": "3.0.5", - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/expect": "3.0.9", + "@vitest/mocker": "3.0.9", + "@vitest/pretty-format": "^3.0.9", + "@vitest/runner": "3.0.9", + "@vitest/snapshot": "3.0.9", + "@vitest/spy": "3.0.9", + "@vitest/utils": "3.0.9", + "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.5", + "vite-node": "3.0.9", "why-is-node-running": "^2.3.0" }, "bin": { @@ -25254,8 +25320,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.5", - "@vitest/ui": "3.0.5", + "@vitest/browser": "3.0.9", + "@vitest/ui": "3.0.9", "happy-dom": "*", "jsdom": "*" }, @@ -25446,42 +25512,40 @@ } }, "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", + "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, + "license": "MIT", "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", "colorette": "^2.0.14", - "commander": "^10.0.1", + "commander": "^12.1.0", "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", + "envinfo": "^7.14.0", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^3.1.1", "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" + "webpack-merge": "^6.0.1" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=14.15.0" + "node": ">=18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "5.x.x" + "webpack": "^5.82.0" }, "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -25490,34 +25554,31 @@ } } }, + "node_modules/webpack-cli/node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, "node_modules/webpack-cli/node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-cli/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, "node_modules/webpack-dev-middleware": { @@ -25664,19 +25725,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/webpack/node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -25739,12 +25787,13 @@ } }, "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, + "license": "MIT", "dependencies": { - "tr46": "^5.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" }, "engines": { @@ -25881,6 +25930,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" @@ -25894,9 +25944,9 @@ "license": "MIT" }, "node_modules/winston": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", - "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", "dev": true, "license": "MIT", "dependencies": { @@ -25904,27 +25954,27 @@ "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.4.0", + "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" + "winston-transport": "^4.9.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/winston-transport": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", - "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "dev": true, "license": "MIT", "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", + "logform": "^2.7.0", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, "engines": { @@ -26324,6 +26374,27 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "@asamuzakjp/css-color": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.1.tgz", + "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==", + "dev": true, + "requires": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } + } + }, "@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -26341,21 +26412,21 @@ "dev": true }, "@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", + "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -26372,12 +26443,12 @@ } }, "@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "requires": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -26566,21 +26637,21 @@ } }, "@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "requires": { "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" } }, "@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "requires": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { @@ -27315,9 +27386,9 @@ } }, "@babel/runtime": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", - "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -27333,15 +27404,15 @@ } }, "@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "requires": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -27354,9 +27425,9 @@ } }, "@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "requires": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -27388,26 +27459,26 @@ "requires": {} }, "@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "dev": true }, "@csstools/css-calc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", - "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", "dev": true, "requires": {} }, "@csstools/css-color-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", - "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", "dev": true, "requires": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.1" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" } }, "@csstools/css-parser-algorithms": { @@ -27460,12 +27531,12 @@ } }, "@csstools/postcss-color-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.7.tgz", - "integrity": "sha512-aDHYmhNIHR6iLw4ElWhf+tRqqaXwKnMl0YsQ/X105Zc4dQwe6yJpMrTN6BwOoESrkDjOYMOfORviSSLeDTJkdQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.8.tgz", + "integrity": "sha512-9dUvP2qpZI6PlGQ/sob+95B3u5u7nkYt9yhZFCC7G9HBRHBxj+QxS/wUlwaMGYW0waf+NIierI8aoDTssEdRYw==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -27473,12 +27544,12 @@ } }, "@csstools/postcss-color-mix-function": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.7.tgz", - "integrity": "sha512-e68Nev4CxZYCLcrfWhHH4u/N1YocOfTmw67/kVX5Rb7rnguqqLyxPjhHWjSBX8o4bmyuukmNf3wrUSU3//kT7g==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.8.tgz", + "integrity": "sha512-yuZpgWUzqZWQhEqfvtJufhl28DgO9sBwSbXbf/59gejNuvZcoUTRGQZhzhwF4ccqb53YAGB+u92z9+eSKoB4YA==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -27498,12 +27569,12 @@ } }, "@csstools/postcss-exponential-functions": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.6.tgz", - "integrity": "sha512-IgJA5DQsQLu/upA3HcdvC6xEMR051ufebBTIXZ5E9/9iiaA7juXWz1ceYj814lnDYP/7eWjZnw0grRJlX4eI6g==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.7.tgz", + "integrity": "sha512-XTb6Mw0v2qXtQYRW9d9duAjDnoTbBpsngD7sRNLmYDjvwU2ebpIHplyxgOeo6jp/Kr52gkLi5VaK5RDCqzMzZQ==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } @@ -27519,23 +27590,23 @@ } }, "@csstools/postcss-gamut-mapping": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.7.tgz", - "integrity": "sha512-gzFEZPoOkY0HqGdyeBXR3JP218Owr683u7KOZazTK7tQZBE8s2yhg06W1tshOqk7R7SWvw9gkw2TQogKpIW8Xw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.8.tgz", + "integrity": "sha512-/K8u9ZyGMGPjmwCSIjgaOLKfic2RIGdFHHes84XW5LnmrvdhOTVxo255NppHi3ROEvoHPW7MplMJgjZK5Q+TxA==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.7.tgz", - "integrity": "sha512-WgEyBeg6glUeTdS2XT7qeTFBthTJuXlS9GFro/DVomj7W7WMTamAwpoP4oQCq/0Ki2gvfRYFi/uZtmRE14/DFA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.8.tgz", + "integrity": "sha512-CoHQ/0UXrvxLovu0ZeW6c3/20hjJ/QRg6lyXm3dZLY/JgvRU6bdbQZF/Du30A4TvowfcgvIHQmP1bNXUxgDrAw==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -27543,12 +27614,12 @@ } }, "@csstools/postcss-hwb-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.7.tgz", - "integrity": "sha512-LKYqjO+wGwDCfNIEllessCBWfR4MS/sS1WXO+j00KKyOjm7jDW2L6jzUmqASEiv/kkJO39GcoIOvTTfB3yeBUA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.8.tgz", + "integrity": "sha512-LpFKjX6hblpeqyych1cKmk+3FJZ19QmaJtqincySoMkbkG/w2tfbnO5oE6mlnCTXcGUJ0rCEuRHvTqKK0nHYUQ==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -27655,12 +27726,12 @@ } }, "@csstools/postcss-media-minmax": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.6.tgz", - "integrity": "sha512-J1+4Fr2W3pLZsfxkFazK+9kr96LhEYqoeBszLmFjb6AjYs+g9oDAw3J5oQignLKk3rC9XHW+ebPTZ9FaW5u5pg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.7.tgz", + "integrity": "sha512-LB6tIP7iBZb5CYv8iRenfBZmbaG3DWNEziOnPjGoQX5P94FBPvvTBy68b/d9NnS5PELKwFmmOYsAEIgEhDPCHA==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/media-query-list-parser": "^4.0.2" @@ -27715,12 +27786,12 @@ } }, "@csstools/postcss-oklab-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.7.tgz", - "integrity": "sha512-I6WFQIbEKG2IO3vhaMGZDkucbCaUSXMxvHNzDdnfsTCF5tc0UlV3Oe2AhamatQoKFjBi75dSEMrgWq3+RegsOQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.8.tgz", + "integrity": "sha512-+5aPsNWgxohXoYNS1f+Ys0x3Qnfehgygv3qrPyv+Y25G0yX54/WlVB+IXprqBLOXHM1gsVF+QQSjlArhygna0Q==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -27737,23 +27808,23 @@ } }, "@csstools/postcss-random-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.2.tgz", - "integrity": "sha512-vBCT6JvgdEkvRc91NFoNrLjgGtkLWt47GKT6E2UDn3nd8ZkMBiziQ1Md1OiKoSsgzxsSnGKG3RVdhlbdZEkHjA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.3.tgz", + "integrity": "sha512-dbNeEEPHxAwfQJ3duRL5IPpuD77QAHtRl4bAHRs0vOVhVbHrsL7mHnwe0irYjbs9kYwhAHZBQTLBgmvufPuRkA==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-relative-color-syntax": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.7.tgz", - "integrity": "sha512-apbT31vsJVd18MabfPOnE977xgct5B1I+Jpf+Munw3n6kKb1MMuUmGGH+PT9Hm/fFs6fe61Q/EWnkrb4bNoNQw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.8.tgz", + "integrity": "sha512-eGE31oLnJDoUysDdjS9MLxNZdtqqSxjDXMdISpLh80QMaYrKs7VINpid34tWQ+iU23Wg5x76qAzf1Q/SLLbZVg==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -27782,44 +27853,44 @@ } }, "@csstools/postcss-sign-functions": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.1.tgz", - "integrity": "sha512-MslYkZCeMQDxetNkfmmQYgKCy4c+w9pPDfgOBCJOo/RI1RveEUdZQYtOfrC6cIZB7sD7/PHr2VGOcMXlZawrnA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.2.tgz", + "integrity": "sha512-4EcAvXTUPh7n6UoZZkCzgtCf/wPzMlTNuddcKg7HG8ozfQkUcHsJ2faQKeLmjyKdYPyOUn4YA7yDPf8K/jfIxw==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-stepped-value-functions": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.6.tgz", - "integrity": "sha512-/dwlO9w8vfKgiADxpxUbZOWlL5zKoRIsCymYoh1IPuBsXODKanKnfuZRr32DEqT0//3Av1VjfNZU9yhxtEfIeA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.7.tgz", + "integrity": "sha512-rdrRCKRnWtj5FyRin0u/gLla7CIvZRw/zMGI1fVJP0Sg/m1WGicjPVHRANL++3HQtsiXKAbPrcPr+VkyGck0IA==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", - "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", "dev": true, "requires": { - "@csstools/color-helpers": "^5.0.1", + "@csstools/color-helpers": "^5.0.2", "postcss-value-parser": "^4.2.0" } }, "@csstools/postcss-trigonometric-functions": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.6.tgz", - "integrity": "sha512-c4Y1D2Why/PeccaSouXnTt6WcNHJkoJRidV2VW9s5gJ97cNxnLgQ4Qj8qOqkIR9VmTQKJyNcbF4hy79ZQnWD7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.7.tgz", + "integrity": "sha512-qTrZgLju3AV7Djhzuh2Bq/wjFqbcypnk0FhHjxW8DWJQcZLS1HecIus4X2/RLch1ukX7b+YYCdqbEnpIQO5ccg==", "dev": true, "requires": { - "@csstools/css-calc": "^2.1.1", + "@csstools/css-calc": "^2.1.2", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } @@ -27862,15 +27933,15 @@ "dev": true }, "@emotion/babel-plugin": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", - "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", "requires": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -27917,29 +27988,29 @@ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "@emotion/react": { - "version": "11.13.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", - "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "requires": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" } }, "@emotion/serialize": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz", - "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", "requires": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, @@ -27949,16 +28020,16 @@ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" }, "@emotion/styled": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", - "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", "requires": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", + "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" } }, "@emotion/unitless": { @@ -27967,9 +28038,9 @@ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", "requires": {} }, "@emotion/utils": { @@ -28201,19 +28272,25 @@ "minimatch": "^3.1.2" } }, + "@eslint/config-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "dev": true + }, "@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, "requires": { "@types/json-schema": "^7.0.15" } }, "@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -28285,9 +28362,9 @@ } }, "@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", "dev": true }, "@eslint/object-schema": { @@ -28297,44 +28374,44 @@ "dev": true }, "@eslint/plugin-kit": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz", - "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", "dev": true, "requires": { - "@eslint/core": "^0.11.0", + "@eslint/core": "^0.12.0", "levn": "^0.4.1" } }, "@fontsource/noto-sans": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.1.1.tgz", - "integrity": "sha512-WesuII3BzvzVr0JqYIgnEeJPwXvpFAo9tNCMH1AqoLSCdStKJugMaIcVJ/sT+Pw9ytIlUO3ccbqbe+BhhsXm9g==" + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.2.6.tgz", + "integrity": "sha512-46D39T1/QJ16LSbCTaNjjrGS6Y69FMLS9FeHKsrXSQg15Z2MFqmlnNMpURx2l6Sr3x9t9EVdr3CAkHnZyvea+w==" }, "@fontsource/noto-sans-hk": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.1.1.tgz", - "integrity": "sha512-RZaCbu6U5PLl7umS0PQkH6draUPKPRfNJKuwu7LTrec7TRody+8FuaM4YnPn6C4u7qiVvVjSErRk2wToLWcu7A==" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.2.5.tgz", + "integrity": "sha512-dQK+2kLRChvlbvsXadnvfjBy1+hQojKu/zobeLiKXquFWJis9CdwNIaxTFa4Khwsq8HzR9JzxGb6L1tSK6JWYw==" }, "@fontsource/noto-sans-jp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.1.1.tgz", - "integrity": "sha512-PXk7mDjiaW99xU85IIxRGekzxLz91h2usk0rfDXSVwds9Nuo4sdlDUEE8PQ1P3VLnV00FsCHfSH54uR217VXpg==" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.5.tgz", + "integrity": "sha512-ISoJUQlsuSo4y56P+eJD+g022BRAF1BC2uCyEFGRsob0g8VvQAoWNMlWh+P0VQw68QzZHHj41zRzeRFpzAdA7w==" }, "@fontsource/noto-sans-kr": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.1.1.tgz", - "integrity": "sha512-YOa3i3+ze8wtlvsN9TMNQVD2NUOTQEShBz9HZQ6j9SqWuQeOREq2ux//32IzDfNnGNZC0ddeH7oNb1F9OsS3UA==" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.2.5.tgz", + "integrity": "sha512-9swPyua410J00z+GhemPKK/StWdiW07dchS9JcskesdQrhnPBLD6zVQtQsrj+ZPXTFBftbcrMlWFsWhmFn6S9w==" }, "@fontsource/noto-sans-sc": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.1.1.tgz", - "integrity": "sha512-v20RiW0Hp9qnHjLV5IAIwloL3IIKy2elMyMSeLuMzqyhYTCD2kHuRoe4w0aA+sd19IaWtdo2diHskIFL0Asfgw==" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.2.5.tgz", + "integrity": "sha512-rYAl3Alcjo2PnI0sqzRfnA022H8yWePNrjYalApQwYE+fFlaXmD6Mm3E9wmJCpmJM8clwhQWq/E8IlPl1bmZHQ==" }, "@fontsource/noto-sans-tc": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.1.1.tgz", - "integrity": "sha512-uJyenCRVZdiz+iRUyKwn99FDKQ0xMmLTOVHNzscqnp4ZwqYOl5S7fuL3IfH5FRRGYW+FTKtuY43D6gtVNtmrug==" + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.2.5.tgz", + "integrity": "sha512-+qQKW1slXsS5H5AvsiBfNo7krmuxyKkb6vV2l/nE7Uyd5TBpaomub+kuIO3iwgLBtVOesSkl6HwtR4SNxry+FA==" }, "@humanfs/core": { "version": "0.19.1", @@ -28432,9 +28509,9 @@ "integrity": "sha512-C0OlBxIr9NdeFESMTA/OVDqNSWtog6Mi7wwzwH12xbZpxsMD0RgCupUcIP7zZgcpTNecW3fZq5d6xVo7Q8HEJw==" }, "@jellyfin/sdk": { - "version": "0.0.0-unstable.202502210501", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202502210501.tgz", - "integrity": "sha512-IFfgfESaHoHsLZbo+eKd+cGtwjgW7bj1hmX8Igc1eV0UHJ1SlLTvjRecm4pp85vvE7u6elrwgVhIsFS0hYucqA==", + "version": "0.0.0-unstable.202503260501", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202503260501.tgz", + "integrity": "sha512-wsiDOwE+5eiy4FZ3UDfxgOL7PZMAh1W1VAScbb+OUeuJCfsSh8UKZM9B9mAvuotWxx8Orw9yLmvT57g/UthOqQ==", "requires": {} }, "@jridgewell/gen-mapping": { @@ -28508,9 +28585,9 @@ "requires": {} }, "@keyv/serialize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.2.tgz", - "integrity": "sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", "dev": true, "requires": { "buffer": "^6.0.3" @@ -28523,9 +28600,9 @@ "dev": true }, "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "optional": true, "requires": { "detect-libc": "^2.0.0", @@ -28539,6 +28616,25 @@ "tar": "^6.1.11" }, "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "requires": { + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -28549,13 +28645,10 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "optional": true } } }, @@ -28576,31 +28669,31 @@ } }, "@mui/core-downloads-tracker": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.14.tgz", - "integrity": "sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA==" + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.8.tgz", + "integrity": "sha512-vjP4+A1ybyCRhDZC7r5EPWu/gLseFZxaGyPdDl94vzVvk6Yj6gahdaqcjbhkaCrJjdZj90m3VioltWPAnWF/zw==" }, "@mui/icons-material": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.14.tgz", - "integrity": "sha512-heL4S+EawrP61xMXBm59QH6HODsu0gxtZi5JtnXF2r+rghzyU/3Uftlt1ij8rmJh+cFdKTQug1L9KkZB5JgpMQ==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.8.tgz", + "integrity": "sha512-LKGWiLWRyoOw3dWxZQ+lV//mK+4DVTTAiLd2ljmJdD6XV0rDB8JFKjRD9nyn9cJAU5XgWnii7ZR3c93ttUnMKg==", "requires": { - "@babel/runtime": "^7.23.9" + "@babel/runtime": "^7.26.0" } }, "@mui/material": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.14.tgz", - "integrity": "sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.8.tgz", + "integrity": "sha512-5S9UTjKZZBd9GfbcYh/nYfD9cv6OXmj5Y7NgKYfk7JcSoshp8/pW5zP4wecRiroBSZX8wcrywSgogpVNO+5W0Q==", "requires": { - "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.14", - "@mui/system": "^5.16.14", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.14", + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.4.8", + "@mui/system": "^6.4.8", + "@mui/types": "~7.2.24", + "@mui/utils": "^6.4.8", "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^19.0.0", @@ -28615,55 +28708,57 @@ } }, "@mui/private-theming": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.14.tgz", - "integrity": "sha512-12t7NKzvYi819IO5IapW2BcR33wP/KAVrU8d7gLhGHoAmhDxyXlRoKiRij3TOD8+uzk0B6R9wHUNKi4baJcRNg==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.8.tgz", + "integrity": "sha512-sWwQoNSn6elsPTAtSqCf+w5aaGoh7AASURNmpy+QTTD/zwJ0Jgwt0ZaaP6mXq2IcgHxYnYloM/+vJgHPMkRKTQ==", "requires": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.14", + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.4.8", "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", - "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.8.tgz", + "integrity": "sha512-oyjx1b1FvUCI85ZMO4trrjNxGm90eLN3Ohy0AP/SqK5gWvRQg1677UjNf7t6iETOKAleHctJjuq0B3aXO2gtmw==", "requires": { - "@babel/runtime": "^7.23.9", + "@babel/runtime": "^7.26.0", "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.14.tgz", - "integrity": "sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.8.tgz", + "integrity": "sha512-gV7iBHoqlsIenU2BP0wq14BefRoZcASZ/4LeyuQglayBl+DfLX5rEd3EYR3J409V2EZpR0NOM1LATAGlNk2cyA==", "requires": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.14", - "@mui/styled-engine": "^5.16.14", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.14", - "clsx": "^2.1.0", + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.4.8", + "@mui/styled-engine": "^6.4.8", + "@mui/types": "~7.2.24", + "@mui/utils": "^6.4.8", + "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" } }, "@mui/types": { - "version": "7.2.15", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.15.tgz", - "integrity": "sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==", + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", "requires": {} }, "@mui/utils": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz", - "integrity": "sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==", + "version": "6.4.8", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.8.tgz", + "integrity": "sha512-C86gfiZ5BfZ51KqzqoHi1WuuM2QdSKoFhbkZeAfQRB+jCc4YNhhj11UXFVMMsqBgZ+Zy8IHNJW3M9Wj/LOwRXQ==", "requires": { - "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", - "@types/prop-types": "^15.7.12", + "@babel/runtime": "^7.26.0", + "@mui/types": "~7.2.24", + "@types/prop-types": "^15.7.14", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^19.0.0" @@ -28677,13 +28772,13 @@ } }, "@mui/x-date-pickers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.26.0.tgz", - "integrity": "sha512-bhSDce1b5MBYYlCdHQJBThe10LGTE3D/u53TDQ41+IRj+iiNCun8jivw3DxKhmoBxlB+hVdkcltpTtIGlPjQZQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.28.0.tgz", + "integrity": "sha512-m1bfkZLOw3cMogeh6q92SjykVmLzfptnz3ZTgAlFKV7UBnVFuGUITvmwbgTZ1Mz3FmLVnGUQYUpZWw0ZnoghNA==", "requires": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-internals": "7.26.0", + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", + "@mui/x-internals": "7.28.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -28691,12 +28786,12 @@ } }, "@mui/x-internals": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.26.0.tgz", - "integrity": "sha512-VxTCYQcZ02d3190pdvys2TDg9pgbvewAVakEopiOgReKAUhLdRlgGJHcOA/eAuGLyK1YIo26A6Ow6ZKlSRLwMg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.28.0.tgz", + "integrity": "sha512-p4GEp/09bLDumktdIMiw+OF4p+pJOOjTG0VUvzNxjbHB9GxbBKoMcHrmyrURqoBnQpWIeFnN/QAoLMFSpfwQbw==", "requires": { "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0" + "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta" } }, "@nodelib/fs.scandir": { @@ -28883,9 +28978,9 @@ } }, "@remix-run/router": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", - "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==" }, "@rollup/rollup-android-arm-eabi": { "version": "4.34.8", @@ -29026,19 +29121,13 @@ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, - "@sindresorhus/merge-streams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", - "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", - "dev": true - }, "@stylistic/eslint-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.1.0.tgz", - "integrity": "sha512-pA6VOrOqk0+S8toJYhQGv2MWpQQR0QpeUo9AhNkC49Y26nxBQ/nH1rta9bUU1rPw2fJ1zZEMV5oCX5AazT7J2g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz", + "integrity": "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==", "dev": true, "requires": { - "@typescript-eslint/utils": "^8.13.0", + "@typescript-eslint/utils": "^8.23.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", @@ -29098,45 +29187,45 @@ } }, "@tanstack/query-core": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.16.tgz", - "integrity": "sha512-9Sgft7Qavcd+sN0V25xVyo0nfmcZXBuODy3FVG7BMWTg1HMLm8wwG5tNlLlmSic1u7l1v786oavn+STiFaPH2g==" + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.69.0.tgz", + "integrity": "sha512-Kn410jq6vs1P8Nm+ZsRj9H+U3C0kjuEkYLxbiCyn3MDEiYor1j2DGVULqAz62SLZtUZ/e9Xt6xMXiJ3NJ65WyQ==" }, "@tanstack/query-devtools": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.62.16.tgz", - "integrity": "sha512-3ff6UBJr0H3nIhfLSl9911rvKqXf0u4B58jl0uYdDWLqPk9pCvYIbxC35cGxK2+8INl4IaFVUHb/IdgWrNkg3Q==" + "version": "5.67.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.67.2.tgz", + "integrity": "sha512-O4QXFFd7xqp6EX7sdvc9tsVO8nm4lpWBqwpgjpVLW5g7IeOY6VnS/xvs/YzbRhBVkKTMaJMOUGU7NhSX+YGoNg==" }, "@tanstack/react-query": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.16.tgz", - "integrity": "sha512-XJIZNj65d2IdvU8VBESmrPakfIm6FSdHDzrS1dPrAwmq3ZX+9riMh/ZfbNQHAWnhrgmq7KoXpgZSRyXnqMYT9A==", + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.69.0.tgz", + "integrity": "sha512-Ift3IUNQqTcaFa1AiIQ7WCb/PPy8aexZdq9pZWLXhfLcLxH0+PZqJ2xFImxCpdDZrFRZhLJrh76geevS5xjRhA==", "requires": { - "@tanstack/query-core": "5.62.16" + "@tanstack/query-core": "5.69.0" } }, "@tanstack/react-query-devtools": { - "version": "5.62.16", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.62.16.tgz", - "integrity": "sha512-EjF0tgHnWYcqhk8KxGKnmGlYcnldhWjW3bbH2WZqxo7t41ytzkIQtZ/UyLph//YMmZZE/RVTmSo3rGq/EG9iCA==", + "version": "5.69.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.69.0.tgz", + "integrity": "sha512-sYklnou3IKAemqB5wJeBwjmG5bUGDKAL5/I4pVA+aqSnsNibVLt8/pAU976uuJ5K71w71bHtI/AMxiIs3gtkEA==", "requires": { - "@tanstack/query-devtools": "5.62.16" + "@tanstack/query-devtools": "5.67.2" } }, "@tanstack/react-table": { - "version": "8.20.5", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", - "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "version": "8.20.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.6.tgz", + "integrity": "sha512-w0jluT718MrOKthRcr2xsjqzx+oEM7B7s/XXyfs19ll++hlId3fjTm+B2zrR3ijpANpkzBAr15j1XGVOMxpggQ==", "requires": { "@tanstack/table-core": "8.20.5" } }, "@tanstack/react-virtual": { - "version": "3.10.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.6.tgz", - "integrity": "sha512-xaSy6uUxB92O8mngHZ6CvbhGuqxQ5lIZWCBy+FjhrbHmOwc6BnOnKkYm2FsB1/BpKw/+FVctlMbEtI+F6I1aJg==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.2.tgz", + "integrity": "sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==", "requires": { - "@tanstack/virtual-core": "3.10.6" + "@tanstack/virtual-core": "3.11.2" } }, "@tanstack/table-core": { @@ -29145,9 +29234,9 @@ "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==" }, "@tanstack/virtual-core": { - "version": "3.10.6", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.6.tgz", - "integrity": "sha512-1giLc4dzgEKLMx5pgKjL6HlG5fjZMgCjzlKAlpr7yoUtetVPELgER1NtephAI910nMwfPTHNyWKSFmJdHkz2Cw==" + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.11.2.tgz", + "integrity": "sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==" }, "@trysound/sax": { "version": "0.2.0", @@ -29412,9 +29501,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" }, "@types/qs": { "version": "6.9.7", @@ -29429,22 +29518,20 @@ "dev": true }, "@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "version": "18.3.19", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.19.tgz", + "integrity": "sha512-fcdJqaHOMDbiAwJnXv6XCzX0jDW77yI3tJqYh1Byn8EL5/S628WRx9b/y3DnNe55zTukUQKrfYxiZls2dHcUMw==", "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, - "requires": { - "@types/react": "*" - } + "requires": {} }, "@types/react-lazy-load-image-component": { "version": "1.6.4", @@ -29457,12 +29544,10 @@ } }, "@types/react-transition-group": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", - "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", - "requires": { - "@types/react": "*" - } + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "requires": {} }, "@types/retry": { "version": "0.12.2", @@ -29562,61 +29647,80 @@ "@types/node": "*" } }, - "@typescript-eslint/parser": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "@typescript-eslint/eslint-plugin": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.27.0.tgz", + "integrity": "sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.27.0", + "@typescript-eslint/type-utils": "8.27.0", + "@typescript-eslint/utils": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.27.0.tgz", + "integrity": "sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "8.27.0", + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/typescript-estree": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0", "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.27.0.tgz", + "integrity": "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.27.0.tgz", + "integrity": "sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "8.27.0", + "@typescript-eslint/utils": "8.27.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + } + }, + "@typescript-eslint/types": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.27.0.tgz", + "integrity": "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.27.0.tgz", + "integrity": "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/visitor-keys": "8.27.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" - } - }, - "@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.24.1", - "eslint-visitor-keys": "^4.2.0" - } - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -29626,12 +29730,6 @@ "balanced-match": "^1.0.0" } }, - "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true - }, "minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -29649,83 +29747,25 @@ } } }, - "@typescript-eslint/scope-manager": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", - "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0" - } - }, - "@typescript-eslint/types": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", - "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz", - "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", - "dev": true - } - } - }, "@typescript-eslint/utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz", - "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.27.0.tgz", + "integrity": "sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0" + "@typescript-eslint/scope-manager": "8.27.0", + "@typescript-eslint/types": "8.27.0", + "@typescript-eslint/typescript-estree": "8.27.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz", - "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.27.0.tgz", + "integrity": "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==", "dev": true, "requires": { - "@typescript-eslint/types": "8.21.0", + "@typescript-eslint/types": "8.27.0", "eslint-visitor-keys": "^4.2.0" }, "dependencies": { @@ -29744,9 +29784,9 @@ "dev": true }, "@vitest/coverage-v8": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.5.tgz", - "integrity": "sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.9.tgz", + "integrity": "sha512-15OACZcBtQ34keIEn19JYTVuMFTlFrClclwWjHo/IRPg/8ELpkgNTl0o7WLP9WO9XGH6+tip9CPYtEOrIDJvBA==", "dev": true, "requires": { "@ampproject/remapping": "^2.3.0", @@ -29764,98 +29804,76 @@ } }, "@vitest/expect": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", - "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", + "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", "dev": true, "requires": { - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/spy": "3.0.9", + "@vitest/utils": "3.0.9", + "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "@vitest/mocker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", - "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", + "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", "dev": true, "requires": { - "@vitest/spy": "3.0.5", + "@vitest/spy": "3.0.9", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" } }, "@vitest/pretty-format": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", - "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", + "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", "dev": true, "requires": { "tinyrainbow": "^2.0.0" } }, "@vitest/runner": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", - "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", + "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", "dev": true, "requires": { - "@vitest/utils": "3.0.5", - "pathe": "^2.0.2" + "@vitest/utils": "3.0.9", + "pathe": "^2.0.3" } }, "@vitest/snapshot": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", - "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", + "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", "dev": true, "requires": { - "@vitest/pretty-format": "3.0.5", + "@vitest/pretty-format": "3.0.9", "magic-string": "^0.30.17", - "pathe": "^2.0.2" - }, - "dependencies": { - "@vitest/pretty-format": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", - "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", - "dev": true, - "requires": { - "tinyrainbow": "^2.0.0" - } - } + "pathe": "^2.0.3" } }, "@vitest/spy": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", - "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", + "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", "dev": true, "requires": { "tinyspy": "^3.0.2" } }, "@vitest/utils": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", - "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", + "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", "dev": true, "requires": { - "@vitest/pretty-format": "3.0.5", - "loupe": "^3.1.2", + "@vitest/pretty-format": "3.0.9", + "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" - }, - "dependencies": { - "@vitest/pretty-format": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", - "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", - "dev": true, - "requires": { - "tinyrainbow": "^2.0.0" - } - } } }, "@webassemblyjs/ast": { @@ -30005,23 +30023,23 @@ } }, "@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", "dev": true, "requires": {} }, "@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", "dev": true, "requires": {} }, "@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", "dev": true, "requires": {} }, @@ -30064,9 +30082,9 @@ } }, "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true }, "acorn-jsx": { @@ -30077,19 +30095,19 @@ "requires": {} }, "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "requires": { - "debug": "4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true }, "ajv": { "version": "8.11.0", @@ -30402,16 +30420,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "requires": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" } }, @@ -30431,9 +30449,9 @@ "dev": true }, "axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", + "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", "peer": true, "requires": { "follow-redirects": "^1.15.6", @@ -30448,13 +30466,51 @@ "dev": true }, "babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", + "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", "dev": true, "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" + "find-up": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } } }, "babel-plugin-macros": { @@ -30632,6 +30688,46 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blurhash": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", @@ -30830,22 +30926,22 @@ } }, "cacheable": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.8.tgz", - "integrity": "sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.9.tgz", + "integrity": "sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==", "dev": true, "requires": { - "hookified": "^1.7.0", - "keyv": "^5.2.3" + "hookified": "^1.7.1", + "keyv": "^5.3.1" }, "dependencies": { "keyv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.3.tgz", - "integrity": "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.2.tgz", + "integrity": "sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ==", "dev": true, "requires": { - "@keyv/serialize": "^1.0.2" + "@keyv/serialize": "^1.0.3" } } } @@ -30866,7 +30962,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -30941,20 +31036,21 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", + "version": "1.0.30001706", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", + "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", "dev": true }, "canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.1.0.tgz", + "integrity": "sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==", + "dev": true, "optional": true, + "peer": true, "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1" } }, "ccount": { @@ -31034,10 +31130,12 @@ } }, "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true, + "peer": true }, "chrome-trace-event": { "version": "1.0.3", @@ -31232,12 +31330,6 @@ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -31359,17 +31451,16 @@ "dev": true }, "copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", + "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", "dev": true, "requires": { - "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^14.0.0", "normalize-path": "^3.0.0", "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" }, "dependencies": { "glob-parent": { @@ -31380,39 +31471,13 @@ "requires": { "is-glob": "^4.0.3" } - }, - "globby": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", - "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^1.0.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - } - }, - "path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true - }, - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true } } }, "core-js": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", - "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==" + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==" }, "core-js-compat": { "version": "3.40.0", @@ -31709,12 +31774,13 @@ } }, "cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", + "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", "dev": true, "requires": { - "rrweb-cssom": "^0.7.1" + "@asamuzakjp/css-color": "^3.1.1", + "rrweb-cssom": "^0.8.0" } }, "csstype": { @@ -31848,12 +31914,14 @@ "dev": true }, "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "optional": true, + "peer": true, "requires": { - "mimic-response": "^2.0.0" + "mimic-response": "^3.1.0" } }, "deep-eql": { @@ -31862,6 +31930,14 @@ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true, + "peer": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -31998,9 +32074,9 @@ "dev": true }, "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "optional": true }, "detect-node": { @@ -32115,7 +32191,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -32170,6 +32245,17 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", @@ -32193,9 +32279,9 @@ "dev": true }, "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true }, "epubjs": { @@ -32282,22 +32368,23 @@ } }, "es-check": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/es-check/-/es-check-7.2.1.tgz", - "integrity": "sha512-4sxU2OZ1aYYRRX2ajL3hDDBaY96Yr/OcH6MTRerIuOSyil6SQYQQ0b48uqVfYGRCiI0NgJbtY6Sbmf75oPaTeQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/es-check/-/es-check-8.0.2.tgz", + "integrity": "sha512-m/8jzwE6rasRx+Lhz7J5OIZzt2LmEC53kBPkUqQHk/6BMjo77HoHsdoQKeps8mgLASlb8nRuKZnuRai/iZHrHg==", "dev": true, "requires": { - "acorn": "8.11.3", - "commander": "12.0.0", - "fast-glob": "^3.3.2", - "supports-color": "^8.1.1", - "winston": "3.13.0" + "acorn": "8.14.0", + "acorn-walk": "^8.3.4", + "commander": "13.1.0", + "fast-glob": "^3.3.3", + "supports-color": "8.1.1", + "winston": "3.17.0" }, "dependencies": { "commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true }, "has-flag": { @@ -32320,14 +32407,12 @@ "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-iterator-helpers": { "version": "1.2.1", @@ -32363,7 +32448,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, "requires": { "es-errors": "^1.3.0" } @@ -32372,7 +32456,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "requires": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -32485,21 +32568,22 @@ "dev": true }, "eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -32507,7 +32591,7 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -32579,9 +32663,9 @@ "dev": true }, "eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -32767,6 +32851,12 @@ "path-exists": "^4.0.0" } }, + "globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -32935,9 +33025,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", - "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "requires": {} }, @@ -33017,12 +33107,6 @@ "eslint-visitor-keys": "^4.2.0" }, "dependencies": { - "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true - }, "eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", @@ -33178,6 +33262,14 @@ } } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "optional": true, + "peer": true + }, "expect-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", @@ -33500,76 +33592,6 @@ } } }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "dependencies": { - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "requires": { - "find-up": "^6.3.0" - } - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } - } - }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -33614,9 +33636,9 @@ } }, "flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, "flatten": { @@ -33850,12 +33872,13 @@ } }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, @@ -33886,6 +33909,14 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "optional": true, + "peer": true + }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -34000,7 +34031,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", @@ -34018,7 +34048,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "requires": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -34047,6 +34076,14 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "optional": true, + "peer": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -34108,9 +34145,9 @@ } }, "globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", "dev": true }, "globalthis": { @@ -34162,8 +34199,7 @@ "gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "graceful-fs": { "version": "4.2.11", @@ -34248,14 +34284,12 @@ "has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "requires": { "has-symbols": "^1.0.3" } @@ -34344,9 +34378,9 @@ "integrity": "sha512-iXnAafUm3FdzfJ91uixLws2hkKI1jC8bAKK/pt7XYr8Ie1jO7xbK48Ycpl9tUPyBgkzuj1p/PhJS0fy4E/5anA==" }, "highlight-words": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz", - "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-2.0.0.tgz", + "integrity": "sha512-If5n+IhSBRXTScE7wl16VPmd+44Vy7kof24EdqhjsZsDuHikpv1OCagVcJFpB4fS4UPUniedlWqrjIO8vWOsIQ==" }, "history": { "version": "5.3.0", @@ -34370,9 +34404,9 @@ } }, "hookified": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.7.0.tgz", - "integrity": "sha512-XQdMjqC1AyeOzfs+17cnIk7Wdfu1hh2JtcyNfBf5u9jHrT3iZUlGHxLTntFBuk5lwkqJ6l3+daeQdHK5yByHVA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.8.1.tgz", + "integrity": "sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==", "dev": true }, "hosted-git-info": { @@ -34589,17 +34623,6 @@ "requires": { "agent-base": "^7.1.0", "debug": "^4.3.4" - }, - "dependencies": { - "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - } } }, "http-proxy-middleware": { @@ -34624,12 +34647,12 @@ } }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" } }, @@ -35427,22 +35450,22 @@ } }, "jsdom": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", "dev": true, "requires": { - "cssstyle": "^4.1.0", + "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.4.3", - "form-data": "^4.0.0", + "form-data": "^4.0.1", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", + "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.0.0", @@ -35450,30 +35473,9 @@ "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", + "whatwg-url": "^14.1.0", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" - }, - "dependencies": { - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - } } }, "jsesc": { @@ -35805,9 +35807,9 @@ } }, "logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "dev": true, "requires": { "@colors/colors": "1.6.0", @@ -35861,7 +35863,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -35964,21 +35966,20 @@ "integrity": "sha512-lSj71DgVv20kO0kGbs42icDzbRot61gEDBLQACzkUuznRQBUYmbxzEkGU6dNBb5fRWHMaScYlAXX96HQ4/cJWA==" }, "material-react-table": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-2.13.3.tgz", - "integrity": "sha512-xeyAEG6UYG3qgBIo17epAP5zsWT1pH0uCEkaUxvhki9sGcP35OqfOMSZJNhISvmqEqXKYHdqKbZI6iOwsg1sYA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-3.2.1.tgz", + "integrity": "sha512-sQtTf7bETpkPN2Hm5BVtz89wrfXCVQguz6XlwMChSnfKFO5QCKAJJC5aSIKnUc3S0AvTz/k/ILi00FnnY1Gixw==", "requires": { "@tanstack/match-sorter-utils": "8.19.4", - "@tanstack/react-table": "8.20.5", - "@tanstack/react-virtual": "3.10.6", - "highlight-words": "1.2.2" + "@tanstack/react-table": "8.20.6", + "@tanstack/react-virtual": "3.11.2", + "highlight-words": "2.0.0" } }, "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, "mathml-tag-names": { "version": "2.1.3", @@ -36124,10 +36125,12 @@ } }, "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "optional": true, + "peer": true }, "min-indent": { "version": "1.0.1", @@ -36234,6 +36237,14 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "optional": true, + "peer": true + }, "mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -36246,9 +36257,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", "optional": true }, "nanoid": { @@ -36276,6 +36287,14 @@ "to-regex": "^3.0.1" } }, + "napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, + "optional": true, + "peer": true + }, "native-promise-only": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", @@ -36314,6 +36333,27 @@ "tslib": "^2.0.3" } }, + "node-abi": { + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -36328,9 +36368,9 @@ "optional": true }, "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "optional": true, "requires": { "whatwg-url": "^5.0.0" @@ -36447,9 +36487,9 @@ "dev": true }, "nwsapi": { - "version": "2.2.12", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", - "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.19.tgz", + "integrity": "sha512-94bcyI3RsqiZufXjkr3ltkI86iEl+I7uiHVDtcq9wJUTwYQJ5odHDeSzkkrRzi80jJ8MaeZgqKjH1bAWAFw9bA==", "dev": true }, "object-assign": { @@ -36768,18 +36808,18 @@ } }, "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, "requires": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "dependencies": { "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true } } @@ -36906,6 +36946,45 @@ "requires": { "canvas": "^2.11.2", "path2d-polyfill": "^2.0.1" + }, + "dependencies": { + "canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "optional": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + } + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true + }, + "simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + } } }, "picocolors": { @@ -36971,9 +37050,9 @@ "dev": true }, "postcss": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", - "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "requires": { "nanoid": "^3.3.8", @@ -37022,12 +37101,12 @@ } }, "postcss-color-functional-notation": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.7.tgz", - "integrity": "sha512-EZvAHsvyASX63vXnyXOIynkxhaHRSsdb7z6yiXKIovGXAolW4cMZ3qoh7k3VdTsLBS6VGdksGfIo3r6+waLoOw==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.8.tgz", + "integrity": "sha512-S/TpMKVKofNvsxfau/+bw+IA6cSfB6/kmzFj5szUofHOVnFFMB2WwK+Zu07BeMD8T0n+ZnTO5uXiMvAKe2dPkA==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -37323,12 +37402,12 @@ } }, "postcss-lab-function": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.7.tgz", - "integrity": "sha512-+ONj2bpOQfsCKZE2T9VGMyVVdGcGUpr7u3SVfvkJlvhTRmDCfY25k4Jc8fubB9DclAPR4+w8uVtDZmdRgdAHig==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.8.tgz", + "integrity": "sha512-plV21I86Hg9q8omNz13G9fhPtLopIWH06bt/Cb5cs1XnaGU2kUtEitvVd4vtQb/VqCdNUHK5swKn3QFmMRbpDg==", "dev": true, "requires": { - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/postcss-progressive-custom-properties": "^4.0.0", @@ -37447,9 +37526,9 @@ } }, "postcss-logical": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", - "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -37860,20 +37939,20 @@ } }, "postcss-preset-env": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.4.tgz", - "integrity": "sha512-awWKS3CwyY7I4Eb3YSWOZisbj3qXyuQCrylYiu2vSHxnSZAj3LHStN6jOcpCrc6EjYunLwbeNto3M5/JBtXpzg==", + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.5.tgz", + "integrity": "sha512-LQybafF/K7H+6fAs4SIkgzkSCixJy0/h0gubDIAP3Ihz+IQBRwsjyvBnAZ3JUHD+A/ITaxVRPDxn//a3Qy4pDw==", "dev": true, "requires": { "@csstools/postcss-cascade-layers": "^5.0.1", - "@csstools/postcss-color-function": "^4.0.7", - "@csstools/postcss-color-mix-function": "^3.0.7", + "@csstools/postcss-color-function": "^4.0.8", + "@csstools/postcss-color-mix-function": "^3.0.8", "@csstools/postcss-content-alt-text": "^2.0.4", - "@csstools/postcss-exponential-functions": "^2.0.6", + "@csstools/postcss-exponential-functions": "^2.0.7", "@csstools/postcss-font-format-keywords": "^4.0.0", - "@csstools/postcss-gamut-mapping": "^2.0.7", - "@csstools/postcss-gradients-interpolation-method": "^5.0.7", - "@csstools/postcss-hwb-function": "^4.0.7", + "@csstools/postcss-gamut-mapping": "^2.0.8", + "@csstools/postcss-gradients-interpolation-method": "^5.0.8", + "@csstools/postcss-hwb-function": "^4.0.8", "@csstools/postcss-ic-unit": "^4.0.0", "@csstools/postcss-initial": "^2.0.1", "@csstools/postcss-is-pseudo-class": "^5.0.1", @@ -37883,19 +37962,19 @@ "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", "@csstools/postcss-logical-resize": "^3.0.0", "@csstools/postcss-logical-viewport-units": "^3.0.3", - "@csstools/postcss-media-minmax": "^2.0.6", + "@csstools/postcss-media-minmax": "^2.0.7", "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", "@csstools/postcss-nested-calc": "^4.0.0", "@csstools/postcss-normalize-display-values": "^4.0.0", - "@csstools/postcss-oklab-function": "^4.0.7", + "@csstools/postcss-oklab-function": "^4.0.8", "@csstools/postcss-progressive-custom-properties": "^4.0.0", - "@csstools/postcss-random-function": "^1.0.2", - "@csstools/postcss-relative-color-syntax": "^3.0.7", + "@csstools/postcss-random-function": "^1.0.3", + "@csstools/postcss-relative-color-syntax": "^3.0.8", "@csstools/postcss-scope-pseudo-class": "^4.0.1", - "@csstools/postcss-sign-functions": "^1.1.1", - "@csstools/postcss-stepped-value-functions": "^4.0.6", - "@csstools/postcss-text-decoration-shorthand": "^4.0.1", - "@csstools/postcss-trigonometric-functions": "^4.0.6", + "@csstools/postcss-sign-functions": "^1.1.2", + "@csstools/postcss-stepped-value-functions": "^4.0.7", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.7", "@csstools/postcss-unset-value": "^4.0.0", "autoprefixer": "^10.4.19", "browserslist": "^4.24.4", @@ -37905,7 +37984,7 @@ "cssdb": "^8.2.3", "postcss-attribute-case-insensitive": "^7.0.1", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^7.0.7", + "postcss-color-functional-notation": "^7.0.8", "postcss-color-hex-alpha": "^10.0.0", "postcss-color-rebeccapurple": "^10.0.0", "postcss-custom-media": "^11.0.5", @@ -37918,8 +37997,8 @@ "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^6.0.0", "postcss-image-set-function": "^7.0.0", - "postcss-lab-function": "^7.0.7", - "postcss-logical": "^8.0.0", + "postcss-lab-function": "^7.0.8", + "postcss-logical": "^8.1.0", "postcss-nesting": "^13.0.1", "postcss-opacity-percentage": "^3.0.0", "postcss-overflow-shorthand": "^6.0.0", @@ -38211,6 +38290,28 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -38266,6 +38367,18 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "peer": true }, + "pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -38336,6 +38449,30 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -38365,29 +38502,29 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "react-lazy-load-image-component": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.2.tgz", - "integrity": "sha512-dAdH5PsRgvDMlHC7QpZRA9oRzEZl1kPFwowmR9Mt0IUUhxk2wwq43PB6Ffwv84HFYuPmsxDUCka0E9KVXi8roQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/react-lazy-load-image-component/-/react-lazy-load-image-component-1.6.3.tgz", + "integrity": "sha512-kdQYUDbuISF3T9El0sBLNoWrmPohqlytcG4ognLtHYjY8bZAsJ0/Ez+VaV+0QlVyUY3K6dDXkuQAz3GpvdjBkw==", "requires": { "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1" } }, "react-router": { - "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==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", "requires": { - "@remix-run/router": "1.20.0" + "@remix-run/router": "1.23.0" } }, "react-router-dom": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", - "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", "requires": { - "@remix-run/router": "1.20.0", - "react-router": "6.27.0" + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" } }, "react-transition-group": { @@ -38742,9 +38879,9 @@ } }, "rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "dev": true }, "run-applescript": { @@ -38836,9 +38973,9 @@ } }, "safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "dev": true }, "safer-buffer": { @@ -38848,9 +38985,9 @@ "dev": true }, "sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", "dev": true, "requires": { "@parcel/watcher": "^2.4.1", @@ -38877,9 +39014,9 @@ } }, "sass-embedded": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.85.0.tgz", - "integrity": "sha512-x3Vv54g0jv1aPSW8OTA/0GzQCs/HMQOjIkLtZJ3Xsn/I4vnyjKbVTQmFTax9bQjldqLEEkdbvy6ES/cOOnYNwA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.0.tgz", + "integrity": "sha512-Ibq5DzxjSf9f/IJmKeHVeXlVqiZWdRJF+RXy6v6UupvMYVMU5Ei+teSFBvvpPD5bB2QhhnU/OJlSM0EBCtfr9g==", "optional": true, "requires": { "@bufbuild/protobuf": "^2.0.0", @@ -38887,26 +39024,26 @@ "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", - "sass-embedded-android-arm": "1.85.0", - "sass-embedded-android-arm64": "1.85.0", - "sass-embedded-android-ia32": "1.85.0", - "sass-embedded-android-riscv64": "1.85.0", - "sass-embedded-android-x64": "1.85.0", - "sass-embedded-darwin-arm64": "1.85.0", - "sass-embedded-darwin-x64": "1.85.0", - "sass-embedded-linux-arm": "1.85.0", - "sass-embedded-linux-arm64": "1.85.0", - "sass-embedded-linux-ia32": "1.85.0", - "sass-embedded-linux-musl-arm": "1.85.0", - "sass-embedded-linux-musl-arm64": "1.85.0", - "sass-embedded-linux-musl-ia32": "1.85.0", - "sass-embedded-linux-musl-riscv64": "1.85.0", - "sass-embedded-linux-musl-x64": "1.85.0", - "sass-embedded-linux-riscv64": "1.85.0", - "sass-embedded-linux-x64": "1.85.0", - "sass-embedded-win32-arm64": "1.85.0", - "sass-embedded-win32-ia32": "1.85.0", - "sass-embedded-win32-x64": "1.85.0", + "sass-embedded-android-arm": "1.86.0", + "sass-embedded-android-arm64": "1.86.0", + "sass-embedded-android-ia32": "1.86.0", + "sass-embedded-android-riscv64": "1.86.0", + "sass-embedded-android-x64": "1.86.0", + "sass-embedded-darwin-arm64": "1.86.0", + "sass-embedded-darwin-x64": "1.86.0", + "sass-embedded-linux-arm": "1.86.0", + "sass-embedded-linux-arm64": "1.86.0", + "sass-embedded-linux-ia32": "1.86.0", + "sass-embedded-linux-musl-arm": "1.86.0", + "sass-embedded-linux-musl-arm64": "1.86.0", + "sass-embedded-linux-musl-ia32": "1.86.0", + "sass-embedded-linux-musl-riscv64": "1.86.0", + "sass-embedded-linux-musl-x64": "1.86.0", + "sass-embedded-linux-riscv64": "1.86.0", + "sass-embedded-linux-x64": "1.86.0", + "sass-embedded-win32-arm64": "1.86.0", + "sass-embedded-win32-ia32": "1.86.0", + "sass-embedded-win32-x64": "1.86.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" @@ -38930,123 +39067,123 @@ } }, "sass-embedded-android-arm": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.85.0.tgz", - "integrity": "sha512-pPBT7Ad6G8Mlao8ypVNXW2ya7I/Bhcny+RYZ/EmrunEXfhzCNp4PWV2VAweitPO9RnPIJwvUTkLc8Fu6K3nVmw==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.0.tgz", + "integrity": "sha512-NS8v6BCbzskXUMBtzfuB+j2yQMgiwg5edKHTYfQU7gAWai2hkRhS06YNEMff3aRxV0IFInxPRHOobd8xWPHqeA==", "optional": true }, "sass-embedded-android-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.85.0.tgz", - "integrity": "sha512-4itDzRwezwrW8+YzMLIwHtMeH+qrBNdBsRn9lTVI15K+cNLC8z5JWJi6UCZ8TNNZr9LDBfsh5jUdjSub0yF7jg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.0.tgz", + "integrity": "sha512-r7MZtlAI2VFUnKE8B5UOrpoE6OGpdf1dIB6ndoxb3oiURgMyfTVU7yvJcL12GGvtVwQ2boCj6dq//Lqq9CXPlQ==", "optional": true }, "sass-embedded-android-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.85.0.tgz", - "integrity": "sha512-bwqKq95hzbGbMTeXCMQhH7yEdc2xJVwIXj7rGdD3McvyFWbED6362XRFFPI5YyjfD2wRJd9yWLh/hn+6VyjcYA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.0.tgz", + "integrity": "sha512-UjfElrGaOTNOnxLZLxf6MFndFIe7zyK+81f83BioZ7/jcoAd6iCHZT8yQMvu8wINyVodPcaXZl8KxlKcl62VAA==", "optional": true }, "sass-embedded-android-riscv64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.85.0.tgz", - "integrity": "sha512-Fgkgay+5EePJXZFHR5Vlkutnsmox2V6nX4U3mfGbSN1xjLRm8F5ST72V2s5Z0mnIFpGvEu/v7hfptgViqMvaxg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.0.tgz", + "integrity": "sha512-TsqCLxHWLFS2mbpUkL/nge3jSkaPK2VmLkkoi5iO/EQT4SFvm1lNUgPwlLXu9DplZ+aqGVzRS9Y6Psjv+qW7kw==", "optional": true }, "sass-embedded-android-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.85.0.tgz", - "integrity": "sha512-/bG3JgTn3eoIDHCiJNVkLeJgUesat4ghxqYmKMZUJx++4e6iKCDj8XwQTJAgm+QDrsPKXHBacHEANJ9LEAuTqg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.0.tgz", + "integrity": "sha512-8Q263GgwGjz7Jkf7Eghp7NrwqskDL95WO9sKrNm9iOd2re/M48W7RN/lpdcZwrUnEOhueks0RRyYyZYBNRz8Tg==", "optional": true }, "sass-embedded-darwin-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.85.0.tgz", - "integrity": "sha512-plp8TyMz97YFBCB3ndftEvoW29vyfsSBJILM5U84cGzr06SvLh/Npjj8psfUeRw+upEk1zkFtw5u61sRCdgwIw==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.0.tgz", + "integrity": "sha512-d8oMEaIweq1tjrb/BT43igDviOMS1TeDpc51QF7vAHkt9drSjPmqEmbqStdFYPAGZj1j0RA4WCRoVl6jVixi/w==", "optional": true }, "sass-embedded-darwin-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.85.0.tgz", - "integrity": "sha512-LP8Zv8DG57Gn6PmSwWzC0gEZUsGdg36Ps3m0i1fVTOelql7N3HZIrlPYRjJvidL8ZlB3ISxNANebTREUHn/wkQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.0.tgz", + "integrity": "sha512-5NLRtn0ZUDBkfpKOsgLGl9B34po4Qui8Nff/lXTO+YkxBQFX4GoMkYNk9EJqHwoLLzICsxIhNDMMDiPGz7Fdrw==", "optional": true }, "sass-embedded-linux-arm": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.85.0.tgz", - "integrity": "sha512-18xOAEfazJt1MMVS2TRHV94n81VyMnywOoJ7/S7I79qno/zx26OoqqP4XvH107xu8+mZ9Gg54LrUH6ZcgHk08g==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.0.tgz", + "integrity": "sha512-b6wm0+Il+blJDleRXAqA6JISGMjRb0/thTEg4NWgmiJwUoZjDycj5FTbfYPnLXjCEIMGaYmW3patrJ3JMJcT3Q==", "optional": true }, "sass-embedded-linux-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.85.0.tgz", - "integrity": "sha512-JRIRKVOY5Y8M1zlUOv9AQGju4P6lj8i5vLJZsVYVN/uY8Cd2dDJZPC8EOhjntp+IpF8AOGIHqCeCkHBceIyIjA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.0.tgz", + "integrity": "sha512-50A+0rhahRDRkKkv+qS7GDAAkW1VPm2RCX4zY4JWydhV4NwMXr6HbkLnsJ2MGixCyibPh59iflMpNBhe7SEMNg==", "optional": true }, "sass-embedded-linux-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.85.0.tgz", - "integrity": "sha512-4JH+h+gLt9So22nNPQtsKojEsLzjld9ol3zWcOtMGclv+HojZGbCuhJUrLUcK72F8adXYsULmWhJPKROLIwYMA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.0.tgz", + "integrity": "sha512-h0mr9w71TV3BRPk9JHr0flnRCznhkraY14gaj5T+t78vUFByOUMxp4hTr+JpZAR5mv0mIeoMwrQYwWJoqKI0mw==", "optional": true }, "sass-embedded-linux-musl-arm": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.85.0.tgz", - "integrity": "sha512-Z1j4ageDVFihqNUBnm89fxY46pY0zD/Clp1D3ZdI7S+D280+AEpbm5vMoH8LLhBQfQLf2w7H++SZGpQwrisudQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.0.tgz", + "integrity": "sha512-KZU70jBMVykC9HzS+o2FhrJaprFLDk3LWXVPtBFxgLlkcQ/apCkUCh2WVNViLhI2U4NrMSnTvd4kDnC/0m8qIw==", "optional": true }, "sass-embedded-linux-musl-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.85.0.tgz", - "integrity": "sha512-aoQjUjK28bvdw9XKTjQeayn8oWQ2QqvoTD11myklGd3IHH7Jj0nwXUstI4NxDueCKt3wghuZoIQkjOheReQxlg==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.0.tgz", + "integrity": "sha512-5OZjiJIUyhvKJIGNDEjyRUWDe+W91hq4Bji27sy8gdEuDzPWLx4NzwpKwsBUALUfyW/J5dxgi0ZAQnI3HieyQg==", "optional": true }, "sass-embedded-linux-musl-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.85.0.tgz", - "integrity": "sha512-/cJCSXOfXmQFH8deE+3U9x+BSz8i0d1Tt9gKV/Gat1Xm43Oumw8pmZgno+cDuGjYQInr9ryW5121pTMlj/PBXQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.0.tgz", + "integrity": "sha512-vq9wJ7kaELrsNU6Ld6kvrIHxoIUWaD+5T6TQVj4SJP/iw1NjonyCDMQGGs6UgsIEzvaIwtlSlDbRewAq+4PchA==", "optional": true }, "sass-embedded-linux-musl-riscv64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.85.0.tgz", - "integrity": "sha512-l+FJxMXkmg42RZq5RFKXg4InX0IA7yEiPHe4kVSdrczP7z3NLxk+W9wVkPnoRKYIMe1qZPPQ25y0TgI4HNWouA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.0.tgz", + "integrity": "sha512-UZJPu4zKe3phEzoSVRh5jcSicBBPe+jEbVNALHSSz881iOAYnDQXHITGeQ4mM1/7e/LTyryHk6EPBoaLOv6JrA==", "optional": true }, "sass-embedded-linux-musl-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.85.0.tgz", - "integrity": "sha512-M9ffjcYfFcRvkFA6V3DpOS955AyvmpvPAhL/xNK45d/ma1n1ehTWpd24tVeKiNK5CZkNjjMEfyw2fHa6MpqmEA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.0.tgz", + "integrity": "sha512-8taAgbWMk4QHneJcouWmWZJlmKa2O03g4I/CFo4bfMPL87bibY90pAsSDd+C+t81g0+2aK0/lY/BoB0r3qXLiA==", "optional": true }, "sass-embedded-linux-riscv64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.85.0.tgz", - "integrity": "sha512-yqPXQWfM+qiIPkfn++48GOlbmSvUZIyL9nwFstBk0k4x40UhbhilfknqeTUpxoHfQzylTGVhrm5JE7MjM+LNZA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.0.tgz", + "integrity": "sha512-yREY6o2sLwiiA03MWHVpnUliLscz0flEmFW/wzxYZJDqg9eZteB3hUWgZD63eLm2PTZsYxDQpjAHpa48nnIEmA==", "optional": true }, "sass-embedded-linux-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.85.0.tgz", - "integrity": "sha512-NTDeQFZcuVR7COoaRy8pZD6/+QznwBR8kVFsj7NpmvX9aJ7TX/q+OQZHX7Bfb3tsfKXhf1YZozegPuYxRnMKAQ==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.0.tgz", + "integrity": "sha512-sH0F8np9PTgTbFcJWxfr1NzPkL5ID2NcpMtZyKPTdnn9NkE/L2UwXSo6xOvY0Duc4Hg+58wSrDnj6KbvdeHCPg==", "optional": true }, "sass-embedded-win32-arm64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.85.0.tgz", - "integrity": "sha512-gO0VAuxC4AdV+uZYJESRWVVHQWCGzNs0C3OKCAdH4r1vGRugooMi7J/5wbwUdXDA1MV9ICfhlKsph2n3GiPdqA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.0.tgz", + "integrity": "sha512-4O1XVUxLTIjMOvrziYwEZgvFqC5sF6t0hTAPJ+h2uiAUZg9Joo0PvuEedXurjISgDBsb5W5DTL9hH9q1BbP4cQ==", "optional": true }, "sass-embedded-win32-ia32": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.85.0.tgz", - "integrity": "sha512-PCyn6xeFIBUgBceNypuf73/5DWF2VWPlPqPuBprPsTvpZOMUJeBtP+Lf4mnu3dNy1z76mYVnpaCnQmzZ0zHZaA==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.0.tgz", + "integrity": "sha512-zuSP2axkGm4VaJWt38P464H+4424Swr9bzFNfbbznxe3Ue4RuqSBqwiLiYdg9Q1cecTQ2WGH7G7WO56KK7WLwg==", "optional": true }, "sass-embedded-win32-x64": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.85.0.tgz", - "integrity": "sha512-AknE2jLp6OBwrR5hQ8pDsG94KhJCeSheFJ2xgbnk8RUjZX909JiNbgh2sNt9LG+RXf4xZa55dDL537gZoCx/iw==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.0.tgz", + "integrity": "sha512-GVX0CHtukr3kjqfqretSlPiJzV7V4JxUjpRZV+yC9gUMTiDErilJh2Chw1r0+MYiYvumCDUSDlticmvJs7v0tA==", "optional": true }, "sass-loader": { @@ -39434,12 +39571,14 @@ "optional": true }, "simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, "optional": true, + "peer": true, "requires": { - "decompress-response": "^4.2.0", + "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } @@ -40106,9 +40245,9 @@ } }, "stylelint": { - "version": "16.14.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.14.1.tgz", - "integrity": "sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw==", + "version": "16.16.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.16.0.tgz", + "integrity": "sha512-40X5UOb/0CEFnZVEHyN260HlSSUxPES+arrUphOumGWgXERHfwCD0kNBVILgQSij8iliYVwlc0V7M5bcLP9vPg==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^3.0.4", @@ -40124,7 +40263,7 @@ "debug": "^4.3.7", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.0.5", + "file-entry-cache": "^10.0.7", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", @@ -40138,14 +40277,14 @@ "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.1", + "postcss": "^8.5.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "supports-hyperlinks": "^3.1.0", + "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^5.0.1" @@ -40206,23 +40345,23 @@ } }, "file-entry-cache": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.6.tgz", - "integrity": "sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.7.tgz", + "integrity": "sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==", "dev": true, "requires": { - "flat-cache": "^6.1.6" + "flat-cache": "^6.1.7" } }, "flat-cache": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.6.tgz", - "integrity": "sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.7.tgz", + "integrity": "sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==", "dev": true, "requires": { - "cacheable": "^1.8.8", - "flatted": "^3.3.2", - "hookified": "^1.7.0" + "cacheable": "^1.8.9", + "flatted": "^3.3.3", + "hookified": "^1.7.1" } }, "globby": { @@ -40304,17 +40443,6 @@ "lines-and-columns": "^1.1.6" } }, - "postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "requires": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - }, "postcss-safe-parser": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", @@ -41763,9 +41891,9 @@ } }, "stylelint-scss": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.0.tgz", - "integrity": "sha512-AvJ6LVzz2iXHxPlPTR9WVy73FC/vmohH54VySNlCKX1NIXNAeuzy/VbIkMJLMyw/xKYqkgY4kAgB+qy5BfCaCg==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.11.1.tgz", + "integrity": "sha512-e4rYo0UY+BIMtGeGanghrvHTjcryxgZbyFxUedp8dLFqC4P70aawNdYjRrQxbnKhu3BNr4+lt5e/53tcKXiwFA==", "dev": true, "requires": { "css-tree": "^3.0.1", @@ -41774,7 +41902,7 @@ "mdn-data": "^2.15.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0" }, "dependencies": { @@ -41803,9 +41931,9 @@ "dev": true }, "mdn-data": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.15.0.tgz", - "integrity": "sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.18.0.tgz", + "integrity": "sha512-gtCy1yim/vpHF/tq3B4Z43x3zKWpYeb4IM3d/Mf4oMYcNuoXOYEaqtoFlLHw9zd7+WNN3jNh6/WXyUrD3OIiwQ==", "dev": true }, "postcss-selector-parser": { @@ -41872,9 +42000,9 @@ } }, "supports-hyperlinks": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", - "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -42048,6 +42176,12 @@ "yallist": "^4.0.0" }, "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -42056,6 +42190,50 @@ } } }, + "tar-fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "terser": { "version": "5.39.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", @@ -42187,6 +42365,31 @@ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true }, + "tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "requires": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "dependencies": { + "fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } + } + }, "tinypool": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", @@ -42289,9 +42492,9 @@ } }, "tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.0.tgz", + "integrity": "sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==", "dev": true, "requires": { "punycode": "^2.3.1" @@ -42440,6 +42643,17 @@ "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "devOptional": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -42527,135 +42741,20 @@ } }, "typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true }, "typescript-eslint": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", - "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.27.0.tgz", + "integrity": "sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", - "@typescript-eslint/utils": "8.24.1" - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" - } - }, - "@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - } - }, - "@typescript-eslint/utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.24.1", - "eslint-visitor-keys": "^4.2.0" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true - } + "@typescript-eslint/eslint-plugin": "8.27.0", + "@typescript-eslint/parser": "8.27.0", + "@typescript-eslint/utils": "8.27.0" } }, "uc.micro": { @@ -42719,12 +42818,6 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, - "unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true - }, "unified": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", @@ -43004,59 +43097,46 @@ "fsevents": "~2.3.3", "postcss": "^8.5.2", "rollup": "^4.30.1" - }, - "dependencies": { - "postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "requires": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - } - } } }, "vite-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", - "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", + "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", "dev": true, "requires": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" } }, "vitest": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", - "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", + "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", "dev": true, "requires": { - "@vitest/expect": "3.0.5", - "@vitest/mocker": "3.0.5", - "@vitest/pretty-format": "^3.0.5", - "@vitest/runner": "3.0.5", - "@vitest/snapshot": "3.0.5", - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/expect": "3.0.9", + "@vitest/mocker": "3.0.9", + "@vitest/pretty-format": "^3.0.9", + "@vitest/runner": "3.0.9", + "@vitest/snapshot": "3.0.9", + "@vitest/spy": "3.0.9", + "@vitest/utils": "3.0.9", + "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.5", + "vite-node": "3.0.9", "why-is-node-running": "^2.3.0" } }, @@ -43138,12 +43218,6 @@ "webpack-sources": "^3.2.3" }, "dependencies": { - "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true - }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -43188,26 +43262,32 @@ } }, "webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", + "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", "colorette": "^2.0.14", - "commander": "^10.0.1", + "commander": "^12.1.0", "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", + "envinfo": "^7.14.0", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^3.1.1", "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" + "webpack-merge": "^6.0.1" }, "dependencies": { + "@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true + }, "colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -43215,21 +43295,10 @@ "dev": true }, "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true - }, - "webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - } } } }, @@ -43370,12 +43439,12 @@ "dev": true }, "whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "requires": { - "tr46": "^5.0.0", + "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, @@ -43482,22 +43551,22 @@ "dev": true }, "winston": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", - "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", "dev": true, "requires": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.4.0", + "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" + "winston-transport": "^4.9.0" }, "dependencies": { "readable-stream": { @@ -43514,13 +43583,13 @@ } }, "winston-transport": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", - "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "dev": true, "requires": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", + "logform": "^2.7.0", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, "dependencies": { diff --git a/package.json b/package.json index 48d6e68e94..d73e8a9cf1 100644 --- a/package.json +++ b/package.json @@ -5,96 +5,97 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "7.26.9", + "@babel/core": "7.26.10", "@babel/plugin-transform-modules-umd": "7.25.9", "@babel/preset-env": "7.26.9", "@babel/preset-react": "7.26.3", "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", - "@eslint/js": "9.20.0", - "@stylistic/eslint-plugin": "3.1.0", + "@eslint/js": "9.23.0", + "@stylistic/eslint-plugin": "4.2.0", "@stylistic/stylelint-plugin": "3.1.2", "@types/dompurify": "3.0.5", "@types/escape-html": "1.0.4", "@types/loadable__component": "5.13.9", "@types/lodash-es": "4.17.12", "@types/markdown-it": "14.1.2", - "@types/react": "18.3.11", - "@types/react-dom": "18.3.1", + "@types/react": "18.3.19", + "@types/react-dom": "18.3.5", "@types/react-lazy-load-image-component": "1.6.4", "@types/sortablejs": "1.15.8", - "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/parser": "8.27.0", "@uupaa/dynamic-import-polyfill": "1.0.2", - "@vitest/coverage-v8": "3.0.5", - "autoprefixer": "10.4.20", - "babel-loader": "9.2.1", + "@vitest/coverage-v8": "3.0.9", + "autoprefixer": "10.4.21", + "babel-loader": "10.0.0", "clean-webpack-plugin": "4.0.0", "confusing-browser-globals": "1.0.11", - "copy-webpack-plugin": "12.0.2", + "copy-webpack-plugin": "13.0.0", "cross-env": "7.0.3", "css-loader": "7.1.2", "cssnano": "7.0.6", - "es-check": "7.2.1", - "eslint": "9.20.1", + "es-check": "8.0.2", + "eslint": "9.23.0", "eslint-plugin-compat": "6.0.2", "eslint-plugin-import": "2.31.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-react": "7.37.4", - "eslint-plugin-react-hooks": "5.1.0", + "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-sonarjs": "3.0.2", "expose-loader": "5.0.1", + "fast-glob": "3.3.3", "fork-ts-checker-webpack-plugin": "9.0.2", - "globals": "15.15.0", + "globals": "16.0.0", "html-loader": "5.1.0", "html-webpack-plugin": "5.6.3", - "jsdom": "25.0.1", + "jsdom": "26.0.0", "mini-css-extract-plugin": "2.9.2", - "postcss": "8.5.2", + "postcss": "8.5.3", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.1.4", + "postcss-preset-env": "10.1.5", "postcss-scss": "4.0.9", - "sass": "1.85.0", + "sass": "1.86.0", "sass-loader": "16.0.5", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.5.0", "style-loader": "4.0.0", - "stylelint": "16.14.1", + "stylelint": "16.16.0", "stylelint-config-rational-order": "0.1.2", "stylelint-no-browser-hacks": "1.3.0", "stylelint-order": "6.0.4", - "stylelint-scss": "6.11.0", + "stylelint-scss": "6.11.1", "ts-loader": "9.5.2", - "typescript": "5.7.3", - "typescript-eslint": "8.24.1", - "vitest": "3.0.5", + "typescript": "5.8.2", + "typescript-eslint": "8.27.0", + "vitest": "3.0.9", "webpack": "5.98.0", "webpack-bundle-analyzer": "4.10.2", - "webpack-cli": "5.1.4", + "webpack-cli": "6.0.1", "webpack-dev-server": "5.2.0", "webpack-merge": "6.0.1", "worker-loader": "3.0.8" }, "dependencies": { - "@emotion/react": "11.13.3", - "@emotion/styled": "11.13.0", - "@fontsource/noto-sans": "5.1.1", - "@fontsource/noto-sans-hk": "5.1.1", - "@fontsource/noto-sans-jp": "5.1.1", - "@fontsource/noto-sans-kr": "5.1.1", - "@fontsource/noto-sans-sc": "5.1.1", - "@fontsource/noto-sans-tc": "5.1.1", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", + "@fontsource/noto-sans": "5.2.6", + "@fontsource/noto-sans-hk": "5.2.5", + "@fontsource/noto-sans-jp": "5.2.5", + "@fontsource/noto-sans-kr": "5.2.5", + "@fontsource/noto-sans-sc": "5.2.5", + "@fontsource/noto-sans-tc": "5.2.5", "@jellyfin/libass-wasm": "4.2.3", - "@jellyfin/sdk": "0.0.0-unstable.202502210501", - "@mui/icons-material": "5.16.14", - "@mui/material": "5.16.14", - "@mui/x-date-pickers": "7.26.0", + "@jellyfin/sdk": "0.0.0-unstable.202503260501", + "@mui/icons-material": "6.4.8", + "@mui/material": "6.4.8", + "@mui/x-date-pickers": "7.28.0", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.62.16", - "@tanstack/react-query-devtools": "5.62.16", + "@tanstack/react-query": "5.69.0", + "@tanstack/react-query-devtools": "5.69.0", "abortcontroller-polyfill": "1.7.8", "blurhash": "2.0.5", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", "classnames": "2.5.1", - "core-js": "3.38.1", + "core-js": "3.41.0", "date-fns": "2.30.0", "dompurify": "2.5.8", "epubjs": "0.3.93", @@ -113,14 +114,14 @@ "lodash-es": "4.17.21", "markdown-it": "14.1.0", "material-design-icons-iconfont": "6.7.0", - "material-react-table": "2.13.3", + "material-react-table": "3.2.1", "native-promise-only": "0.8.1", "pdfjs-dist": "3.11.174", "react": "18.3.1", "react-blurhash": "0.3.0", "react-dom": "18.3.1", - "react-lazy-load-image-component": "1.6.2", - "react-router-dom": "6.27.0", + "react-lazy-load-image-component": "1.6.3", + "react-router-dom": "6.30.0", "resize-observer-polyfill": "1.5.1", "screenfull": "6.0.2", "sortablejs": "1.15.6", @@ -130,7 +131,7 @@ "whatwg-fetch": "3.6.20" }, "optionalDependencies": { - "sass-embedded": "1.85.0" + "sass-embedded": "1.86.0" }, "browserslist": [ "last 2 Firefox versions", diff --git a/src/apps/dashboard/AppLayout.tsx b/src/apps/dashboard/AppLayout.tsx index 16c81771cc..44b8ad2caf 100644 --- a/src/apps/dashboard/AppLayout.tsx +++ b/src/apps/dashboard/AppLayout.tsx @@ -11,6 +11,7 @@ import AppBody from 'components/AppBody'; import AppToolbar from 'components/toolbar/AppToolbar'; import ElevationScroll from 'components/ElevationScroll'; import { DRAWER_WIDTH } from 'components/ResponsiveDrawer'; +import ThemeCss from 'components/ThemeCss'; import { useApi } from 'hooks/useApi'; import { useLocale } from 'hooks/useLocale'; @@ -101,6 +102,7 @@ export const Component: FC = () => { + ); }; diff --git a/src/apps/dashboard/controllers/general.html b/src/apps/dashboard/controllers/general.html deleted file mode 100644 index 80ea02d52d..0000000000 --- a/src/apps/dashboard/controllers/general.html +++ /dev/null @@ -1,84 +0,0 @@ -
-
-
-
-
-
-

${Settings}

-
-
- -
-
- -
${LabelServerNameHelp}
-
-
- -
-
${LabelDisplayLanguageHelp}
- -
-
-
- -
-

${HeaderPaths}

-
-
-
- -
- -
-
${LabelCachePathHelp}
-
- -
-
-
- -
- -
-
${LabelMetadataPathHelp}
- -
-
- -
-
-

${QuickConnect}

-
-
- -
- -
- -
-

${HeaderPerformance}

-
- -
${LibraryScanFanoutConcurrencyHelp}
-
-
- -
${LabelParallelImageEncodingLimitHelp}
-
-
-
-
- -
-
-
-
-
diff --git a/src/apps/dashboard/controllers/general.js b/src/apps/dashboard/controllers/general.js deleted file mode 100644 index 0a2fc98f82..0000000000 --- a/src/apps/dashboard/controllers/general.js +++ /dev/null @@ -1,105 +0,0 @@ -import 'jquery'; - -import loading from 'components/loading/loading'; -import globalize from 'lib/globalize'; -import 'elements/emby-checkbox/emby-checkbox'; -import 'elements/emby-textarea/emby-textarea'; -import 'elements/emby-input/emby-input'; -import 'elements/emby-select/emby-select'; -import 'elements/emby-button/emby-button'; -import Dashboard from 'utils/dashboard'; -import alert from 'components/alert'; - -function loadPage(page, config, languageOptions, systemInfo) { - page.querySelector('#txtServerName').value = systemInfo.ServerName; - page.querySelector('#txtCachePath').value = systemInfo.CachePath || ''; - page.querySelector('#chkQuickConnectAvailable').checked = config.QuickConnectAvailable === true; - page.querySelector('#txtMetadataPath').value = systemInfo.InternalMetadataPath || ''; - page.querySelector('#txtMetadataNetworkPath').value = systemInfo.MetadataNetworkPath || ''; - const localizationLanguageElem = page.querySelector('#selectLocalizationLanguage'); - localizationLanguageElem.innerHTML = languageOptions.map(function (language) { - return ''; - }).join(''); - localizationLanguageElem.value = config.UICulture; - page.querySelector('#txtLibraryScanFanoutConcurrency').value = config.LibraryScanFanoutConcurrency || ''; - page.querySelector('#txtParallelImageEncodingLimit').value = config.ParallelImageEncodingLimit || ''; - - loading.hide(); -} - -function onSubmit() { - loading.show(); - const form = this; - ApiClient.getServerConfiguration().then(function (config) { - config.ServerName = form.querySelector('#txtServerName').value; - config.UICulture = form.querySelector('#selectLocalizationLanguage').value; - config.CachePath = form.querySelector('#txtCachePath').value; - config.MetadataPath = form.querySelector('#txtMetadataPath').value; - config.MetadataNetworkPath = form.querySelector('#txtMetadataNetworkPath').value; - config.QuickConnectAvailable = form.querySelector('#chkQuickConnectAvailable').checked; - config.LibraryScanFanoutConcurrency = parseInt(form.querySelector('#txtLibraryScanFanoutConcurrency').value || '0', 10); - config.ParallelImageEncodingLimit = parseInt(form.querySelector('#txtParallelImageEncodingLimit').value || '0', 10); - - return ApiClient.updateServerConfiguration(config) - .then(() => { - Dashboard.processServerConfigurationUpdateResult(); - }).catch(() => { - loading.hide(); - alert(globalize.translate('ErrorDefault')); - }); - }); - return false; -} - -export default function (view) { - $('#btnSelectCachePath', view).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - callback: function (path) { - if (path) { - view.querySelector('#txtCachePath').value = path; - } - - picker.close(); - }, - validateWriteable: true, - header: globalize.translate('HeaderSelectServerCachePath'), - instruction: globalize.translate('HeaderSelectServerCachePathHelp') - }); - }); - }); - $('#btnSelectMetadataPath', view).on('click.selectDirectory', function () { - import('components/directorybrowser/directorybrowser').then(({ default: DirectoryBrowser }) => { - const picker = new DirectoryBrowser(); - picker.show({ - path: view.querySelector('#txtMetadataPath').value, - networkSharePath: view.querySelector('#txtMetadataNetworkPath').value, - callback: function (path, networkPath) { - if (path) { - view.querySelector('#txtMetadataPath').value = path; - } - - if (networkPath) { - view.querySelector('#txtMetadataNetworkPath').value = networkPath; - } - - picker.close(); - }, - validateWriteable: true, - header: globalize.translate('HeaderSelectMetadataPath'), - instruction: globalize.translate('HeaderSelectMetadataPathHelp') - }); - }); - }); - $('.dashboardGeneralForm', view).off('submit', onSubmit).on('submit', onSubmit); - view.addEventListener('viewshow', function () { - const promiseConfig = ApiClient.getServerConfiguration(); - const promiseLanguageOptions = ApiClient.getJSON(ApiClient.getUrl('Localization/Options')); - const promiseSystemInfo = ApiClient.getSystemInfo(); - Promise.all([promiseConfig, promiseLanguageOptions, promiseSystemInfo]).then(function (responses) { - loadPage(view, responses[0], responses[1], responses[2]); - }); - }); -} - diff --git a/src/apps/dashboard/controllers/metadatanfo.html b/src/apps/dashboard/controllers/metadatanfo.html deleted file mode 100644 index 62f18b2641..0000000000 --- a/src/apps/dashboard/controllers/metadatanfo.html +++ /dev/null @@ -1,49 +0,0 @@ -
- -
- -
-
- -

${HeaderKodiMetadataHelp}

-
-
- -
${LabelKodiMetadataUserHelp}
-
- -
- -
${LabelKodiMetadataDateFormatHelp}
-
-
- -
${LabelKodiMetadataSaveImagePathsHelp}
-
-
- -
-
${LabelKodiMetadataEnablePathSubstitutionHelp}
-
-
-
- -
${LabelKodiMetadataEnableExtraThumbsHelp}
-
-
-
-
- -
-
diff --git a/src/apps/dashboard/controllers/metadatanfo.js b/src/apps/dashboard/controllers/metadatanfo.js deleted file mode 100644 index 51b7eee36b..0000000000 --- a/src/apps/dashboard/controllers/metadatanfo.js +++ /dev/null @@ -1,61 +0,0 @@ -import escapeHtml from 'escape-html'; -import 'jquery'; - -import loading from 'components/loading/loading'; -import globalize from 'lib/globalize'; -import Dashboard from 'utils/dashboard'; -import alert from 'components/alert'; - -function loadPage(page, config, users) { - let html = ''; - html += users.map(function (user) { - return ''; - }).join(''); - const elem = page.querySelector('#selectUser'); - elem.innerHTML = html; - elem.value = config.UserId || ''; - page.querySelector('#selectReleaseDateFormat').value = config.ReleaseDateFormat; - page.querySelector('#chkSaveImagePaths').checked = config.SaveImagePathsInNfo; - page.querySelector('#chkEnablePathSubstitution').checked = config.EnablePathSubstitution; - page.querySelector('#chkEnableExtraThumbs').checked = config.EnableExtraThumbsDuplication; - loading.hide(); -} - -function onSubmit() { - loading.show(); - const form = this; - ApiClient.getNamedConfiguration(metadataKey).then(function (config) { - config.UserId = form.querySelector('#selectUser').value || null; - config.ReleaseDateFormat = form.querySelector('#selectReleaseDateFormat').value; - config.SaveImagePathsInNfo = form.querySelector('#chkSaveImagePaths').checked; - config.EnablePathSubstitution = form.querySelector('#chkEnablePathSubstitution').checked; - config.EnableExtraThumbsDuplication = form.querySelector('#chkEnableExtraThumbs').checked; - ApiClient.updateNamedConfiguration(metadataKey, config).then(function () { - Dashboard.processServerConfigurationUpdateResult(); - showConfirmMessage(); - }); - }); - return false; -} - -function showConfirmMessage() { - const msg = []; - msg.push(globalize.translate('MetadataSettingChangeHelp')); - alert({ - text: msg.join('

') - }); -} - -const metadataKey = 'xbmcmetadata'; -$(document).on('pageinit', '#metadataNfoPage', function () { - $('.metadataNfoForm').off('submit', onSubmit).on('submit', onSubmit); -}).on('pageshow', '#metadataNfoPage', function () { - loading.show(); - const page = this; - const promise1 = ApiClient.getUsers(); - const promise2 = ApiClient.getNamedConfiguration(metadataKey); - Promise.all([promise1, promise2]).then(function (responses) { - loadPage(page, responses[1], responses[0]); - }); -}); - diff --git a/src/apps/dashboard/controllers/scheduledtasks/scheduledtask.html b/src/apps/dashboard/controllers/scheduledtasks/scheduledtask.html deleted file mode 100644 index a2352e6470..0000000000 --- a/src/apps/dashboard/controllers/scheduledtasks/scheduledtask.html +++ /dev/null @@ -1,84 +0,0 @@ -
-
-
-
-
-

-
-

-
- -
-
-

${HeaderTaskTriggers}

- -
-
-
-
-
-
-
-
-

${ButtonAddScheduledTaskTrigger}

-
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
-
-
-
diff --git a/src/apps/dashboard/controllers/scheduledtasks/scheduledtask.js b/src/apps/dashboard/controllers/scheduledtasks/scheduledtask.js deleted file mode 100644 index 7d46af171a..0000000000 --- a/src/apps/dashboard/controllers/scheduledtasks/scheduledtask.js +++ /dev/null @@ -1,236 +0,0 @@ -import loading from 'components/loading/loading'; -import datetime from 'scripts/datetime'; -import dom from 'scripts/dom'; -import globalize from 'lib/globalize'; -import 'elements/emby-input/emby-input'; -import 'elements/emby-button/emby-button'; -import 'elements/emby-select/emby-select'; -import confirm from 'components/confirm/confirm'; -import { getParameterByName } from 'utils/url.ts'; - -function fillTimeOfDay(select) { - const options = []; - - for (let i = 0; i < 86400000; i += 900000) { - options.push({ - name: ScheduledTaskPage.getDisplayTime(i * 10000), - value: i * 10000 - }); - } - - select.innerHTML = options.map(function (o) { - return ''; - }).join(''); -} - -const ScheduledTaskPage = { - refreshScheduledTask: function (view) { - loading.show(); - const id = getParameterByName('id'); - ApiClient.getScheduledTask(id).then(function (task) { - ScheduledTaskPage.loadScheduledTask(view, task); - }); - }, - loadScheduledTask: function (view, task) { - view.querySelector('.taskName').innerHTML = task.Name; - view.querySelector('#pTaskDescription').innerHTML = task.Description; - - import('components/listview/listview.scss').then(() => { - ScheduledTaskPage.loadTaskTriggers(view, task); - }); - - loading.hide(); - }, - loadTaskTriggers: function (context, task) { - let html = ''; - html += '
'; - - for (let i = 0, length = task.Triggers.length; i < length; i++) { - const trigger = task.Triggers[i]; - - html += '
'; - html += ''; - if (trigger.MaxRuntimeTicks) { - html += '
'; - } else { - html += '
'; - } - html += "
" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + '
'; - if (trigger.MaxRuntimeTicks) { - html += '
'; - const hours = trigger.MaxRuntimeTicks / 36e9; - if (hours == 1) { - html += globalize.translate('ValueTimeLimitSingleHour'); - } else { - html += globalize.translate('ValueTimeLimitMultiHour', hours); - } - html += '
'; - } - - html += '
'; - html += ''; - html += '
'; - } - - html += '
'; - context.querySelector('.taskTriggers').innerHTML = html; - }, - // TODO: Replace this mess with date-fns and remove datetime completely - getTriggerFriendlyName: function (trigger) { - if (trigger.Type == 'DailyTrigger') { - return globalize.translate('DailyAt', ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); - } - - if (trigger.Type == 'WeeklyTrigger') { - // TODO: The day of week isn't localised as well - return globalize.translate('WeeklyAt', trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); - } - - if (trigger.Type == 'SystemEventTrigger' && trigger.SystemEvent == 'WakeFromSleep') { - return globalize.translate('OnWakeFromSleep'); - } - - if (trigger.Type == 'IntervalTrigger') { - const hours = trigger.IntervalTicks / 36e9; - - if (hours == 0.25) { - return globalize.translate('EveryXMinutes', '15'); - } - if (hours == 0.5) { - return globalize.translate('EveryXMinutes', '30'); - } - if (hours == 0.75) { - return globalize.translate('EveryXMinutes', '45'); - } - if (hours == 1) { - return globalize.translate('EveryHour'); - } - - return globalize.translate('EveryXHours', hours); - } - - if (trigger.Type == 'StartupTrigger') { - return globalize.translate('OnApplicationStartup'); - } - - return trigger.Type; - }, - getDisplayTime: function (ticks) { - const ms = ticks / 1e4; - const now = new Date(); - now.setHours(0, 0, 0, 0); - now.setTime(now.getTime() + ms); - return datetime.getDisplayTime(now); - }, - showAddTriggerPopup: function (view) { - view.querySelector('#selectTriggerType').value = 'DailyTrigger'; - view.querySelector('#selectTriggerType').dispatchEvent(new CustomEvent('change', {})); - view.querySelector('#popupAddTrigger').classList.remove('hide'); - }, - confirmDeleteTrigger: function (view, index) { - confirm(globalize.translate('MessageDeleteTaskTrigger'), globalize.translate('HeaderDeleteTaskTrigger')).then(function () { - ScheduledTaskPage.deleteTrigger(view, index); - }); - }, - deleteTrigger: function (view, index) { - loading.show(); - const id = getParameterByName('id'); - ApiClient.getScheduledTask(id).then(function (task) { - task.Triggers.splice(index, 1); - ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { - ScheduledTaskPage.refreshScheduledTask(view); - }); - }); - }, - refreshTriggerFields: function (page, triggerType) { - if (triggerType == 'DailyTrigger') { - page.querySelector('#fldTimeOfDay').classList.remove('hide'); - page.querySelector('#fldDayOfWeek').classList.add('hide'); - page.querySelector('#fldSelectSystemEvent').classList.add('hide'); - page.querySelector('#fldSelectInterval').classList.add('hide'); - page.querySelector('#selectTimeOfDay').setAttribute('required', 'required'); - } else if (triggerType == 'WeeklyTrigger') { - page.querySelector('#fldTimeOfDay').classList.remove('hide'); - page.querySelector('#fldDayOfWeek').classList.remove('hide'); - page.querySelector('#fldSelectSystemEvent').classList.add('hide'); - page.querySelector('#fldSelectInterval').classList.add('hide'); - page.querySelector('#selectTimeOfDay').setAttribute('required', 'required'); - } else if (triggerType == 'SystemEventTrigger') { - page.querySelector('#fldTimeOfDay').classList.add('hide'); - page.querySelector('#fldDayOfWeek').classList.add('hide'); - page.querySelector('#fldSelectSystemEvent').classList.remove('hide'); - page.querySelector('#fldSelectInterval').classList.add('hide'); - page.querySelector('#selectTimeOfDay').removeAttribute('required'); - } else if (triggerType == 'IntervalTrigger') { - page.querySelector('#fldTimeOfDay').classList.add('hide'); - page.querySelector('#fldDayOfWeek').classList.add('hide'); - page.querySelector('#fldSelectSystemEvent').classList.add('hide'); - page.querySelector('#fldSelectInterval').classList.remove('hide'); - page.querySelector('#selectTimeOfDay').removeAttribute('required'); - } else if (triggerType == 'StartupTrigger') { - page.querySelector('#fldTimeOfDay').classList.add('hide'); - page.querySelector('#fldDayOfWeek').classList.add('hide'); - page.querySelector('#fldSelectSystemEvent').classList.add('hide'); - page.querySelector('#fldSelectInterval').classList.add('hide'); - page.querySelector('#selectTimeOfDay').removeAttribute('required'); - } - }, - getTriggerToAdd: function (page) { - const trigger = { - Type: page.querySelector('#selectTriggerType').value - }; - - if (trigger.Type == 'DailyTrigger') { - trigger.TimeOfDayTicks = page.querySelector('#selectTimeOfDay').value; - } else if (trigger.Type == 'WeeklyTrigger') { - trigger.DayOfWeek = page.querySelector('#selectDayOfWeek').value; - trigger.TimeOfDayTicks = page.querySelector('#selectTimeOfDay').value; - } else if (trigger.Type == 'SystemEventTrigger') { - trigger.SystemEvent = page.querySelector('#selectSystemEvent').value; - } else if (trigger.Type == 'IntervalTrigger') { - trigger.IntervalTicks = page.querySelector('#selectInterval').value; - } - - let timeLimit = page.querySelector('#txtTimeLimit').value || '0'; - timeLimit = parseFloat(timeLimit) * 3600000; - - trigger.MaxRuntimeTicks = timeLimit * 1e4 || null; - - return trigger; - } -}; -export default function (view) { - function onSubmit(e) { - loading.show(); - const id = getParameterByName('id'); - ApiClient.getScheduledTask(id).then(function (task) { - task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)); - ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { - document.querySelector('#popupAddTrigger').classList.add('hide'); - ScheduledTaskPage.refreshScheduledTask(view); - }); - }); - e.preventDefault(); - } - - view.querySelector('.addTriggerForm').addEventListener('submit', onSubmit); - fillTimeOfDay(view.querySelector('#selectTimeOfDay')); - view.querySelector('#popupAddTrigger').parentNode.trigger(new Event('create')); - view.querySelector('.selectTriggerType').addEventListener('change', function () { - ScheduledTaskPage.refreshTriggerFields(view, this.value); - }); - view.querySelector('.btnAddTrigger').addEventListener('click', function () { - ScheduledTaskPage.showAddTriggerPopup(view); - }); - view.addEventListener('click', function (e) { - const btnDeleteTrigger = dom.parentWithClass(e.target, 'btnDeleteTrigger'); - - if (btnDeleteTrigger) { - ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute('data-index'), 10)); - } - }); - view.addEventListener('viewshow', function () { - ScheduledTaskPage.refreshScheduledTask(view); - }); -} - diff --git a/src/apps/dashboard/features/settings/api/useLocalizationOptions.ts b/src/apps/dashboard/features/settings/api/useLocalizationOptions.ts new file mode 100644 index 0000000000..46a884a396 --- /dev/null +++ b/src/apps/dashboard/features/settings/api/useLocalizationOptions.ts @@ -0,0 +1,21 @@ +import { Api } from '@jellyfin/sdk'; +import { getLocalizationApi } from '@jellyfin/sdk/lib/utils/api/localization-api'; +import { useQuery } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; +import type { AxiosRequestConfig } from 'axios'; + +const fetchLocalizationOptions = async (api: Api, options?: AxiosRequestConfig) => { + const response = await getLocalizationApi(api).getLocalizationOptions(options); + + return response.data; +}; + +export const useLocalizationOptions = () => { + const { api } = useApi(); + + return useQuery({ + queryKey: [ 'LocalizationOptions' ], + queryFn: ({ signal }) => fetchLocalizationOptions(api!, { signal }), + enabled: !!api + }); +}; diff --git a/src/apps/dashboard/features/scheduledtasks/api/useStartTask.ts b/src/apps/dashboard/features/tasks/api/useStartTask.ts similarity index 100% rename from src/apps/dashboard/features/scheduledtasks/api/useStartTask.ts rename to src/apps/dashboard/features/tasks/api/useStartTask.ts diff --git a/src/apps/dashboard/features/scheduledtasks/api/useStopTask.ts b/src/apps/dashboard/features/tasks/api/useStopTask.ts similarity index 100% rename from src/apps/dashboard/features/scheduledtasks/api/useStopTask.ts rename to src/apps/dashboard/features/tasks/api/useStopTask.ts diff --git a/src/apps/dashboard/features/tasks/api/useTask.ts b/src/apps/dashboard/features/tasks/api/useTask.ts new file mode 100644 index 0000000000..9df4adaefa --- /dev/null +++ b/src/apps/dashboard/features/tasks/api/useTask.ts @@ -0,0 +1,29 @@ +import type { ScheduledTasksApiGetTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; +import type { AxiosRequestConfig } from 'axios'; +import type { Api } from '@jellyfin/sdk'; +import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-tasks-api'; +import { useQuery } from '@tanstack/react-query'; + +import { useApi } from 'hooks/useApi'; +import { QUERY_KEY } from './useTasks'; + +const fetchTask = async ( + api: Api, + params: ScheduledTasksApiGetTaskRequest, + options?: AxiosRequestConfig +) => { + const response = await getScheduledTasksApi(api).getTask(params, options); + + return response.data; +}; + +export const useTask = (params: ScheduledTasksApiGetTaskRequest) => { + const { api } = useApi(); + + return useQuery({ + queryKey: [ QUERY_KEY, params.taskId ], + queryFn: ({ signal }) => + fetchTask(api!, params, { signal }), + enabled: !!api + }); +}; diff --git a/src/apps/dashboard/features/scheduledtasks/api/useTasks.ts b/src/apps/dashboard/features/tasks/api/useTasks.ts similarity index 96% rename from src/apps/dashboard/features/scheduledtasks/api/useTasks.ts rename to src/apps/dashboard/features/tasks/api/useTasks.ts index 928ec4d639..7a4b6e1c4d 100644 --- a/src/apps/dashboard/features/scheduledtasks/api/useTasks.ts +++ b/src/apps/dashboard/features/tasks/api/useTasks.ts @@ -22,7 +22,7 @@ export const useTasks = (params?: ScheduledTasksApiGetTasksRequest) => { const { api } = useApi(); return useQuery({ - queryKey: [QUERY_KEY], + queryKey: [ QUERY_KEY ], queryFn: ({ signal }) => fetchTasks(api!, params, { signal }), enabled: !!api diff --git a/src/apps/dashboard/features/tasks/api/useUpdateTask.ts b/src/apps/dashboard/features/tasks/api/useUpdateTask.ts new file mode 100644 index 0000000000..dd0e8ac72b --- /dev/null +++ b/src/apps/dashboard/features/tasks/api/useUpdateTask.ts @@ -0,0 +1,22 @@ +import { ScheduledTasksApiUpdateTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; +import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-tasks-api'; +import { useMutation } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; +import { queryClient } from 'utils/query/queryClient'; +import { QUERY_KEY } from './useTasks'; + +export const useUpdateTask = () => { + const { api } = useApi(); + + return useMutation({ + mutationFn: (params: ScheduledTasksApiUpdateTaskRequest) => ( + getScheduledTasksApi(api!) + .updateTask(params) + ), + onSuccess: (_data, params) => { + void queryClient.invalidateQueries({ + queryKey: [ QUERY_KEY, params.taskId ] + }); + } + }); +}; diff --git a/src/apps/dashboard/features/tasks/components/NewTriggerForm.tsx b/src/apps/dashboard/features/tasks/components/NewTriggerForm.tsx new file mode 100644 index 0000000000..35f645fbd4 --- /dev/null +++ b/src/apps/dashboard/features/tasks/components/NewTriggerForm.tsx @@ -0,0 +1,173 @@ +import React, { FunctionComponent, useCallback, useMemo, useState } from 'react'; +import Dialog from '@mui/material/Dialog'; +import Button from '@mui/material/Button'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogTitle from '@mui/material/DialogTitle'; +import MenuItem from '@mui/material/MenuItem'; +import Stack from '@mui/material/Stack'; +import TextField from '@mui/material/TextField'; +import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info'; +import { TaskTriggerInfoType } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info-type'; +import { DayOfWeek } from '@jellyfin/sdk/lib/generated-client/models/day-of-week'; +import globalize from 'lib/globalize'; +import { getIntervalOptions, getTimeOfDayOptions } from '../utils/edit'; +import { useLocale } from 'hooks/useLocale'; + +type IProps = { + open: boolean, + title: string, + onClose?: () => void, + onAdd?: (trigger: TaskTriggerInfo) => void +}; + +const NewTriggerForm: FunctionComponent = ({ open, title, onClose, onAdd }: IProps) => { + const { dateFnsLocale } = useLocale(); + const [triggerType, setTriggerType] = useState(TaskTriggerInfoType.DailyTrigger); + + const timeOfDayOptions = useMemo(() => getTimeOfDayOptions(dateFnsLocale), [dateFnsLocale]); + const intervalOptions = useMemo(() => getIntervalOptions(dateFnsLocale), [dateFnsLocale]); + + const onTriggerTypeChange = useCallback((e: React.ChangeEvent) => { + setTriggerType(e.target.value as TaskTriggerInfoType); + }, []); + + const onSubmit = useCallback((e: React.FormEvent) => { + e.preventDefault(); + + const formData = new FormData(e.currentTarget); + const data = Object.fromEntries(formData.entries()); + const trigger: TaskTriggerInfo = { + Type: data.TriggerType.toString() as TaskTriggerInfoType + }; + + if (trigger.Type == TaskTriggerInfoType.WeeklyTrigger) { + trigger.DayOfWeek = data.DayOfWeek.toString() as DayOfWeek; + } + + if (trigger.Type == TaskTriggerInfoType.DailyTrigger || trigger.Type == TaskTriggerInfoType.WeeklyTrigger) { + trigger.TimeOfDayTicks = parseInt(data.TimeOfDay.toString(), 10); + } + + if (trigger.Type == TaskTriggerInfoType.IntervalTrigger) { + trigger.IntervalTicks = parseInt(data.Interval.toString(), 10); + } + + if (data.TimeLimit.toString()) { + trigger.MaxRuntimeTicks = parseFloat(data.TimeLimit.toString()) * 36e9; + } + + if (onAdd) { + onAdd(trigger); + } + }, [ onAdd ]); + + return ( + + {title} + + + + + {globalize.translate('OptionDaily')} + {globalize.translate('OptionWeekly')} + {globalize.translate('OptionOnInterval')} + {globalize.translate('OnApplicationStartup')} + + + {triggerType == TaskTriggerInfoType.WeeklyTrigger && ( + + {globalize.translate('Sunday')} + {globalize.translate('Monday')} + {globalize.translate('Tuesday')} + {globalize.translate('Wednesday')} + {globalize.translate('Thursday')} + {globalize.translate('Friday')} + {globalize.translate('Saturday')} + + )} + + {(triggerType == TaskTriggerInfoType.DailyTrigger || triggerType == TaskTriggerInfoType.WeeklyTrigger) && ( + + {timeOfDayOptions.map((option) => { + return {option.name}; + })} + + )} + + {triggerType == TaskTriggerInfoType.IntervalTrigger && ( + + {intervalOptions.map((option) => { + return {option.name}; + })} + + )} + + + + + + + + + + + ); +}; + +export default NewTriggerForm; diff --git a/src/apps/dashboard/features/scheduledtasks/components/Task.tsx b/src/apps/dashboard/features/tasks/components/Task.tsx similarity index 82% rename from src/apps/dashboard/features/scheduledtasks/components/Task.tsx rename to src/apps/dashboard/features/tasks/components/Task.tsx index 0c5fda280b..ef140c0cb3 100644 --- a/src/apps/dashboard/features/scheduledtasks/components/Task.tsx +++ b/src/apps/dashboard/features/tasks/components/Task.tsx @@ -2,11 +2,9 @@ import React, { FunctionComponent, useCallback } from 'react'; import ListItem from '@mui/material/ListItem'; import Avatar from '@mui/material/Avatar'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; -import ListItemButton from '@mui/material/ListItemButton'; import ListItemAvatar from '@mui/material/ListItemAvatar'; import ListItemText from '@mui/material/ListItemText'; import Typography from '@mui/material/Typography'; -import Dashboard from 'utils/dashboard'; import { TaskProps } from '../types/taskProps'; import TaskProgress from './TaskProgress'; import TaskLastRan from './TaskLastRan'; @@ -15,18 +13,12 @@ import PlayArrow from '@mui/icons-material/PlayArrow'; import Stop from '@mui/icons-material/Stop'; import { useStartTask } from '../api/useStartTask'; import { useStopTask } from '../api/useStopTask'; +import ListItemLink from 'components/ListItemLink'; const Task: FunctionComponent = ({ task }: TaskProps) => { const startTask = useStartTask(); const stopTask = useStopTask(); - const navigateTaskEdit = useCallback(() => { - Dashboard.navigate(`/dashboard/tasks/edit?id=${task.Id}`) - .catch(err => { - console.error('[Task] failed to navigate to task edit page', err); - }); - }, [task]); - const handleStartTask = useCallback(() => { if (task.Id) { startTask.mutate({ taskId: task.Id }); @@ -48,7 +40,7 @@ const Task: FunctionComponent = ({ task }: TaskProps) => { } > - + @@ -59,7 +51,7 @@ const Task: FunctionComponent = ({ task }: TaskProps) => { secondary={task.State == 'Running' ? : } disableTypography /> - + ); }; diff --git a/src/apps/dashboard/features/scheduledtasks/components/TaskLastRan.tsx b/src/apps/dashboard/features/tasks/components/TaskLastRan.tsx similarity index 100% rename from src/apps/dashboard/features/scheduledtasks/components/TaskLastRan.tsx rename to src/apps/dashboard/features/tasks/components/TaskLastRan.tsx diff --git a/src/apps/dashboard/features/scheduledtasks/components/TaskProgress.tsx b/src/apps/dashboard/features/tasks/components/TaskProgress.tsx similarity index 100% rename from src/apps/dashboard/features/scheduledtasks/components/TaskProgress.tsx rename to src/apps/dashboard/features/tasks/components/TaskProgress.tsx diff --git a/src/apps/dashboard/features/tasks/components/TaskTriggerCell.tsx b/src/apps/dashboard/features/tasks/components/TaskTriggerCell.tsx new file mode 100644 index 0000000000..9f4f8502c9 --- /dev/null +++ b/src/apps/dashboard/features/tasks/components/TaskTriggerCell.tsx @@ -0,0 +1,34 @@ +import React, { FC } from 'react'; +import type { MRT_Cell, MRT_RowData } from 'material-react-table'; +import { useLocale } from 'hooks/useLocale'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import { getTriggerFriendlyName } from '../utils/edit'; +import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info'; +import globalize from 'lib/globalize'; + +interface CellProps { + cell: MRT_Cell +} + +const TaskTriggerCell: FC = ({ cell }) => { + const { dateFnsLocale } = useLocale(); + const trigger = cell.getValue(); + + const timeLimitHours = trigger.MaxRuntimeTicks ? trigger.MaxRuntimeTicks / 36e9 : false; + + return ( + + {getTriggerFriendlyName(trigger, dateFnsLocale)} + {timeLimitHours && ( + + {timeLimitHours == 1 ? + globalize.translate('ValueTimeLimitSingleHour') : + globalize.translate('ValueTimeLimitMultiHour', timeLimitHours)} + + )} + + ); +}; + +export default TaskTriggerCell; diff --git a/src/apps/dashboard/features/scheduledtasks/components/Tasks.tsx b/src/apps/dashboard/features/tasks/components/Tasks.tsx similarity index 100% rename from src/apps/dashboard/features/scheduledtasks/components/Tasks.tsx rename to src/apps/dashboard/features/tasks/components/Tasks.tsx diff --git a/src/apps/dashboard/features/tasks/constants/intervalDurations.ts b/src/apps/dashboard/features/tasks/constants/intervalDurations.ts new file mode 100644 index 0000000000..f90d0f0ddd --- /dev/null +++ b/src/apps/dashboard/features/tasks/constants/intervalDurations.ts @@ -0,0 +1,13 @@ +export const INTERVAL_DURATIONS: number[] = [ + 9000000000, // 15 minutes + 18000000000, // 30 minutes + 27000000000, // 45 minutes + 36000000000, // 1 hour + 72000000000, // 2 hours + 108000000000, // 3 hours + 144000000000, // 4 hours + 216000000000, // 6 hours + 288000000000, // 8 hours + 432000000000, // 12 hours + 864000000000 // 24 hours +]; diff --git a/src/apps/dashboard/features/scheduledtasks/types/taskProps.ts b/src/apps/dashboard/features/tasks/types/taskProps.ts similarity index 100% rename from src/apps/dashboard/features/scheduledtasks/types/taskProps.ts rename to src/apps/dashboard/features/tasks/types/taskProps.ts diff --git a/src/apps/dashboard/features/tasks/utils/edit.ts b/src/apps/dashboard/features/tasks/utils/edit.ts new file mode 100644 index 0000000000..536146e9c5 --- /dev/null +++ b/src/apps/dashboard/features/tasks/utils/edit.ts @@ -0,0 +1,80 @@ +import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info'; +import { format, formatDistanceStrict, Locale, parse } from 'date-fns'; +import globalize from 'lib/globalize'; +import { INTERVAL_DURATIONS } from '../constants/intervalDurations'; + +function getDisplayTime(ticks: number, locale: Locale) { + const ms = ticks / 1e4; + const now = new Date(); + now.setHours(0, 0, 0, 0); + now.setTime(now.getTime() + ms); + return format(now, 'p', { locale: locale }); +} + +export function getTimeOfDayOptions(locale: Locale) { + const options = []; + + for (let i = 0; i < 86400000; i += 900000) { + options.push({ + name: getDisplayTime(i * 10000, locale), + value: i * 10000 + }); + } + + return options; +} + +export function getIntervalOptions(locale: Locale) { + const options = []; + + for (const ticksDuration of INTERVAL_DURATIONS) { + const durationMs = Math.floor(ticksDuration / 1e4); + const unit = durationMs < 36e5 ? 'minute' : 'hour'; + options.push({ + name: formatDistanceStrict(0, durationMs, { locale: locale, unit: unit }), + value: ticksDuration + }); + } + + return options; +} + +function getIntervalTriggerTime(ticks: number) { + const hours = ticks / 36e9; + + switch (hours) { + case 0.25: + return globalize.translate('EveryXMinutes', '15'); + case 0.5: + return globalize.translate('EveryXMinutes', '30'); + case 0.75: + return globalize.translate('EveryXMinutes', '45'); + case 1: + return globalize.translate('EveryHour'); + default: + return globalize.translate('EveryXHours', hours); + } +} + +function localizeDayOfWeek(dayOfWeek: string | null | undefined, locale: Locale) { + if (!dayOfWeek) return ''; + + const parsedDayOfWeek = parse(dayOfWeek, 'cccc', new Date()); + + return format(parsedDayOfWeek, 'cccc', { locale: locale }); +} + +export function getTriggerFriendlyName(trigger: TaskTriggerInfo, locale: Locale) { + switch (trigger.Type) { + case 'DailyTrigger': + return globalize.translate('DailyAt', getDisplayTime(trigger.TimeOfDayTicks || 0, locale)); + case 'WeeklyTrigger': + return globalize.translate('WeeklyAt', localizeDayOfWeek(trigger.DayOfWeek, locale), getDisplayTime(trigger.TimeOfDayTicks || 0, locale)); + case 'IntervalTrigger': + return getIntervalTriggerTime(trigger.IntervalTicks || 0); + case 'StartupTrigger': + return globalize.translate('OnApplicationStartup'); + default: + return trigger.Type; + } +} diff --git a/src/apps/dashboard/features/scheduledtasks/utils/tasks.ts b/src/apps/dashboard/features/tasks/utils/tasks.ts similarity index 100% rename from src/apps/dashboard/features/scheduledtasks/utils/tasks.ts rename to src/apps/dashboard/features/tasks/utils/tasks.ts diff --git a/src/apps/dashboard/routes/_asyncRoutes.ts b/src/apps/dashboard/routes/_asyncRoutes.ts index 5a7398da39..2ab21c5d4f 100644 --- a/src/apps/dashboard/routes/_asyncRoutes.ts +++ b/src/apps/dashboard/routes/_asyncRoutes.ts @@ -5,9 +5,11 @@ export const ASYNC_ADMIN_ROUTES: AsyncRoute[] = [ { path: 'activity', type: AppType.Dashboard }, { path: 'branding', type: AppType.Dashboard }, { path: 'devices', type: AppType.Dashboard }, + { path: 'settings', type: AppType.Dashboard }, { path: 'keys', type: AppType.Dashboard }, { path: 'libraries/display', type: AppType.Dashboard }, { path: 'libraries/metadata', type: AppType.Dashboard }, + { path: 'libraries/nfo', type: AppType.Dashboard }, { path: 'logs', type: AppType.Dashboard }, { path: 'logs/:file', page: 'logs/file', type: AppType.Dashboard }, { path: 'playback/resume', type: AppType.Dashboard }, @@ -15,6 +17,7 @@ export const ASYNC_ADMIN_ROUTES: AsyncRoute[] = [ { path: 'playback/trickplay', type: AppType.Dashboard }, { path: 'plugins/:pluginId', page: 'plugins/plugin', type: AppType.Dashboard }, { path: 'tasks', type: AppType.Dashboard }, + { path: 'tasks/:id', page: 'tasks/task', type: AppType.Dashboard }, { path: 'users', type: AppType.Dashboard }, { path: 'users/access', type: AppType.Dashboard }, { path: 'users/add', type: AppType.Dashboard }, diff --git a/src/apps/dashboard/routes/_legacyRoutes.ts b/src/apps/dashboard/routes/_legacyRoutes.ts index b690b45440..ceedb72651 100644 --- a/src/apps/dashboard/routes/_legacyRoutes.ts +++ b/src/apps/dashboard/routes/_legacyRoutes.ts @@ -9,13 +9,6 @@ export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ controller: 'dashboard', view: 'dashboard.html' } - }, { - path: 'settings', - pageProps: { - appType: AppType.Dashboard, - controller: 'general', - view: 'general.html' - } }, { path: 'networking', pageProps: { @@ -37,13 +30,6 @@ export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ controller: 'encodingsettings', view: 'encodingsettings.html' } - }, { - path: 'libraries/nfo', - pageProps: { - appType: AppType.Dashboard, - controller: 'metadatanfo', - view: 'metadatanfo.html' - } }, { path: 'plugins/catalog', pageProps: { @@ -93,12 +79,5 @@ export const LEGACY_ADMIN_ROUTES: LegacyRoute[] = [ controller: 'plugins/installed/index', view: 'plugins/installed/index.html' } - }, { - path: 'tasks/edit', - pageProps: { - appType: AppType.Dashboard, - controller: 'scheduledtasks/scheduledtask', - view: 'scheduledtasks/scheduledtask.html' - } } ]; diff --git a/src/apps/dashboard/routes/branding/index.tsx b/src/apps/dashboard/routes/branding/index.tsx index a62cd929ba..e510c98c30 100644 --- a/src/apps/dashboard/routes/branding/index.tsx +++ b/src/apps/dashboard/routes/branding/index.tsx @@ -123,14 +123,16 @@ export const Component = () => { multiline minRows={5} maxRows={5} - InputProps={{ - className: 'textarea-mono' - }} name={BrandingOption.LoginDisclaimer} label={globalize.translate('LabelLoginDisclaimer')} helperText={globalize.translate('LabelLoginDisclaimerHelp')} value={brandingOptions?.LoginDisclaimer} onChange={setBrandingOption} + slotProps={{ + input: { + className: 'textarea-mono' + } + }} /> { multiline minRows={5} maxRows={20} - InputProps={{ - className: 'textarea-mono' - }} name={BrandingOption.CustomCss} label={globalize.translate('LabelCustomCss')} helperText={globalize.translate('LabelCustomCssHelp')} value={brandingOptions?.CustomCss} onChange={setBrandingOption} + slotProps={{ + input: { + className: 'textarea-mono' + } + }} /> + + + )} + + + ); +}; + +Component.displayName = 'NFOSettingsPage'; diff --git a/src/apps/dashboard/routes/logs/index.tsx b/src/apps/dashboard/routes/logs/index.tsx index 1cb085c914..84af1b2445 100644 --- a/src/apps/dashboard/routes/logs/index.tsx +++ b/src/apps/dashboard/routes/logs/index.tsx @@ -8,7 +8,7 @@ import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import FormControlLabel from '@mui/material/FormControlLabel'; import Stack from '@mui/material/Stack'; -import Switch from '@mui/material/Switch'; +import Checkbox from '@mui/material/Checkbox'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'react-router-dom'; @@ -98,7 +98,7 @@ export const Component = () => { { name='MinResumePercentage' type='number' defaultValue={config?.MinResumePct} - inputProps={{ - min: 0, - max: 100, - required: true - }} helperText={globalize.translate('LabelMinResumePercentageHelp')} + slotProps={{ + htmlInput: { + min: 0, + max: 100, + required: true + } + }} /> { name='MaxResumePercentage' type='number' defaultValue={config?.MaxResumePct} - inputProps={{ - min: 1, - max: 100, - required: true - }} helperText={globalize.translate('LabelMaxResumePercentageHelp')} + slotProps={{ + htmlInput: { + min: 1, + max: 100, + required: true + } + }} /> { name='MinAudiobookResume' type='number' defaultValue={config?.MinAudiobookResume} - inputProps={{ - min: 0, - max: 100, - required: true - }} helperText={globalize.translate('LabelMinAudiobookResumeHelp')} + slotProps={{ + htmlInput: { + min: 0, + max: 100, + required: true + } + }} /> { name='MaxAudiobookResume' type='number' defaultValue={config?.MaxAudiobookResume} - inputProps={{ - min: 1, - max: 100, - required: true - }} helperText={globalize.translate('LabelMaxAudiobookResumeHelp')} + slotProps={{ + htmlInput: { + min: 1, + max: 100, + required: true + } + }} /> { name='MinResumeDuration' type='number' defaultValue={config?.MinResumeDurationSeconds} - inputProps={{ - min: 0, - required: true - }} helperText={globalize.translate('LabelMinResumeDurationHelp')} + slotProps={{ + htmlInput: { + min: 0, + required: true + } + }} /> + + + )} + + + ); +}; + +Component.displayName = 'SettingsPage'; diff --git a/src/apps/dashboard/routes/tasks/index.tsx b/src/apps/dashboard/routes/tasks/index.tsx index f742ef8ede..232fb34950 100644 --- a/src/apps/dashboard/routes/tasks/index.tsx +++ b/src/apps/dashboard/routes/tasks/index.tsx @@ -3,10 +3,10 @@ import Page from 'components/Page'; import globalize from 'lib/globalize'; import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; -import { QUERY_KEY, useTasks } from '../../features/scheduledtasks/api/useTasks'; -import { getCategories, getTasksByCategory } from '../../features/scheduledtasks/utils/tasks'; +import { QUERY_KEY, useTasks } from '../../features/tasks/api/useTasks'; +import { getCategories, getTasksByCategory } from '../../features/tasks/utils/tasks'; import Loading from 'components/loading/LoadingComponent'; -import Tasks from '../../features/scheduledtasks/components/Tasks'; +import Tasks from '../../features/tasks/components/Tasks'; import type { TaskInfo } from '@jellyfin/sdk/lib/generated-client/models/task-info'; import { SessionMessageType } from '@jellyfin/sdk/lib/generated-client/models/session-message-type'; import serverNotifications from 'scripts/serverNotifications'; diff --git a/src/apps/dashboard/routes/tasks/task.tsx b/src/apps/dashboard/routes/tasks/task.tsx new file mode 100644 index 0000000000..2aa00f886c --- /dev/null +++ b/src/apps/dashboard/routes/tasks/task.tsx @@ -0,0 +1,172 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import Page from 'components/Page'; +import { useParams } from 'react-router-dom'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import AddIcon from '@mui/icons-material/Add'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import RemoveCircleIcon from '@mui/icons-material/RemoveCircle'; +import Loading from 'components/loading/LoadingComponent'; +import { MRT_ColumnDef, MRT_Table, useMaterialReactTable } from 'material-react-table'; +import type { TaskTriggerInfo } from '@jellyfin/sdk/lib/generated-client/models/task-trigger-info'; +import globalize from '../../../../lib/globalize'; +import { useTask } from 'apps/dashboard/features/tasks/api/useTask'; +import { useUpdateTask } from 'apps/dashboard/features/tasks/api/useUpdateTask'; +import ConfirmDialog from 'components/ConfirmDialog'; +import TaskTriggerCell from 'apps/dashboard/features/tasks/components/TaskTriggerCell'; +import NewTriggerForm from 'apps/dashboard/features/tasks/components/NewTriggerForm'; + +export const Component = () => { + const { id: taskId } = useParams(); + const updateTask = useUpdateTask(); + const { data: task, isLoading } = useTask({ taskId: taskId || '' }); + const [ isAddTriggerDialogOpen, setIsAddTriggerDialogOpen ] = useState(false); + const [ isRemoveConfirmOpen, setIsRemoveConfirmOpen ] = useState(false); + const [ pendingDeleteTrigger, setPendingDeleteTrigger ] = useState(null); + + const onCloseRemoveConfirmDialog = useCallback(() => { + setPendingDeleteTrigger(null); + setIsRemoveConfirmOpen(false); + }, []); + + const onDeleteTrigger = useCallback((trigger: TaskTriggerInfo | null | undefined) => { + if (trigger) { + setPendingDeleteTrigger(trigger); + setIsRemoveConfirmOpen(true); + } + }, []); + + const onConfirmDelete = useCallback(() => { + const triggersRemaining = task?.Triggers?.filter(trigger => trigger != pendingDeleteTrigger); + + if (task?.Id && triggersRemaining) { + updateTask.mutate({ + taskId: task.Id, + taskTriggerInfo: triggersRemaining + }); + setIsRemoveConfirmOpen(false); + } + }, [task, pendingDeleteTrigger, updateTask]); + + const showAddTriggerDialog = useCallback(() => { + setIsAddTriggerDialogOpen(true); + }, []); + + const handleNewTriggerDialogClose = useCallback(() => { + setIsAddTriggerDialogOpen(false); + }, []); + + const onNewTriggerAdd = useCallback((trigger: TaskTriggerInfo) => { + if (task?.Triggers && task?.Id) { + const triggers = [...task.Triggers, trigger]; + + updateTask.mutate({ + taskId: task.Id, + taskTriggerInfo: triggers + }); + setIsAddTriggerDialogOpen(false); + } + }, [task, updateTask]); + + const columns = useMemo[]>(() => [ + { + id: 'TriggerTime', + accessorFn: row => row, + Cell: TaskTriggerCell, + header: globalize.translate('LabelTime') + } + ], []); + + const table = useMaterialReactTable({ + columns, + data: task?.Triggers || [], + + enableSorting: false, + enableFilters: false, + enableColumnActions: false, + enablePagination: false, + + state: { + isLoading + }, + + muiTableContainerProps: { + sx: { + maxHeight: 'calc(100% - 7rem)' // 2 x 3.5rem for header and footer + } + }, + + // Custom actions + enableRowActions: true, + positionActionsColumn: 'last', + displayColumnDefOptions: { + 'mrt-row-actions': { + header: '' + } + }, + renderRowActions: ({ row }) => { + return ( + + + onDeleteTrigger(row.original)} + > + + + + + ); + } + }); + + if (isLoading || !task) { + return ; + } + + return ( + + + + + + + {task.Name} + {task.Description} + + + + + + + ); +}; + +Component.displayName = 'TaskPage'; diff --git a/src/apps/dashboard/routes/users/profile.tsx b/src/apps/dashboard/routes/users/profile.tsx index 2f98d67bd3..36afb9ca9f 100644 --- a/src/apps/dashboard/routes/users/profile.tsx +++ b/src/apps/dashboard/routes/users/profile.tsx @@ -298,7 +298,7 @@ const UserEdit = () => { className='lnkEditUserPreferencesContainer' style={{ paddingBottom: '1em' }} > - + {globalize.translate('ButtonEditOtherUserPreferences')}
diff --git a/src/apps/experimental/AppLayout.tsx b/src/apps/experimental/AppLayout.tsx index 167a96eaff..6412115302 100644 --- a/src/apps/experimental/AppLayout.tsx +++ b/src/apps/experimental/AppLayout.tsx @@ -6,8 +6,10 @@ import useMediaQuery from '@mui/material/useMediaQuery'; import { Outlet, useLocation } from 'react-router-dom'; import AppBody from 'components/AppBody'; +import CustomCss from 'components/CustomCss'; import ElevationScroll from 'components/ElevationScroll'; import { DRAWER_WIDTH } from 'components/ResponsiveDrawer'; +import ThemeCss from 'components/ThemeCss'; import { useApi } from 'hooks/useApi'; import AppToolbar from './components/AppToolbar'; @@ -29,52 +31,56 @@ export const Component = () => { }, [ isDrawerActive, setIsDrawerActive ]); return ( - - - - - - - + <> + + + + + + + - { - isDrawerAvailable && ( - - ) - } - + { + isDrawerAvailable && ( + + ) + } + - - - - + + + + + - + + + ); }; diff --git a/src/apps/experimental/AppOverrides.scss b/src/apps/experimental/AppOverrides.scss index fa586829e9..f6ea674428 100644 --- a/src/apps/experimental/AppOverrides.scss +++ b/src/apps/experimental/AppOverrides.scss @@ -17,6 +17,10 @@ $drawer-width: 240px; left: $drawer-width; } } +// The fallback page has no drawer +#fallbackPage { + left: 0; +} // Hide some items from the user "settings" page that are in the drawer #myPreferencesMenuPage { diff --git a/src/apps/experimental/components/AppToolbar/SearchButton.tsx b/src/apps/experimental/components/AppToolbar/SearchButton.tsx index 3d002ee57c..c0fbea9266 100644 --- a/src/apps/experimental/components/AppToolbar/SearchButton.tsx +++ b/src/apps/experimental/components/AppToolbar/SearchButton.tsx @@ -35,13 +35,13 @@ const SearchButton: FC = ({ isTabsAvailable }) => { const location = useLocation(); const [searchParams] = useSearchParams(); - const isSearchPath = location.pathname === '/search.html'; + const isSearchPath = location.pathname === '/search'; const createSearchLink = isTabsAvailable ? { - pathname: '/search.html', + pathname: '/search', search: `?${createSearchParams(getUrlParams(searchParams))}` } : - '/search.html'; + '/search'; return ( diff --git a/src/apps/experimental/components/AppToolbar/index.tsx b/src/apps/experimental/components/AppToolbar/index.tsx index e8463ea803..df46cc1233 100644 --- a/src/apps/experimental/components/AppToolbar/index.tsx +++ b/src/apps/experimental/components/AppToolbar/index.tsx @@ -14,11 +14,11 @@ interface AppToolbarProps { } const PUBLIC_PATHS = [ - '/addserver.html', - '/selectserver.html', - '/login.html', - '/forgotpassword.html', - '/forgotpasswordpin.html' + '/addserver', + '/selectserver', + '/login', + '/forgotpassword', + '/forgotpasswordpin' ]; const ExperimentalAppToolbar: FC = ({ diff --git a/src/apps/experimental/components/drawers/MainDrawerContent.tsx b/src/apps/experimental/components/drawers/MainDrawerContent.tsx index 46c797ac96..e15b833616 100644 --- a/src/apps/experimental/components/drawers/MainDrawerContent.tsx +++ b/src/apps/experimental/components/drawers/MainDrawerContent.tsx @@ -30,7 +30,7 @@ const MainDrawerContent = () => { const userViews = userViewsData?.Items || []; const webConfig = useWebConfig(); - const isHomeSelected = location.pathname === '/home.html' && (!location.search || location.search === '?tab=0'); + const isHomeSelected = location.pathname === '/home' && (!location.search || location.search === '?tab=0'); return ( <> @@ -40,7 +40,7 @@ const MainDrawerContent = () => { - + @@ -48,7 +48,7 @@ const MainDrawerContent = () => { - + diff --git a/src/apps/experimental/components/tabs/tabRoutes.ts b/src/apps/experimental/components/tabs/tabRoutes.ts index c1a9ff9cf1..1fb388f603 100644 --- a/src/apps/experimental/components/tabs/tabRoutes.ts +++ b/src/apps/experimental/components/tabs/tabRoutes.ts @@ -36,7 +36,7 @@ export const getDefaultTabIndex = (path: string, libraryId?: string | null) => { const TabRoutes: TabRoute[] = [ { - path: '/livetv.html', + path: '/livetv', tabs: [ { index: 0, @@ -72,7 +72,7 @@ const TabRoutes: TabRoute[] = [ ] }, { - path: '/movies.html', + path: '/movies', tabs: [ { index: 0, @@ -108,7 +108,7 @@ const TabRoutes: TabRoute[] = [ ] }, { - path: '/music.html', + path: '/music', tabs: [ { index: 0, @@ -149,7 +149,7 @@ const TabRoutes: TabRoute[] = [ ] }, { - path: '/tv.html', + path: '/tv', tabs: [ { index: 0, @@ -185,7 +185,7 @@ const TabRoutes: TabRoute[] = [ ] }, { - path: '/homevideos.html', + path: '/homevideos', tabs: [ { index: 0, diff --git a/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx b/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx index 2f9cb360b7..f042316912 100644 --- a/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx +++ b/src/apps/experimental/features/details/components/buttons/CancelSeriesTimerButton.tsx @@ -36,7 +36,7 @@ const CancelSeriesTimerButton: FC = ({ onSuccess: async () => { toast(globalize.translate('SeriesCancelled')); loading.hide(); - navigate('/livetv.html'); + navigate('/livetv'); }, onError: (err: unknown) => { loading.hide(); diff --git a/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx b/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx index e384f34ee6..6977459c6b 100644 --- a/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx +++ b/src/apps/experimental/features/preferences/components/DisplayPreferences.tsx @@ -146,18 +146,20 @@ export function DisplayPreferences({ onChange, values }: Readonly {globalize.translate('LabelBackdropScreensaverIntervalHelp')} diff --git a/src/apps/experimental/features/preferences/components/LibraryPreferences.tsx b/src/apps/experimental/features/preferences/components/LibraryPreferences.tsx index 4b65960070..487fcd4e58 100644 --- a/src/apps/experimental/features/preferences/components/LibraryPreferences.tsx +++ b/src/apps/experimental/features/preferences/components/LibraryPreferences.tsx @@ -24,19 +24,21 @@ export function LibraryPreferences({ onChange, values }: Readonly {globalize.translate('LabelLibraryPageSizeHelp')} diff --git a/src/apps/experimental/features/preferences/components/NextUpPreferences.tsx b/src/apps/experimental/features/preferences/components/NextUpPreferences.tsx index 890f86d65d..69deba4bb9 100644 --- a/src/apps/experimental/features/preferences/components/NextUpPreferences.tsx +++ b/src/apps/experimental/features/preferences/components/NextUpPreferences.tsx @@ -25,18 +25,20 @@ export function NextUpPreferences({ onChange, values }: Readonly {globalize.translate('LabelMaxDaysForNextUpHelp')} diff --git a/src/apps/experimental/routes/asyncRoutes/user.ts b/src/apps/experimental/routes/asyncRoutes/user.ts index 7c9fd8ba5a..59a88990b8 100644 --- a/src/apps/experimental/routes/asyncRoutes/user.ts +++ b/src/apps/experimental/routes/asyncRoutes/user.ts @@ -2,14 +2,14 @@ import { AsyncRoute } from 'components/router/AsyncRoute'; import { AppType } from 'constants/appType'; export const ASYNC_USER_ROUTES: AsyncRoute[] = [ - { path: 'home.html', page: 'home', type: AppType.Experimental }, + { path: 'home', page: 'home', type: AppType.Experimental }, { path: 'quickconnect', page: 'quickConnect' }, - { path: 'search.html', page: 'search' }, - { path: 'userprofile.html', page: 'user/userprofile' }, - { path: 'movies.html', page: 'movies', type: AppType.Experimental }, - { path: 'tv.html', page: 'shows', type: AppType.Experimental }, - { path: 'music.html', page: 'music', type: AppType.Experimental }, - { path: 'livetv.html', page: 'livetv', type: AppType.Experimental }, - { path: 'mypreferencesdisplay.html', page: 'user/display', type: AppType.Experimental }, - { path: 'homevideos.html', page: 'homevideos', type: AppType.Experimental } + { path: 'search', page: 'search' }, + { path: 'userprofile', page: 'user/userprofile' }, + { path: 'movies', page: 'movies', type: AppType.Experimental }, + { path: 'tv', page: 'shows', type: AppType.Experimental }, + { path: 'music', page: 'music', type: AppType.Experimental }, + { path: 'livetv', page: 'livetv', type: AppType.Experimental }, + { path: 'mypreferencesdisplay', page: 'user/display', type: AppType.Experimental }, + { path: 'homevideos', page: 'homevideos', type: AppType.Experimental } ]; diff --git a/src/apps/experimental/routes/legacyRoutes/public.ts b/src/apps/experimental/routes/legacyRoutes/public.ts index 1fec40eaad..89fc179354 100644 --- a/src/apps/experimental/routes/legacyRoutes/public.ts +++ b/src/apps/experimental/routes/legacyRoutes/public.ts @@ -2,77 +2,77 @@ import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_PUBLIC_ROUTES: LegacyRoute[] = [ { - path: 'addserver.html', + path: 'addserver', pageProps: { controller: 'session/addServer/index', view: 'session/addServer/index.html' } }, { - path: 'selectserver.html', + path: 'selectserver', pageProps: { controller: 'session/selectServer/index', view: 'session/selectServer/index.html' } }, { - path: 'login.html', + path: 'login', pageProps: { controller: 'session/login/index', view: 'session/login/index.html' } }, { - path: 'forgotpassword.html', + path: 'forgotpassword', pageProps: { controller: 'session/forgotPassword/index', view: 'session/forgotPassword/index.html' } }, { - path: 'forgotpasswordpin.html', + path: 'forgotpasswordpin', pageProps: { controller: 'session/resetPassword/index', view: 'session/resetPassword/index.html' } }, { - path: 'wizardremoteaccess.html', + path: 'wizardremoteaccess', pageProps: { controller: 'wizard/remote/index', view: 'wizard/remote/index.html' } }, { - path: 'wizardfinish.html', + path: 'wizardfinish', pageProps: { controller: 'wizard/finish/index', view: 'wizard/finish/index.html' } }, { - path: 'wizardlibrary.html', + path: 'wizardlibrary', pageProps: { controller: 'wizard/library', view: 'wizard/library.html' } }, { - path: 'wizardsettings.html', + path: 'wizardsettings', pageProps: { controller: 'wizard/settings/index', view: 'wizard/settings/index.html' } }, { - path: 'wizardstart.html', + path: 'wizardstart', pageProps: { controller: 'wizard/start/index', view: 'wizard/start/index.html' } }, { - path: 'wizarduser.html', + path: 'wizarduser', pageProps: { controller: 'wizard/user/index', view: 'wizard/user/index.html' diff --git a/src/apps/experimental/routes/legacyRoutes/user.ts b/src/apps/experimental/routes/legacyRoutes/user.ts index 2045495a10..7ba85448e0 100644 --- a/src/apps/experimental/routes/legacyRoutes/user.ts +++ b/src/apps/experimental/routes/legacyRoutes/user.ts @@ -8,7 +8,7 @@ export const LEGACY_USER_ROUTES: LegacyRoute[] = [ view: 'itemDetails/index.html' } }, { - path: 'list.html', + path: 'list', pageProps: { controller: 'list', view: 'list.html' @@ -20,31 +20,31 @@ export const LEGACY_USER_ROUTES: LegacyRoute[] = [ view: 'lyrics.html' } }, { - path: 'mypreferencesmenu.html', + path: 'mypreferencesmenu', pageProps: { controller: 'user/menu/index', view: 'user/menu/index.html' } }, { - path: 'mypreferencescontrols.html', + path: 'mypreferencescontrols', pageProps: { controller: 'user/controls/index', view: 'user/controls/index.html' } }, { - path: 'mypreferenceshome.html', + path: 'mypreferenceshome', pageProps: { controller: 'user/home/index', view: 'user/home/index.html' } }, { - path: 'mypreferencesplayback.html', + path: 'mypreferencesplayback', pageProps: { controller: 'user/playback/index', view: 'user/playback/index.html' } }, { - path: 'mypreferencessubtitles.html', + path: 'mypreferencessubtitles', pageProps: { controller: 'user/subtitles/index', view: 'user/subtitles/index.html' diff --git a/src/apps/experimental/routes/routes.tsx b/src/apps/experimental/routes/routes.tsx index 046f447d65..533972b899 100644 --- a/src/apps/experimental/routes/routes.tsx +++ b/src/apps/experimental/routes/routes.tsx @@ -5,6 +5,7 @@ import ConnectionRequired from 'components/ConnectionRequired'; import { toAsyncPageRoute } from 'components/router/AsyncRoute'; import { toViewManagerPageRoute } from 'components/router/LegacyRoute'; import ErrorBoundary from 'components/router/ErrorBoundary'; +import FallbackRoute from 'components/router/FallbackRoute'; import { ASYNC_USER_ROUTES } from './asyncRoutes'; import { LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES } from './legacyRoutes'; @@ -15,9 +16,11 @@ export const EXPERIMENTAL_APP_ROUTES: RouteObject[] = [ path: '/*', lazy: () => import('../AppLayout'), children: [ + { index: true, element: }, + { - /* User routes: Any child route of this layout is authenticated */ - element: , + /* User routes */ + Component: ConnectionRequired, children: [ ...ASYNC_USER_ROUTES.map(toAsyncPageRoute), ...LEGACY_USER_ROUTES.map(toViewManagerPageRoute), @@ -25,15 +28,26 @@ export const EXPERIMENTAL_APP_ROUTES: RouteObject[] = [ // The video page is special since it combines new controls with the legacy view { path: 'video', - element: + Component: VideoPage } ], ErrorBoundary }, - /* Public routes */ - { index: true, element: }, - ...LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute) + { + /* Public routes */ + element: , + children: [ + ...LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute), + + /* Fallback route for invalid paths */ + { + path: '*', + Component: FallbackRoute + } + ] + } + ] } ]; diff --git a/src/apps/stable/AppLayout.tsx b/src/apps/stable/AppLayout.tsx index f3b186c8db..e4bd8b938f 100644 --- a/src/apps/stable/AppLayout.tsx +++ b/src/apps/stable/AppLayout.tsx @@ -2,11 +2,17 @@ import React from 'react'; import { Outlet } from 'react-router-dom'; import AppBody from 'components/AppBody'; +import CustomCss from 'components/CustomCss'; +import ThemeCss from 'components/ThemeCss'; export default function AppLayout() { return ( - - - + <> + + + + + + ); } diff --git a/src/apps/stable/features/search/api/fetchItemsByType.ts b/src/apps/stable/features/search/api/fetchItemsByType.ts new file mode 100644 index 0000000000..ec52347dbf --- /dev/null +++ b/src/apps/stable/features/search/api/fetchItemsByType.ts @@ -0,0 +1,23 @@ +import { Api } from '@jellyfin/sdk/lib/api'; +import { ItemsApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; +import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; +import { AxiosRequestConfig } from 'axios'; +import { QUERY_OPTIONS } from '../constants/queryOptions'; + +export const fetchItemsByType = async ( + api: Api, + userId?: string, + params?: ItemsApiGetItemsRequest, + options?: AxiosRequestConfig +) => { + const response = await getItemsApi(api).getItems( + { + ...QUERY_OPTIONS, + userId, + recursive: true, + ...params + }, + options + ); + return response.data; +}; diff --git a/src/apps/stable/features/search/api/useArtistsSearch.ts b/src/apps/stable/features/search/api/useArtistsSearch.ts new file mode 100644 index 0000000000..4be8c70b57 --- /dev/null +++ b/src/apps/stable/features/search/api/useArtistsSearch.ts @@ -0,0 +1,49 @@ +import { Api } from '@jellyfin/sdk'; +import { ArtistsApiGetArtistsRequest } from '@jellyfin/sdk/lib/generated-client/api/artists-api'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; +import { getArtistsApi } from '@jellyfin/sdk/lib/utils/api/artists-api'; +import { useQuery } from '@tanstack/react-query'; +import { AxiosRequestConfig } from 'axios'; +import { useApi } from 'hooks/useApi'; +import { QUERY_OPTIONS } from '../constants/queryOptions'; +import { isMusic } from '../utils/search'; + +const fetchArtists = async ( + api: Api, + userId: string, + params?: ArtistsApiGetArtistsRequest, + options?: AxiosRequestConfig +) => { + const response = await getArtistsApi(api).getArtists( + { + ...QUERY_OPTIONS, + userId, + ...params + }, + options + ); + return response.data; +}; + +export const useArtistsSearch = ( + parentId?: string, + collectionType?: CollectionType, + searchTerm?: string +) => { + const { api, user } = useApi(); + const userId = user?.Id; + + return useQuery({ + queryKey: ['Search', 'Artists', collectionType, parentId, searchTerm], + queryFn: ({ signal }) => fetchArtists( + api!, + userId!, + { + parentId, + searchTerm + }, + { signal } + ), + enabled: !!api && !!userId && (!collectionType || isMusic(collectionType)) + }); +}; diff --git a/src/apps/stable/features/search/api/useLiveTvSearch.ts b/src/apps/stable/features/search/api/useLiveTvSearch.ts new file mode 100644 index 0000000000..e4fef3386e --- /dev/null +++ b/src/apps/stable/features/search/api/useLiveTvSearch.ts @@ -0,0 +1,150 @@ +import { Api } from '@jellyfin/sdk'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; +import { useQuery } from '@tanstack/react-query'; +import { useApi } from 'hooks/useApi'; +import { addSection, isLivetv } from '../utils/search'; +import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; +import { LIVETV_CARD_OPTIONS } from '../constants/liveTvCardOptions'; +import { CardShape } from 'utils/card'; +import { Section } from '../types'; +import { fetchItemsByType } from './fetchItemsByType'; + +const fetchLiveTv = (api: Api, userId: string | undefined, searchTerm: string | undefined, signal: AbortSignal) => { + const sections: Section[] = []; + + // Movies row + const movies = fetchItemsByType( + api, + userId, + { + includeItemTypes: [ BaseItemKind.LiveTvProgram ], + isMovie: true, + searchTerm + }, + { signal } + ).then(moviesData => { + addSection(sections, 'Movies', moviesData.Items, { + ...LIVETV_CARD_OPTIONS, + shape: CardShape.PortraitOverflow + }); + }); + + // Episodes row + const episodes = fetchItemsByType( + api, + userId, + { + includeItemTypes: [ BaseItemKind.LiveTvProgram ], + isMovie: false, + isSeries: true, + isSports: false, + isKids: false, + isNews: false, + searchTerm + }, + { signal } + ).then(episodesData => { + addSection(sections, 'Episodes', episodesData.Items, { + ...LIVETV_CARD_OPTIONS + }); + }); + + // Sports row + const sports = fetchItemsByType( + api, + userId, + { + includeItemTypes: [ BaseItemKind.LiveTvProgram ], + isSports: true, + searchTerm + }, + { signal } + ).then(sportsData => { + addSection(sections, 'Sports', sportsData.Items, { + ...LIVETV_CARD_OPTIONS + }); + }); + + // Kids row + const kids = fetchItemsByType( + api, + userId, + { + includeItemTypes: [ BaseItemKind.LiveTvProgram ], + isKids: true, + searchTerm + }, + { signal } + ).then(kidsData => { + addSection(sections, 'Kids', kidsData.Items, { + ...LIVETV_CARD_OPTIONS + }); + }); + + // News row + const news = fetchItemsByType( + api, + userId, + { + includeItemTypes: [ BaseItemKind.LiveTvProgram ], + isNews: true, + searchTerm + }, + { signal } + ).then(newsData => { + addSection(sections, 'News', newsData.Items, { + ...LIVETV_CARD_OPTIONS + }); + }); + + // Programs row + const programs = fetchItemsByType( + api, + userId, + { + includeItemTypes: [ BaseItemKind.LiveTvProgram ], + isMovie: false, + isSeries: false, + isSports: false, + isKids: false, + isNews: false, + searchTerm + }, + { signal } + ).then(programsData => { + addSection(sections, 'Programs', programsData.Items, { + ...LIVETV_CARD_OPTIONS + }); + }); + + // Channels row + const channels = fetchItemsByType( + api, + userId, + { + includeItemTypes: [ BaseItemKind.TvChannel ], + searchTerm + }, + { signal } + ).then(channelsData => { + addSection(sections, 'Channels', channelsData.Items); + }); + + return Promise.all([ movies, episodes, sports, kids, news, programs, channels ]).then(() => sections); +}; + +export const useLiveTvSearch = ( + parentId?: string, + collectionType?: CollectionType, + searchTerm?: string +) => { + const { api, user } = useApi(); + const userId = user?.Id; + + return useQuery({ + queryKey: ['Search', 'LiveTv', collectionType, parentId, searchTerm], + queryFn: ({ signal }) => + fetchLiveTv(api!, userId!, searchTerm, signal), + enabled: !!api && !!userId && !!collectionType && !!isLivetv(collectionType) + }); +}; diff --git a/src/apps/stable/features/search/api/usePeopleSearch.ts b/src/apps/stable/features/search/api/usePeopleSearch.ts new file mode 100644 index 0000000000..3dd1a74a59 --- /dev/null +++ b/src/apps/stable/features/search/api/usePeopleSearch.ts @@ -0,0 +1,50 @@ +import { Api } from '@jellyfin/sdk'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; +import { useQuery } from '@tanstack/react-query'; +import { AxiosRequestConfig } from 'axios'; +import { useApi } from 'hooks/useApi'; +import { QUERY_OPTIONS } from '../constants/queryOptions'; +import { isMovies, isTVShows } from '../utils/search'; +import { PersonsApiGetPersonsRequest } from '@jellyfin/sdk/lib/generated-client/api/persons-api'; +import { getPersonsApi } from '@jellyfin/sdk/lib/utils/api/persons-api'; + +const fetchPeople = async ( + api: Api, + userId: string, + params?: PersonsApiGetPersonsRequest, + options?: AxiosRequestConfig +) => { + const response = await getPersonsApi(api).getPersons( + { + ...QUERY_OPTIONS, + userId, + ...params + }, + options + ); + return response.data; +}; + +export const usePeopleSearch = ( + parentId?: string, + collectionType?: CollectionType, + searchTerm?: string +) => { + const { api, user } = useApi(); + const userId = user?.Id; + + const isPeopleEnabled = (!collectionType || isMovies(collectionType) || isTVShows(collectionType)); + + return useQuery({ + queryKey: ['Search', 'People', collectionType, parentId, searchTerm], + queryFn: ({ signal }) => fetchPeople( + api!, + userId!, + { + searchTerm + }, + { signal } + ), + enabled: !!api && !!userId && isPeopleEnabled + }); +}; diff --git a/src/apps/stable/features/search/api/useProgramsSearch.ts b/src/apps/stable/features/search/api/useProgramsSearch.ts new file mode 100644 index 0000000000..23d91381b5 --- /dev/null +++ b/src/apps/stable/features/search/api/useProgramsSearch.ts @@ -0,0 +1,50 @@ +import { Api } from '@jellyfin/sdk'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; +import { useQuery } from '@tanstack/react-query'; +import { AxiosRequestConfig } from 'axios'; +import { useApi } from 'hooks/useApi'; +import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; +import { ItemsApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; +import { fetchItemsByType } from './fetchItemsByType'; + +const fetchPrograms = async ( + api: Api, + userId: string, + params?: ItemsApiGetItemsRequest, + options?: AxiosRequestConfig +) => { + const response = await fetchItemsByType( + api, + userId, + { + includeItemTypes: [BaseItemKind.LiveTvProgram], + ...params + }, + options + ); + + return response; +}; + +export const useProgramsSearch = ( + parentId?: string, + collectionType?: CollectionType, + searchTerm?: string +) => { + const { api, user } = useApi(); + const userId = user?.Id; + + return useQuery({ + queryKey: ['Search', 'Programs', collectionType, parentId, searchTerm], + queryFn: ({ signal }) => fetchPrograms( + api!, + userId!, + { + parentId, + searchTerm + }, + { signal } + ), + enabled: !!api && !!userId && !collectionType + }); +}; diff --git a/src/apps/stable/features/search/api/useSearchItems.ts b/src/apps/stable/features/search/api/useSearchItems.ts new file mode 100644 index 0000000000..b528290d87 --- /dev/null +++ b/src/apps/stable/features/search/api/useSearchItems.ts @@ -0,0 +1,98 @@ +import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; +import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; +import { useQuery } from '@tanstack/react-query'; +import { useApi } from '../../../../../hooks/useApi'; +import { addSection, getCardOptionsFromType, getItemTypesFromCollectionType, getTitleFromType, isLivetv, isMovies, isMusic, isTVShows, sortSections } from '../utils/search'; +import { useArtistsSearch } from './useArtistsSearch'; +import { usePeopleSearch } from './usePeopleSearch'; +import { useVideoSearch } from './useVideoSearch'; +import { Section } from '../types'; +import { useLiveTvSearch } from './useLiveTvSearch'; +import { fetchItemsByType } from './fetchItemsByType'; +import { useProgramsSearch } from './useProgramsSearch'; +import { LIVETV_CARD_OPTIONS } from '../constants/liveTvCardOptions'; + +export const useSearchItems = ( + parentId?: string, + collectionType?: CollectionType, + searchTerm?: string +) => { + const { data: artists, isPending: isArtistsPending } = useArtistsSearch(parentId, collectionType, searchTerm); + const { data: people, isPending: isPeoplePending } = usePeopleSearch(parentId, collectionType, searchTerm); + const { data: videos, isPending: isVideosPending } = useVideoSearch(parentId, collectionType, searchTerm); + const { data: programs, isPending: isProgramsPending } = useProgramsSearch(parentId, collectionType, searchTerm); + const { data: liveTvSections, isPending: isLiveTvPending } = useLiveTvSearch(parentId, collectionType, searchTerm); + const { api, user } = useApi(); + const userId = user?.Id; + + const isArtistsEnabled = !isArtistsPending || (collectionType && !isMusic(collectionType)); + const isPeopleEnabled = !isPeoplePending || (collectionType && !isMovies(collectionType) && !isTVShows(collectionType)); + const isVideosEnabled = !isVideosPending || collectionType; + const isProgramsEnabled = !isProgramsPending || collectionType; + const isLiveTvEnabled = !isLiveTvPending || !collectionType || !isLivetv(collectionType); + + return useQuery({ + queryKey: ['Search', 'Items', collectionType, parentId, searchTerm], + queryFn: async ({ signal }) => { + if (liveTvSections && collectionType && isLivetv(collectionType)) { + return sortSections(liveTvSections); + } + + const sections: Section[] = []; + + addSection(sections, 'Artists', artists?.Items, { + coverImage: true + }); + + addSection(sections, 'Programs', programs?.Items, { + ...LIVETV_CARD_OPTIONS + }); + + addSection(sections, 'People', people?.Items, { + coverImage: true + }); + + addSection(sections, 'HeaderVideos', videos?.Items, { + showParentTitle: true + }); + + const itemTypes: BaseItemKind[] = getItemTypesFromCollectionType(collectionType); + + const searchData = await fetchItemsByType( + api!, + userId, + { + includeItemTypes: itemTypes, + parentId, + searchTerm, + limit: 800 + }, + { signal } + ); + + if (searchData.Items) { + for (const itemType of itemTypes) { + const items: BaseItemDto[] = []; + for (const searchItem of searchData.Items) { + if (searchItem.Type === itemType) { + items.push(searchItem); + } + } + addSection(sections, getTitleFromType(itemType), items, getCardOptionsFromType(itemType)); + } + } + + return sortSections(sections); + }, + enabled: ( + !!api + && !!userId + && !!isArtistsEnabled + && !!isPeopleEnabled + && !!isVideosEnabled + && !!isLiveTvEnabled + && !!isProgramsEnabled + ) + }); +}; diff --git a/src/hooks/searchHook/useSearchSuggestions.ts b/src/apps/stable/features/search/api/useSearchSuggestions.ts similarity index 80% rename from src/hooks/searchHook/useSearchSuggestions.ts rename to src/apps/stable/features/search/api/useSearchSuggestions.ts index a9b0ce4767..af079fab11 100644 --- a/src/hooks/searchHook/useSearchSuggestions.ts +++ b/src/apps/stable/features/search/api/useSearchSuggestions.ts @@ -4,20 +4,17 @@ import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; import { useQuery } from '@tanstack/react-query'; -import { useApi } from '../useApi'; +import { useApi } from 'hooks/useApi'; const fetchGetItems = async ( - api?: Api, - userId?: string, + api: Api, + userId: string, parentId?: string, options?: AxiosRequestConfig ) => { - if (!api) throw new Error('No API instance available'); - if (!userId) throw new Error('No User ID provided'); - const response = await getItemsApi(api).getItems( { - userId: userId, + userId, sortBy: [ItemSortBy.IsFavoriteOrLiked, ItemSortBy.Random], includeItemTypes: [ BaseItemKind.Movie, @@ -28,7 +25,7 @@ const fetchGetItems = async ( recursive: true, imageTypeLimit: 0, enableImages: false, - parentId: parentId, + parentId, enableTotalRecordCount: false }, options @@ -43,7 +40,8 @@ export const useSearchSuggestions = (parentId?: string) => { return useQuery({ queryKey: ['SearchSuggestions', { parentId }], queryFn: ({ signal }) => - fetchGetItems(api, userId, parentId, { signal }), + fetchGetItems(api!, userId!, parentId, { signal }), + refetchOnWindowFocus: false, enabled: !!api && !!userId }); }; diff --git a/src/apps/stable/features/search/api/useVideoSearch.ts b/src/apps/stable/features/search/api/useVideoSearch.ts new file mode 100644 index 0000000000..06eaaf25e7 --- /dev/null +++ b/src/apps/stable/features/search/api/useVideoSearch.ts @@ -0,0 +1,57 @@ +import { Api } from '@jellyfin/sdk'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; +import { useQuery } from '@tanstack/react-query'; +import { AxiosRequestConfig } from 'axios'; +import { useApi } from 'hooks/useApi'; +import { QUERY_OPTIONS } from '../constants/queryOptions'; +import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; +import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type'; +import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; +import { ItemsApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; + +const fetchVideos = async ( + api: Api, + userId: string, + params?: ItemsApiGetItemsRequest, + options?: AxiosRequestConfig +) => { + const response = await getItemsApi(api).getItems( + { + ...QUERY_OPTIONS, + userId, + recursive: true, + mediaTypes: [MediaType.Video], + excludeItemTypes: [ + BaseItemKind.Movie, + BaseItemKind.Episode, + BaseItemKind.TvChannel + ], + ...params + }, + options + ); + return response.data; +}; + +export const useVideoSearch = ( + parentId?: string, + collectionType?: CollectionType, + searchTerm?: string +) => { + const { api, user } = useApi(); + const userId = user?.Id; + + return useQuery({ + queryKey: ['Search', 'Video', collectionType, parentId, searchTerm], + queryFn: ({ signal }) => fetchVideos( + api!, + userId!, + { + parentId, + searchTerm + }, + { signal } + ), + enabled: !!api && !!userId && !collectionType + }); +}; diff --git a/src/components/search/SearchFields.tsx b/src/apps/stable/features/search/components/SearchFields.tsx similarity index 90% rename from src/components/search/SearchFields.tsx rename to src/apps/stable/features/search/components/SearchFields.tsx index b1cea800c5..705144aff5 100644 --- a/src/components/search/SearchFields.tsx +++ b/src/apps/stable/features/search/components/SearchFields.tsx @@ -1,11 +1,11 @@ import React, { type ChangeEvent, type FC, useCallback, useRef } from 'react'; -import AlphaPicker from '../alphaPicker/AlphaPickerComponent'; +import AlphaPicker from 'components/alphaPicker/AlphaPickerComponent'; import Input from 'elements/emby-input/Input'; -import globalize from '../../lib/globalize'; -import layoutManager from '../layoutManager'; -import browser from '../../scripts/browser'; +import globalize from 'lib/globalize'; +import layoutManager from 'components/layoutManager'; +import browser from 'scripts/browser'; import 'material-design-icons-iconfont'; -import '../../styles/flexstyles.scss'; +import 'styles/flexstyles.scss'; import './searchfields.scss'; interface SearchFieldsProps { diff --git a/src/components/search/SearchResults.tsx b/src/apps/stable/features/search/components/SearchResults.tsx similarity index 60% rename from src/components/search/SearchResults.tsx rename to src/apps/stable/features/search/components/SearchResults.tsx index 3c7dec3376..47ce8f030c 100644 --- a/src/components/search/SearchResults.tsx +++ b/src/apps/stable/features/search/components/SearchResults.tsx @@ -1,13 +1,16 @@ import React, { type FC } from 'react'; -import { Section, useSearchItems } from 'hooks/searchHook'; -import globalize from '../../lib/globalize'; -import Loading from '../loading/LoadingComponent'; +import { useSearchItems } from '../api/useSearchItems'; +import globalize from 'lib/globalize'; +import Loading from 'components/loading/LoadingComponent'; import SearchResultsRow from './SearchResultsRow'; import { CardShape } from 'utils/card'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; +import { Section } from '../types'; +import { Link } from 'react-router-dom'; interface SearchResultsProps { parentId?: string; - collectionType?: string; + collectionType?: CollectionType; query?: string; } @@ -19,14 +22,22 @@ const SearchResults: FC = ({ collectionType, query }) => { - const { isLoading, data } = useSearchItems(parentId, collectionType, query); + const { data, isPending } = useSearchItems(parentId, collectionType, query?.trim()); - if (isLoading) return ; + if (isPending) return ; if (!data?.length) { return (
{globalize.translate('SearchResultsEmpty', query)} + {collectionType && ( +
+ {globalize.translate('RetryWithGlobalSearch')} +
+ )}
); } @@ -51,7 +62,7 @@ const SearchResults: FC = ({ }; return ( -
+
{data.map((section, index) => renderSection(section, index))}
); diff --git a/src/components/search/SearchResultsRow.tsx b/src/apps/stable/features/search/components/SearchResultsRow.tsx similarity index 89% rename from src/components/search/SearchResultsRow.tsx rename to src/apps/stable/features/search/components/SearchResultsRow.tsx index 4fad2a0966..be74c233c9 100644 --- a/src/components/search/SearchResultsRow.tsx +++ b/src/apps/stable/features/search/components/SearchResultsRow.tsx @@ -1,10 +1,10 @@ import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client'; import React, { type FC, useEffect, useRef } from 'react'; -import cardBuilder from '../cardbuilder/cardBuilder'; +import cardBuilder from 'components/cardbuilder/cardBuilder'; import type { CardOptions } from 'types/cardOptions'; -import '../../elements/emby-scroller/emby-scroller'; -import '../../elements/emby-itemscontainer/emby-itemscontainer'; +import 'elements/emby-scroller/emby-scroller'; +import 'elements/emby-itemscontainer/emby-itemscontainer'; // There seems to be some compatibility issues here between // React and our legacy web components, so we need to inject diff --git a/src/components/search/SearchSuggestions.tsx b/src/apps/stable/features/search/components/SearchSuggestions.tsx similarity index 78% rename from src/components/search/SearchSuggestions.tsx rename to src/apps/stable/features/search/components/SearchSuggestions.tsx index 809ad29444..a63514d157 100644 --- a/src/components/search/SearchSuggestions.tsx +++ b/src/apps/stable/features/search/components/SearchSuggestions.tsx @@ -1,21 +1,21 @@ import React, { FunctionComponent } from 'react'; import Loading from 'components/loading/LoadingComponent'; -import { appRouter } from '../router/appRouter'; -import { useSearchSuggestions } from 'hooks/searchHook/useSearchSuggestions'; +import { appRouter } from 'components/router/appRouter'; +import { useSearchSuggestions } from '../api/useSearchSuggestions'; import globalize from 'lib/globalize'; -import LinkButton from '../../elements/emby-button/LinkButton'; +import LinkButton from 'elements/emby-button/LinkButton'; -import '../../elements/emby-button/emby-button'; +import 'elements/emby-button/emby-button'; type SearchSuggestionsProps = { parentId?: string | null; }; const SearchSuggestions: FunctionComponent = ({ parentId }) => { - const { isLoading, data: suggestions } = useSearchSuggestions(parentId || undefined); + const { data: suggestions, isPending } = useSearchSuggestions(parentId || undefined); - if (isLoading) return ; + if (isPending) return ; return (
+ collectionType === CollectionType.Movies; + +export const isTVShows = (collectionType: string) => + collectionType === CollectionType.Tvshows; + +export const isMusic = (collectionType: string) => + collectionType === CollectionType.Music; + +export const isLivetv = (collectionType: string) => + collectionType === CollectionType.Livetv; + +export function addSection( + sections: Section[], + title: string, + items: BaseItemDto[] | null | undefined, + cardOptions?: CardOptions +) { + if (items && items?.length > 0) { + sections.push({ title, items, cardOptions }); + } +} + +export function sortSections(sections: Section[]) { + return sections.sort((a, b) => { + const indexA = SEARCH_SECTIONS_SORT_ORDER.indexOf(a.title); + const indexB = SEARCH_SECTIONS_SORT_ORDER.indexOf(b.title); + + if (indexA > indexB) { + return 1; + } else if (indexA < indexB) { + return -1; + } else { + return 0; + } + }); +} + +export function getCardOptionsFromType(type: BaseItemKind) { + switch (type) { + case BaseItemKind.Movie: + case BaseItemKind.Series: + case BaseItemKind.MusicAlbum: + return { + showYear: true + }; + case BaseItemKind.Episode: + return { + coverImage: true, + showParentTitle: true + }; + case BaseItemKind.MusicArtist: + return { + coverImage: true + }; + case BaseItemKind.Audio: + return { + showParentTitle: true, + shape: CardShape.SquareOverflow + }; + case BaseItemKind.LiveTvProgram: + return LIVETV_CARD_OPTIONS; + default: + return {}; + } +} + +export function getTitleFromType(type: BaseItemKind) { + switch (type) { + case BaseItemKind.Movie: + return 'Movies'; + case BaseItemKind.Series: + return 'Shows'; + case BaseItemKind.Episode: + return 'Episodes'; + case BaseItemKind.Playlist: + return 'Playlists'; + case BaseItemKind.MusicAlbum: + return 'Albums'; + case BaseItemKind.Audio: + return 'Songs'; + case BaseItemKind.LiveTvProgram: + return 'Programs'; + case BaseItemKind.TvChannel: + return 'Channels'; + case BaseItemKind.PhotoAlbum: + return 'HeaderPhotoAlbums'; + case BaseItemKind.Photo: + return 'Photos'; + case BaseItemKind.AudioBook: + return 'HeaderAudioBooks'; + case BaseItemKind.Book: + return 'Books'; + case BaseItemKind.BoxSet: + return 'Collections'; + default: + return ''; + } +} + +export function getItemTypesFromCollectionType(collectionType: CollectionType | undefined) { + switch (collectionType) { + case CollectionType.Movies: + return [ BaseItemKind.Movie ]; + case CollectionType.Tvshows: + return [ + BaseItemKind.Series, + BaseItemKind.Episode + ]; + case CollectionType.Music: + return [ + BaseItemKind.Playlist, + BaseItemKind.MusicAlbum, + BaseItemKind.Audio + ]; + default: + return [ + BaseItemKind.Movie, + BaseItemKind.Series, + BaseItemKind.Episode, + BaseItemKind.Playlist, + BaseItemKind.MusicAlbum, + BaseItemKind.Audio, + BaseItemKind.TvChannel, + BaseItemKind.PhotoAlbum, + BaseItemKind.Photo, + BaseItemKind.AudioBook, + BaseItemKind.Book, + BaseItemKind.BoxSet + ]; + } +} diff --git a/src/apps/stable/routes/asyncRoutes/user.ts b/src/apps/stable/routes/asyncRoutes/user.ts index 153e310b35..1074053e61 100644 --- a/src/apps/stable/routes/asyncRoutes/user.ts +++ b/src/apps/stable/routes/asyncRoutes/user.ts @@ -2,6 +2,6 @@ import { AsyncRoute } from '../../../../components/router/AsyncRoute'; export const ASYNC_USER_ROUTES: AsyncRoute[] = [ { path: 'quickconnect', page: 'quickConnect' }, - { path: 'search.html', page: 'search' }, - { path: 'userprofile.html', page: 'user/userprofile' } + { path: 'search', page: 'search' }, + { path: 'userprofile', page: 'user/userprofile' } ]; diff --git a/src/apps/stable/routes/legacyRoutes/public.ts b/src/apps/stable/routes/legacyRoutes/public.ts index 1fec40eaad..89fc179354 100644 --- a/src/apps/stable/routes/legacyRoutes/public.ts +++ b/src/apps/stable/routes/legacyRoutes/public.ts @@ -2,77 +2,77 @@ import { LegacyRoute } from '../../../../components/router/LegacyRoute'; export const LEGACY_PUBLIC_ROUTES: LegacyRoute[] = [ { - path: 'addserver.html', + path: 'addserver', pageProps: { controller: 'session/addServer/index', view: 'session/addServer/index.html' } }, { - path: 'selectserver.html', + path: 'selectserver', pageProps: { controller: 'session/selectServer/index', view: 'session/selectServer/index.html' } }, { - path: 'login.html', + path: 'login', pageProps: { controller: 'session/login/index', view: 'session/login/index.html' } }, { - path: 'forgotpassword.html', + path: 'forgotpassword', pageProps: { controller: 'session/forgotPassword/index', view: 'session/forgotPassword/index.html' } }, { - path: 'forgotpasswordpin.html', + path: 'forgotpasswordpin', pageProps: { controller: 'session/resetPassword/index', view: 'session/resetPassword/index.html' } }, { - path: 'wizardremoteaccess.html', + path: 'wizardremoteaccess', pageProps: { controller: 'wizard/remote/index', view: 'wizard/remote/index.html' } }, { - path: 'wizardfinish.html', + path: 'wizardfinish', pageProps: { controller: 'wizard/finish/index', view: 'wizard/finish/index.html' } }, { - path: 'wizardlibrary.html', + path: 'wizardlibrary', pageProps: { controller: 'wizard/library', view: 'wizard/library.html' } }, { - path: 'wizardsettings.html', + path: 'wizardsettings', pageProps: { controller: 'wizard/settings/index', view: 'wizard/settings/index.html' } }, { - path: 'wizardstart.html', + path: 'wizardstart', pageProps: { controller: 'wizard/start/index', view: 'wizard/start/index.html' } }, { - path: 'wizarduser.html', + path: 'wizarduser', pageProps: { controller: 'wizard/user/index', view: 'wizard/user/index.html' diff --git a/src/apps/stable/routes/legacyRoutes/user.ts b/src/apps/stable/routes/legacyRoutes/user.ts index 19b87c7cd8..9abbefefee 100644 --- a/src/apps/stable/routes/legacyRoutes/user.ts +++ b/src/apps/stable/routes/legacyRoutes/user.ts @@ -8,13 +8,13 @@ export const LEGACY_USER_ROUTES: LegacyRoute[] = [ view: 'itemDetails/index.html' } }, { - path: 'list.html', + path: 'list', pageProps: { controller: 'list', view: 'list.html' } }, { - path: 'livetv.html', + path: 'livetv', pageProps: { controller: 'livetv/livetvsuggested', view: 'livetv.html' @@ -26,49 +26,49 @@ export const LEGACY_USER_ROUTES: LegacyRoute[] = [ view: 'lyrics.html' } }, { - path: 'music.html', + path: 'music', pageProps: { controller: 'music/musicrecommended', view: 'music/music.html' } }, { - path: 'mypreferencesmenu.html', + path: 'mypreferencesmenu', pageProps: { controller: 'user/menu/index', view: 'user/menu/index.html' } }, { - path: 'mypreferencescontrols.html', + path: 'mypreferencescontrols', pageProps: { controller: 'user/controls/index', view: 'user/controls/index.html' } }, { - path: 'mypreferencesdisplay.html', + path: 'mypreferencesdisplay', pageProps: { controller: 'user/display/index', view: 'user/display/index.html' } }, { - path: 'mypreferenceshome.html', + path: 'mypreferenceshome', pageProps: { controller: 'user/home/index', view: 'user/home/index.html' } }, { - path: 'mypreferencesplayback.html', + path: 'mypreferencesplayback', pageProps: { controller: 'user/playback/index', view: 'user/playback/index.html' } }, { - path: 'mypreferencessubtitles.html', + path: 'mypreferencessubtitles', pageProps: { controller: 'user/subtitles/index', view: 'user/subtitles/index.html' } }, { - path: 'tv.html', + path: 'tv', pageProps: { controller: 'shows/tvrecommended', view: 'shows/tvrecommended.html' @@ -93,13 +93,13 @@ export const LEGACY_USER_ROUTES: LegacyRoute[] = [ isThemeMediaSupported: true } }, { - path: 'home.html', + path: 'home', pageProps: { controller: 'home', view: 'home.html' } }, { - path: 'movies.html', + path: 'movies', pageProps: { controller: 'movies/moviesrecommended', view: 'movies/movies.html' diff --git a/src/apps/stable/routes/quickConnect/index.tsx b/src/apps/stable/routes/quickConnect/index.tsx index ecadec2312..a76488d21f 100644 --- a/src/apps/stable/routes/quickConnect/index.tsx +++ b/src/apps/stable/routes/quickConnect/index.tsx @@ -84,7 +84,7 @@ const QuickConnectPage: FC = () => {

{globalize.translate('QuickConnectAuthorizeSuccess')}

- + {globalize.translate('GoHome')}
diff --git a/src/apps/stable/routes/routes.tsx b/src/apps/stable/routes/routes.tsx index 787d89ac7f..230a41953c 100644 --- a/src/apps/stable/routes/routes.tsx +++ b/src/apps/stable/routes/routes.tsx @@ -5,6 +5,7 @@ import ConnectionRequired from 'components/ConnectionRequired'; import { toAsyncPageRoute } from 'components/router/AsyncRoute'; import { toViewManagerPageRoute } from 'components/router/LegacyRoute'; import ErrorBoundary from 'components/router/ErrorBoundary'; +import FallbackRoute from 'components/router/FallbackRoute'; import AppLayout from '../AppLayout'; @@ -16,9 +17,11 @@ export const STABLE_APP_ROUTES: RouteObject[] = [ path: '/*', Component: AppLayout, children: [ + { index: true, element: }, + { /* User routes */ - element: , + Component: ConnectionRequired, children: [ ...ASYNC_USER_ROUTES.map(toAsyncPageRoute), ...LEGACY_USER_ROUTES.map(toViewManagerPageRoute) @@ -26,9 +29,19 @@ export const STABLE_APP_ROUTES: RouteObject[] = [ ErrorBoundary }, - /* Public routes */ - { index: true, element: }, - ...LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute) + { + /* Public routes */ + element: , + children: [ + ...LEGACY_PUBLIC_ROUTES.map(toViewManagerPageRoute), + /* Fallback route for invalid paths */ + { + path: '*', + Component: FallbackRoute + } + ] + } + ] } ]; diff --git a/src/apps/stable/routes/search.tsx b/src/apps/stable/routes/search.tsx index 290ea60406..f06ce927d8 100644 --- a/src/apps/stable/routes/search.tsx +++ b/src/apps/stable/routes/search.tsx @@ -4,9 +4,10 @@ import { useDebounceValue } from 'usehooks-ts'; import { usePrevious } from 'hooks/usePrevious'; import globalize from 'lib/globalize'; import Page from 'components/Page'; -import SearchFields from 'components/search/SearchFields'; -import SearchSuggestions from 'components/search/SearchSuggestions'; -import SearchResults from 'components/search/SearchResults'; +import SearchFields from 'apps/stable/features/search/components/SearchFields'; +import SearchSuggestions from 'apps/stable/features/search/components/SearchSuggestions'; +import SearchResults from 'apps/stable/features/search/components/SearchResults'; +import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; const COLLECTION_TYPE_PARAM = 'collectionType'; const PARENT_ID_PARAM = 'parentId'; @@ -15,7 +16,7 @@ const QUERY_PARAM = 'query'; const Search: FC = () => { const [searchParams, setSearchParams] = useSearchParams(); const parentIdQuery = searchParams.get(PARENT_ID_PARAM) || undefined; - const collectionTypeQuery = searchParams.get(COLLECTION_TYPE_PARAM) || undefined; + const collectionTypeQuery = (searchParams.get(COLLECTION_TYPE_PARAM) || undefined) as CollectionType | undefined; const urlQuery = searchParams.get(QUERY_PARAM) || ''; const [query, setQuery] = useState(urlQuery); const prevQuery = usePrevious(query, ''); @@ -50,7 +51,7 @@ const Search: FC = () => { className='mainAnimatedPage libraryPage allLibraryPage noSecondaryNavPage' > - {!query ? ( + {!debouncedQuery ? ( diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx index 08efb3dd2b..bc3c31ced1 100644 --- a/src/components/ConfirmDialog.tsx +++ b/src/components/ConfirmDialog.tsx @@ -27,7 +27,7 @@ const ConfirmDialog: FC = ({ onConfirm, ...dialogProps }) => ( - + {title} diff --git a/src/components/ConnectionRequired.tsx b/src/components/ConnectionRequired.tsx index 198149ad3c..8106135e65 100644 --- a/src/components/ConnectionRequired.tsx +++ b/src/components/ConnectionRequired.tsx @@ -9,10 +9,10 @@ import globalize from '../lib/globalize'; import { ConnectionState } from '../utils/jellyfin-apiclient/ConnectionState'; enum BounceRoutes { - Home = '/home.html', - Login = '/login.html', - SelectServer = '/selectserver.html', - StartWizard = '/wizardstart.html' + Home = '/home', + Login = '/login', + SelectServer = '/selectserver', + StartWizard = '/wizardstart' } type ConnectionRequiredProps = { diff --git a/src/components/CustomCss.tsx b/src/components/CustomCss.tsx new file mode 100644 index 0000000000..48c684724d --- /dev/null +++ b/src/components/CustomCss.tsx @@ -0,0 +1,26 @@ +import React, { type FC } from 'react'; + +import { useUserSettings } from 'hooks/useUserSettings'; +import { useBrandingOptions } from 'apps/dashboard/features/branding/api/useBrandingOptions'; + +const CustomCss: FC = () => { + const { data: brandingOptions } = useBrandingOptions(); + const { customCss: userCustomCss, disableCustomCss } = useUserSettings(); + + return ( + <> + {!disableCustomCss && brandingOptions?.CustomCss && ( + + )} + {userCustomCss && ( + + )} + + ); +}; + +export default CustomCss; diff --git a/src/components/ServerConnections.js b/src/components/ServerConnections.js index 9920b9baae..38692998f2 100644 --- a/src/components/ServerConnections.js +++ b/src/components/ServerConnections.js @@ -1,5 +1,5 @@ // NOTE: This is used for jsdoc return type -// eslint-disable-next-line no-unused-vars +// eslint-disable-next-line @typescript-eslint/no-unused-vars import { Api } from '@jellyfin/sdk'; import { MINIMUM_VERSION } from '@jellyfin/sdk/lib/versions'; import { ConnectionManager, Credentials, ApiClient } from 'jellyfin-apiclient'; @@ -18,7 +18,6 @@ const normalizeImageOptions = options => { }; const getMaxBandwidth = () => { - /* eslint-disable compat/compat */ if (navigator.connection) { let max = navigator.connection.downlinkMax; if (max && max > 0 && max < Number.POSITIVE_INFINITY) { @@ -28,7 +27,6 @@ const getMaxBandwidth = () => { return parseInt(max, 10); } } - /* eslint-enable compat/compat */ return null; }; diff --git a/src/components/SimpleAlert.tsx b/src/components/SimpleAlert.tsx new file mode 100644 index 0000000000..5322662d7d --- /dev/null +++ b/src/components/SimpleAlert.tsx @@ -0,0 +1,38 @@ +import Button from '@mui/material/Button'; +import Dialog, { type DialogProps } from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import DialogTitle from '@mui/material/DialogTitle'; +import globalize from 'lib/globalize'; +import React from 'react'; + +interface SimpleAlertDialog extends DialogProps { + title?: string; + text: string; + onClose: () => void +}; + +const SimpleAlert = ({ open, title, text, onClose }: SimpleAlertDialog) => { + return ( + + {title && ( + + {title} + + )} + + + {text} + + + + + + + ); +}; + +export default SimpleAlert; diff --git a/src/components/ThemeCss.tsx b/src/components/ThemeCss.tsx new file mode 100644 index 0000000000..9dabeee15a --- /dev/null +++ b/src/components/ThemeCss.tsx @@ -0,0 +1,34 @@ +import React, { type FC, useEffect, useState } from 'react'; + +import { useUserTheme } from 'hooks/useUserTheme'; +import { getDefaultTheme } from 'scripts/settings/webSettings'; + +interface ThemeCssProps { + dashboard?: boolean +} + +const getThemeUrl = (id: string) => `themes/${id}/theme.css`;; + +const DEFAULT_THEME_URL = getThemeUrl(getDefaultTheme().id); + +const ThemeCss: FC = ({ + dashboard = false +}) => { + const { theme, dashboardTheme } = useUserTheme(); + const [ themeUrl, setThemeUrl ] = useState(DEFAULT_THEME_URL); + + useEffect(() => { + const id = dashboard ? dashboardTheme : theme; + if (id) setThemeUrl(getThemeUrl(id)); + }, [dashboard, dashboardTheme, theme]); + + return ( + + ); +}; + +export default ThemeCss; diff --git a/src/components/UserAvatar.tsx b/src/components/UserAvatar.tsx index 3a2790e835..be4e4c6729 100644 --- a/src/components/UserAvatar.tsx +++ b/src/components/UserAvatar.tsx @@ -22,7 +22,9 @@ const UserAvatar: FC = ({ user }) => { undefined } sx={{ - bgcolor: theme.palette.primary.dark, + bgcolor: api && user.Id && user.PrimaryImageTag ? + theme.palette.background.paper : + theme.palette.primary.dark, color: 'inherit' }} /> diff --git a/src/components/apphost.js b/src/components/apphost.js index 984c3a77bf..7d49088564 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -452,7 +452,7 @@ let isHidden = false; let hidden; let visibilityChange; -if (typeof document.hidden !== 'undefined') { /* eslint-disable-line compat/compat */ +if (typeof document.hidden !== 'undefined') { hidden = 'hidden'; visibilityChange = 'visibilitychange'; } else if (typeof document.webkitHidden !== 'undefined') { @@ -461,7 +461,6 @@ if (typeof document.hidden !== 'undefined') { /* eslint-disable-line compat/comp } document.addEventListener(visibilityChange, function () { - /* eslint-disable-next-line compat/compat */ if (document[hidden]) { onAppHidden(); } else { diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 54e9d33a8e..1f7da16557 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -484,7 +484,7 @@ function getAirTimeText(item, showAirDateTime, showAirEndTime) { airTimeText += ' - ' + datetime.getDisplayTime(date); } } catch (e) { - console.error('error parsing date: ' + item.StartDate); + console.error('error parsing date: ' + item.StartDate, e); } } @@ -617,7 +617,7 @@ function getCardFooterText(item, apiClient, options, footerClass, progressHtml, datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' } )); - } catch (err) { + } catch { lines.push(''); } } else { diff --git a/src/components/cardbuilder/cardBuilderUtils.test.ts b/src/components/cardbuilder/cardBuilderUtils.test.ts index 7aa749af12..af5d189f36 100644 --- a/src/components/cardbuilder/cardBuilderUtils.test.ts +++ b/src/components/cardbuilder/cardBuilderUtils.test.ts @@ -678,6 +678,7 @@ describe('getDefaultBackgroundClass', () => { }); test('randomization string provided', () => { + // eslint-disable-next-line sonarjs/pseudo-random const generateRandomString = (stringLength: number): string => (Math.random() + 1).toString(36).substring(stringLength); for (let i = 0; i < 100; i++) { diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index e3e33be2f3..247dbcff05 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -137,7 +137,7 @@ function loadSection(elem, userId, topParentId, section, isSingleSection) { html += '
'; if (!layoutManager.tv && options.Limit && result.Items.length >= options.Limit) { - html += ''; + html += ''; html += '

'; html += globalize.translate(section.name); html += '

'; diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index 3eacd7db82..408ef06de6 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -14,6 +14,7 @@ function merge(resultItems, queryItems, delimiter) { if (!queryItems) { return resultItems; } + // eslint-disable-next-line sonarjs/no-alphabetical-sort return union(resultItems, queryItems.split(delimiter)).sort(); } diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index a56ae355f4..0b72fc023d 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -358,7 +358,7 @@ function Guide(options) { if ((typeof date).toString().toLowerCase() === 'string') { try { date = datetime.parseISO8601Date(date, { toLocal: true }); - } catch (err) { + } catch { return date; } } @@ -392,7 +392,7 @@ function Guide(options) { try { program.StartDateLocal = datetime.parseISO8601Date(program.StartDate, { toLocal: true }); } catch (err) { - console.error('error parsing timestamp for start date'); + console.error('error parsing timestamp for start date', err); } } @@ -400,7 +400,7 @@ function Guide(options) { try { program.EndDateLocal = datetime.parseISO8601Date(program.EndDate, { toLocal: true }); } catch (err) { - console.error('error parsing timestamp for end date'); + console.error('error parsing timestamp for end date', err); } } diff --git a/src/components/imageUploader/imageUploader.js b/src/components/imageUploader/imageUploader.js index ff07de1553..cc211fde9b 100644 --- a/src/components/imageUploader/imageUploader.js +++ b/src/components/imageUploader/imageUploader.js @@ -77,6 +77,7 @@ function setFiles(page, files) { reader.readAsDataURL(file); } +// eslint-disable-next-line sonarjs/no-invariant-returns function onSubmit(e) { const file = currentFile; diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js index 561c968623..c41b0d59ff 100644 --- a/src/components/images/imageLoader.js +++ b/src/components/images/imageLoader.js @@ -2,7 +2,7 @@ import Worker from './blurhash.worker.ts'; // eslint-disable-line import/default import * as lazyLoader from '../lazyLoader/lazyLoaderIntersectionObserver'; import * as userSettings from '../../scripts/settings/userSettings'; import './style.scss'; -// eslint-disable-next-line compat/compat + const worker = new Worker(); const targetDic = {}; worker.addEventListener( diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 02f7138af4..adba9ab0ed 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -562,7 +562,7 @@ function executeCommand(item, id, options) { navigator.share({ title: item.Name, text: item.Overview, - url: `${apiClient.serverAddress()}/web/index.html${appRouter.getRouteUrl(item)}` + url: `${apiClient.serverAddress()}/web/${appRouter.getRouteUrl(item)}` }); break; case 'album': diff --git a/src/components/listview/List/Lists.tsx b/src/components/listview/List/Lists.tsx index 1215851cc5..3a45be39c1 100644 --- a/src/components/listview/List/Lists.tsx +++ b/src/components/listview/List/Lists.tsx @@ -25,7 +25,6 @@ const Lists: FC = ({ items = [], listOptions = {} }) => { const renderListItem = (item: ItemDto, index: number) => { return ( { + const location = useLocation(); + + // Check if the requested path should be redirected + const to = useMemo(() => { + const _to = { + search: location.search, + hash: location.hash + }; + + // If a path ends in ".html", redirect to the path with it removed + if (location.pathname.endsWith('.html')) { + return { ..._to, pathname: location.pathname.slice(0, -5) }; + } + }, [ location ]); + + if (to) { + console.warn('[FallbackRoute] You are using a deprecated URL format. This will stop working in a future Jellyfin update.'); + + return ( + + ); + } + + return ( + +
+

{globalize.translate('HeaderPageNotFound')}

+

{globalize.translate('PageNotFound')}

+ + {globalize.translate('GoHome')} + +
+
+ ); +}; + +export default FallbackRoute; diff --git a/src/components/router/appRouter.js b/src/components/router/appRouter.js index a56a7209ac..29f3cf4f47 100644 --- a/src/components/router/appRouter.js +++ b/src/components/router/appRouter.js @@ -13,21 +13,21 @@ import { toApi } from 'utils/jellyfin-apiclient/compat'; import { history } from 'RootAppRouter'; /** Pages of "no return" (when "Go back" should behave differently, probably quitting the application). */ -const START_PAGE_PATHS = ['/home.html', '/login.html', '/selectserver.html']; +const START_PAGE_PATHS = ['/home', '/login', '/selectserver']; /** Pages that do not require a user to be logged in to view. */ const PUBLIC_PATHS = [ - '/addserver.html', - '/selectserver.html', - '/login.html', - '/forgotpassword.html', - '/forgotpasswordpin.html', - '/wizardremoteaccess.html', - '/wizardfinish.html', - '/wizardlibrary.html', - '/wizardsettings.html', - '/wizardstart.html', - '/wizarduser.html' + '/addserver', + '/selectserver', + '/login', + '/forgotpassword', + '/forgotpasswordpin', + '/wizardremoteaccess', + '/wizardfinish', + '/wizardlibrary', + '/wizardsettings', + '/wizardstart', + '/wizarduser' ]; class AppRouter { @@ -89,7 +89,7 @@ class AppRouter { path = path.replace(this.baseUrl(), ''); // can't use this with home right now due to the back menu - if (history.location.pathname === path && path !== '/home.html') { + if (history.location.pathname === path && path !== '/home') { loading.hide(); return Promise.resolve(); } @@ -249,11 +249,11 @@ class AppRouter { const serverId = item.ServerId || options.serverId; if (item === 'settings') { - return '#/mypreferencesmenu.html'; + return '#/mypreferencesmenu'; } if (item === 'wizard') { - return '#/wizardstart.html'; + return '#/wizardstart'; } if (item === 'manageserver') { @@ -261,15 +261,15 @@ class AppRouter { } if (item === 'recordedtv') { - return '#/livetv.html?tab=3&serverId=' + options.serverId; + return '#/livetv?tab=3&serverId=' + options.serverId; } if (item === 'nextup') { - return '#/list.html?type=nextup&serverId=' + options.serverId; + return '#/list?type=nextup&serverId=' + options.serverId; } if (item === 'list') { - let urlForList = '#/list.html?serverId=' + options.serverId + '&type=' + options.itemTypes; + let urlForList = '#/list?serverId=' + options.serverId + '&type=' + options.itemTypes; if (options.isFavorite) { urlForList += '&IsFavorite=true'; @@ -304,49 +304,49 @@ class AppRouter { if (item === 'livetv') { if (options.section === 'programs') { - return '#/livetv.html?tab=0&serverId=' + options.serverId; + return '#/livetv?tab=0&serverId=' + options.serverId; } if (options.section === 'guide') { - return '#/livetv.html?tab=1&serverId=' + options.serverId; + return '#/livetv?tab=1&serverId=' + options.serverId; } if (options.section === 'movies') { - return '#/list.html?type=Programs&IsMovie=true&serverId=' + options.serverId; + return '#/list?type=Programs&IsMovie=true&serverId=' + options.serverId; } if (options.section === 'shows') { - return '#/list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=' + options.serverId; + return '#/list?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=' + options.serverId; } if (options.section === 'sports') { - return '#/list.html?type=Programs&IsSports=true&serverId=' + options.serverId; + return '#/list?type=Programs&IsSports=true&serverId=' + options.serverId; } if (options.section === 'kids') { - return '#/list.html?type=Programs&IsKids=true&serverId=' + options.serverId; + return '#/list?type=Programs&IsKids=true&serverId=' + options.serverId; } if (options.section === 'news') { - return '#/list.html?type=Programs&IsNews=true&serverId=' + options.serverId; + return '#/list?type=Programs&IsNews=true&serverId=' + options.serverId; } if (options.section === 'onnow') { - return '#/list.html?type=Programs&IsAiring=true&serverId=' + options.serverId; + return '#/list?type=Programs&IsAiring=true&serverId=' + options.serverId; } if (options.section === 'channels') { - return '#/livetv.html?tab=2&serverId=' + options.serverId; + return '#/livetv?tab=2&serverId=' + options.serverId; } if (options.section === 'dvrschedule') { - return '#/livetv.html?tab=4&serverId=' + options.serverId; + return '#/livetv?tab=4&serverId=' + options.serverId; } if (options.section === 'seriesrecording') { - return '#/livetv.html?tab=5&serverId=' + options.serverId; + return '#/livetv?tab=5&serverId=' + options.serverId; } - return '#/livetv.html?serverId=' + options.serverId; + return '#/livetv?serverId=' + options.serverId; } if (itemType == 'SeriesTimer') { @@ -354,11 +354,11 @@ class AppRouter { } if (item.CollectionType == CollectionType.Livetv) { - return `#/livetv.html?collectionType=${item.CollectionType}`; + return `#/livetv?collectionType=${item.CollectionType}`; } if (item.Type === 'Genre') { - url = '#/list.html?genreId=' + item.Id + '&serverId=' + serverId; + url = '#/list?genreId=' + item.Id + '&serverId=' + serverId; if (context === 'livetv') { url += '&type=Programs'; @@ -372,7 +372,7 @@ class AppRouter { } if (item.Type === 'MusicGenre') { - url = '#/list.html?musicGenreId=' + item.Id + '&serverId=' + serverId; + url = '#/list?musicGenreId=' + item.Id + '&serverId=' + serverId; if (options.parentId) { url += '&parentId=' + options.parentId; @@ -382,7 +382,7 @@ class AppRouter { } if (item.Type === 'Studio') { - url = '#/list.html?studioId=' + item.Id + '&serverId=' + serverId; + url = '#/list?studioId=' + item.Id + '&serverId=' + serverId; if (options.parentId) { url += '&parentId=' + options.parentId; @@ -392,7 +392,7 @@ class AppRouter { } if (item === 'tag') { - url = `#/list.html?type=tag&tag=${encodeURIComponent(options.tag)}&serverId=${serverId}`; + url = `#/list?type=tag&tag=${encodeURIComponent(options.tag)}&serverId=${serverId}`; if (options.parentId) { url += '&parentId=' + options.parentId; @@ -403,7 +403,7 @@ class AppRouter { if (context !== 'folders' && !itemHelper.isLocalItem(item)) { if (item.CollectionType == CollectionType.Movies) { - url = `#/movies.html?topParentId=${item.Id}&collectionType=${item.CollectionType}`; + url = `#/movies?topParentId=${item.Id}&collectionType=${item.CollectionType}`; if (options && options.section === 'latest') { url += '&tab=1'; @@ -413,7 +413,7 @@ class AppRouter { } if (item.CollectionType == CollectionType.Tvshows) { - url = `#/tv.html?topParentId=${item.Id}&collectionType=${item.CollectionType}`; + url = `#/tv?topParentId=${item.Id}&collectionType=${item.CollectionType}`; if (options && options.section === 'latest') { url += '&tab=1'; @@ -423,7 +423,7 @@ class AppRouter { } if (item.CollectionType == CollectionType.Music) { - url = `#/music.html?topParentId=${item.Id}&collectionType=${item.CollectionType}`; + url = `#/music?topParentId=${item.Id}&collectionType=${item.CollectionType}`; if (options?.section === 'latest') { url += '&tab=1'; @@ -435,7 +435,7 @@ class AppRouter { const layoutMode = localStorage.getItem('layout'); if (layoutMode === 'experimental' && item.CollectionType == CollectionType.Homevideos) { - url = '#/homevideos.html?topParentId=' + item.Id; + url = '#/homevideos?topParentId=' + item.Id; return url; } @@ -455,7 +455,7 @@ class AppRouter { if (item.IsFolder) { if (id) { - return '#/list.html?parentId=' + id + '&serverId=' + serverId; + return '#/list?parentId=' + id + '&serverId=' + serverId; } return '#'; @@ -465,7 +465,7 @@ class AppRouter { } showLocalLogin(serverId) { - return this.show('login.html?serverid=' + serverId); + return this.show('login?serverid=' + serverId); } showVideoOsd() { @@ -473,11 +473,11 @@ class AppRouter { } showSelectServer() { - return this.show('selectserver.html'); + return this.show('selectserver'); } showSettings() { - return this.show('mypreferencesmenu.html'); + return this.show('mypreferencesmenu'); } showNowPlaying() { @@ -485,27 +485,27 @@ class AppRouter { } showGuide() { - return this.show('livetv.html?tab=1'); + return this.show('livetv?tab=1'); } goHome() { - return this.show('home.html'); + return this.show('home'); } showSearch() { - return this.show('search.html'); + return this.show('search'); } showLiveTV() { - return this.show('livetv.html'); + return this.show('livetv'); } showRecordedTV() { - return this.show('livetv.html?tab=3'); + return this.show('livetv?tab=3'); } showFavorites() { - return this.show('home.html?tab=1'); + return this.show('home?tab=1'); } } diff --git a/src/components/toolbar/AppUserMenu.tsx b/src/components/toolbar/AppUserMenu.tsx index 31a6856f22..d62918bb57 100644 --- a/src/components/toolbar/AppUserMenu.tsx +++ b/src/components/toolbar/AppUserMenu.tsx @@ -73,7 +73,7 @@ const AppUserMenu: FC = ({ > @@ -85,7 +85,7 @@ const AppUserMenu: FC = ({ diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 344b316210..b1545f696f 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1995,7 +1995,7 @@ export default function (view, params) { function onCancelSeriesTimerClick() { import('../../components/recordingcreator/recordinghelper').then(({ default: recordingHelper }) => { recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () { - Dashboard.navigate('livetv.html'); + Dashboard.navigate('livetv'); }); }); } diff --git a/src/controllers/livetv.html b/src/controllers/livetv.html index a490b9c3ad..7a5fa1e421 100644 --- a/src/controllers/livetv.html +++ b/src/controllers/livetv.html @@ -3,7 +3,7 @@
- +

${HeaderOnNow}

@@ -12,7 +12,7 @@
- +

${Shows}

@@ -21,7 +21,7 @@
- +

${Movies}

@@ -30,7 +30,7 @@
- +

${Sports}

@@ -39,7 +39,7 @@
- +

${HeaderForKids}

@@ -48,7 +48,7 @@
- +

${News}

diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index b591e17000..796c8a2a46 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -70,7 +70,7 @@ function onMoreClick() { const type = this.getAttribute('data-type'); if (type === 'latest') { - Dashboard.navigate('list.html?type=Recordings&serverId=' + ApiClient.serverId()); + Dashboard.navigate('list?type=Recordings&serverId=' + ApiClient.serverId()); } } diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index 662e060a68..989533e0a0 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -323,7 +323,7 @@ export default function (view, params) { function onInputCommand(evt) { if (evt.detail.command === 'search') { evt.preventDefault(); - Dashboard.navigate('search.html?collectionType=livetv'); + Dashboard.navigate('search?collectionType=livetv'); } } diff --git a/src/controllers/lyrics.js b/src/controllers/lyrics.js index f2af5c32ad..6272f7fcc5 100644 --- a/src/controllers/lyrics.js +++ b/src/controllers/lyrics.js @@ -265,7 +265,7 @@ export default function (view) { document.addEventListener('keydown', onKeyDown); try { onLoad(); - } catch (e) { + } catch { appRouter.goHome(); } }); diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index ff2ab8381e..27ddbe615e 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -370,7 +370,7 @@ export default function (view, params) { function onInputCommand(e) { if (e.detail.command === 'search') { e.preventDefault(); - Dashboard.navigate('search.html?collectionType=movies&parentId=' + params.topParentId); + Dashboard.navigate('search?collectionType=movies&parentId=' + params.topParentId); } } diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index dd4ccde9c4..06712165da 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -348,7 +348,7 @@ export default function (view, params) { function onInputCommand(e) { if (e.detail.command === 'search') { e.preventDefault(); - Dashboard.navigate('search.html?collectionType=music&parentId=' + params.topParentId); + Dashboard.navigate('search?collectionType=music&parentId=' + params.topParentId); } } diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 8e43667e44..104a2d142a 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -713,7 +713,7 @@ export default function (view) { }, state); } } catch (e) { - console.error('error parsing date: ' + program.EndDate); + console.error('error parsing date: ' + program.EndDate, e); } } } @@ -1352,7 +1352,7 @@ export default function (view) { case 'GamepadDPadLeft': case 'GamepadLeftThumbstickLeft': // Ignores gamepad events that are always triggered, even when not focused. - if (document.hasFocus()) { /* eslint-disable-line compat/compat */ + if (document.hasFocus()) { playbackManager.rewind(currentPlayer); showOsd(btnRewind); } @@ -1361,7 +1361,7 @@ export default function (view) { case 'GamepadDPadRight': case 'GamepadLeftThumbstickRight': // Ignores gamepad events that are always triggered, even when not focused. - if (document.hasFocus()) { /* eslint-disable-line compat/compat */ + if (document.hasFocus()) { playbackManager.fastForward(currentPlayer); showOsd(btnFastForward); } @@ -1712,7 +1712,7 @@ export default function (view) { if (browser.firefox || browser.edge) { dom.addEventListener(document, 'click', onClickCapture, { capture: true }); } - } catch (e) { + } catch { setBackdropTransparency(TRANSPARENCY_LEVEL.None); // reset state set in viewbeforeshow appRouter.goHome(); } diff --git a/src/controllers/session/addServer/index.js b/src/controllers/session/addServer/index.js index 068fc6134d..3e10dd629d 100644 --- a/src/controllers/session/addServer/index.js +++ b/src/controllers/session/addServer/index.js @@ -12,14 +12,14 @@ function handleConnectionResult(page, result) { case ConnectionState.SignedIn: { const apiClient = result.ApiClient; Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); - Dashboard.navigate('home.html'); + Dashboard.navigate('home'); break; } case ConnectionState.ServerSignIn: - Dashboard.navigate('login.html?serverid=' + result.Servers[0].Id, false, 'none'); + Dashboard.navigate('login?serverid=' + result.Servers[0].Id, false, 'none'); break; case ConnectionState.ServerSelection: - Dashboard.navigate('selectserver.html', false, 'none'); + Dashboard.navigate('selectserver', false, 'none'); break; case ConnectionState.ServerUpdateNeeded: Dashboard.alert({ diff --git a/src/controllers/session/forgotPassword/index.js b/src/controllers/session/forgotPassword/index.js index fb0afeec9c..d94dac4550 100644 --- a/src/controllers/session/forgotPassword/index.js +++ b/src/controllers/session/forgotPassword/index.js @@ -30,7 +30,7 @@ function processForgotPasswordResult(result) { message: msg, title: globalize.translate('ButtonForgotPassword'), callback: function () { - Dashboard.navigate('forgotpasswordpin.html'); + Dashboard.navigate('forgotpasswordpin'); } }); } diff --git a/src/controllers/session/login/index.js b/src/controllers/session/login/index.js index 2b61fb6e2b..4c241389a0 100644 --- a/src/controllers/session/login/index.js +++ b/src/controllers/session/login/index.js @@ -110,7 +110,7 @@ function authenticateQuickConnect(apiClient, targetUrl) { function onLoginSuccessful(id, accessToken, apiClient, url) { Dashboard.onServerChanged(id, accessToken, apiClient); - Dashboard.navigate(url || 'home.html'); + Dashboard.navigate(url || 'home'); } function showManualForm(context, showCancel, focusPassword) { @@ -201,7 +201,7 @@ export default function (view, params) { } } - return '/home.html'; + return '/home'; } function showVisualForm() { @@ -243,7 +243,7 @@ export default function (view, params) { return false; }); view.querySelector('.btnForgotPassword').addEventListener('click', function () { - Dashboard.navigate('forgotpassword.html'); + Dashboard.navigate('forgotpassword'); }); view.querySelector('.btnCancel').addEventListener('click', showVisualForm); view.querySelector('.btnQuick').addEventListener('click', function () { diff --git a/src/controllers/session/selectServer/index.html b/src/controllers/session/selectServer/index.html index 5dada38f76..06a3695bed 100644 --- a/src/controllers/session/selectServer/index.html +++ b/src/controllers/session/selectServer/index.html @@ -9,7 +9,7 @@
diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js index 8af9054edb..577c897ba6 100644 --- a/src/controllers/session/selectServer/index.js +++ b/src/controllers/session/selectServer/index.js @@ -115,12 +115,12 @@ export default function (view, params) { switch (result.State) { case ConnectionState.SignedIn: Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); - Dashboard.navigate('home.html'); + Dashboard.navigate('home'); break; case ConnectionState.ServerSignIn: Dashboard.onServerChanged(null, null, apiClient); - Dashboard.navigate('login.html?serverid=' + result.Servers[0].Id); + Dashboard.navigate('login?serverid=' + result.Servers[0].Id); break; case ConnectionState.ServerUpdateNeeded: diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 1f4e4eefe5..13a728526f 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -333,7 +333,7 @@ export default function (view, params) { function onInputCommand(e) { if (e.detail.command === 'search') { e.preventDefault(); - Dashboard.navigate(`search.html?collectionType=${CollectionType.Tvshows}&parentId=${params.topParentId}`); + Dashboard.navigate(`search?collectionType=${CollectionType.Tvshows}&parentId=${params.topParentId}`); } } diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index ab3f251b14..65db7731e0 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -61,7 +61,7 @@ function renderUpcoming(elem, items) { day: 'numeric' }); } catch (err) { - console.error('error parsing timestamp for upcoming tv shows'); + console.error('error parsing timestamp for upcoming tv shows', err); } } diff --git a/src/controllers/user/menu/index.js b/src/controllers/user/menu/index.js index 035d07492b..d02bb8d1b1 100644 --- a/src/controllers/user/menu/index.js +++ b/src/controllers/user/menu/index.js @@ -26,13 +26,13 @@ export default function (view, params) { const userId = params.userId || Dashboard.getCurrentUserId(); const page = this; - page.querySelector('.lnkUserProfile').setAttribute('href', '#/userprofile.html?userId=' + userId); - page.querySelector('.lnkDisplayPreferences').setAttribute('href', '#/mypreferencesdisplay.html?userId=' + userId); - page.querySelector('.lnkHomePreferences').setAttribute('href', '#/mypreferenceshome.html?userId=' + userId); - page.querySelector('.lnkPlaybackPreferences').setAttribute('href', '#/mypreferencesplayback.html?userId=' + userId); - page.querySelector('.lnkSubtitlePreferences').setAttribute('href', '#/mypreferencessubtitles.html?userId=' + userId); + page.querySelector('.lnkUserProfile').setAttribute('href', '#/userprofile?userId=' + userId); + page.querySelector('.lnkDisplayPreferences').setAttribute('href', '#/mypreferencesdisplay?userId=' + userId); + page.querySelector('.lnkHomePreferences').setAttribute('href', '#/mypreferenceshome?userId=' + userId); + page.querySelector('.lnkPlaybackPreferences').setAttribute('href', '#/mypreferencesplayback?userId=' + userId); + page.querySelector('.lnkSubtitlePreferences').setAttribute('href', '#/mypreferencessubtitles?userId=' + userId); page.querySelector('.lnkQuickConnectPreferences').setAttribute('href', '#/quickconnect?userId=' + userId); - page.querySelector('.lnkControlsPreferences').setAttribute('href', '#/mypreferencescontrols.html?userId=' + userId); + page.querySelector('.lnkControlsPreferences').setAttribute('href', '#/mypreferencescontrols?userId=' + userId); const supportsClientSettings = appHost.supports('clientsettings'); page.querySelector('.clientSettings').classList.toggle('hide', !supportsClientSettings); diff --git a/src/controllers/wizard/library.js b/src/controllers/wizard/library.js index 27bcde9c52..162e5b100a 100644 --- a/src/controllers/wizard/library.js +++ b/src/controllers/wizard/library.js @@ -361,7 +361,7 @@ function getVirtualFolderHtml(page, virtualFolder, index) { window.WizardLibraryPage = { next: function () { - Dashboard.navigate('wizardsettings.html'); + Dashboard.navigate('wizardsettings'); } }; pageClassOn('pageshow', 'mediaLibraryPage', function () { diff --git a/src/controllers/wizard/remote/index.js b/src/controllers/wizard/remote/index.js index 3d712cc321..65b1764883 100644 --- a/src/controllers/wizard/remote/index.js +++ b/src/controllers/wizard/remote/index.js @@ -23,7 +23,7 @@ function save(page) { } function navigateToNextPage() { - Dashboard.navigate('wizardfinish.html'); + Dashboard.navigate('wizardfinish'); } function onSubmit(e) { diff --git a/src/controllers/wizard/settings/index.js b/src/controllers/wizard/settings/index.js index 2881bc6d78..e37abceaa2 100644 --- a/src/controllers/wizard/settings/index.js +++ b/src/controllers/wizard/settings/index.js @@ -66,7 +66,7 @@ function reload(page) { } function navigateToNextPage() { - Dashboard.navigate('wizardremoteaccess.html'); + Dashboard.navigate('wizardremoteaccess'); } function onSubmit(e) { diff --git a/src/controllers/wizard/start/index.js b/src/controllers/wizard/start/index.js index 2af35bcb74..08d3fcd2d6 100644 --- a/src/controllers/wizard/start/index.js +++ b/src/controllers/wizard/start/index.js @@ -24,7 +24,7 @@ function save(page) { url: apiClient.getUrl('Startup/Configuration'), contentType: 'application/json' }).then(function () { - Dashboard.navigate('wizarduser.html'); + Dashboard.navigate('wizarduser'); }); }); } diff --git a/src/controllers/wizard/user/index.js b/src/controllers/wizard/user/index.js index 1d064bf382..1d4836f35e 100644 --- a/src/controllers/wizard/user/index.js +++ b/src/controllers/wizard/user/index.js @@ -11,7 +11,7 @@ function getApiClient() { } function nextWizardPage() { - Dashboard.navigate('wizardlibrary.html') + Dashboard.navigate('wizardlibrary') .catch(err => { console.error('[Wizard > User] error navigating to library setup', err); }); diff --git a/src/hooks/searchHook/index.ts b/src/hooks/searchHook/index.ts deleted file mode 100644 index 62ba9b422a..0000000000 --- a/src/hooks/searchHook/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './useSearchItems'; -export * from './useSearchSuggestions'; diff --git a/src/hooks/searchHook/useSearchItems.ts b/src/hooks/searchHook/useSearchItems.ts deleted file mode 100644 index e720c8ac17..0000000000 --- a/src/hooks/searchHook/useSearchItems.ts +++ /dev/null @@ -1,509 +0,0 @@ -import type { AxiosRequestConfig } from 'axios'; -import type { Api } from '@jellyfin/sdk'; -import type { - ArtistsApiGetArtistsRequest, - BaseItemDto, - ItemsApiGetItemsRequest, - PersonsApiGetPersonsRequest -} from '@jellyfin/sdk/lib/generated-client'; -import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; -import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; -import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields'; -import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type'; -import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; -import { getPersonsApi } from '@jellyfin/sdk/lib/utils/api/persons-api'; -import { getArtistsApi } from '@jellyfin/sdk/lib/utils/api/artists-api'; -import { useQuery } from '@tanstack/react-query'; -import { useApi } from '../useApi'; -import type { CardOptions } from 'types/cardOptions'; -import { CardShape } from 'utils/card'; - -const QUERY_OPTIONS = { - limit: 100, - fields: [ - ItemFields.PrimaryImageAspectRatio, - ItemFields.CanDelete, - ItemFields.MediaSourceCount - ], - enableTotalRecordCount: false, - imageTypeLimit: 1 -}; - -const fetchItemsByType = async ( - api: Api, - userId?: string, - params?: ItemsApiGetItemsRequest, - options?: AxiosRequestConfig -) => { - const response = await getItemsApi(api).getItems( - { - ...QUERY_OPTIONS, - userId: userId, - recursive: true, - ...params - }, - options - ); - return response.data; -}; - -const fetchPeople = async ( - api: Api, - userId: string, - params?: PersonsApiGetPersonsRequest, - options?: AxiosRequestConfig -) => { - const response = await getPersonsApi(api).getPersons( - { - ...QUERY_OPTIONS, - userId: userId, - ...params - }, - options - ); - return response.data; -}; - -const fetchArtists = async ( - api: Api, - userId: string, - params?: ArtistsApiGetArtistsRequest, - options?: AxiosRequestConfig -) => { - const response = await getArtistsApi(api).getArtists( - { - ...QUERY_OPTIONS, - userId: userId, - ...params - }, - options - ); - return response.data; -}; - -const isMovies = (collectionType: string) => - collectionType === CollectionType.Movies; - -const isMusic = (collectionType: string) => - collectionType === CollectionType.Music; - -const isTVShows = (collectionType: string) => - collectionType === CollectionType.Tvshows; - -const isLivetv = (collectionType: string) => - collectionType === CollectionType.Livetv; - -const LIVETV_CARD_OPTIONS = { - preferThumb: true, - inheritThumb: false, - showParentTitleOrTitle: true, - showTitle: false, - coverImage: true, - overlayMoreButton: true, - showAirTime: true, - showAirDateTime: true, - showChannelName: true -}; - -export interface Section { - title: string - items: BaseItemDto[]; - cardOptions?: CardOptions; -} - -export const useSearchItems = ( - parentId?: string, - collectionType?: string, - searchTerm?: string -) => { - const { api, user } = useApi(); - const userId = user?.Id; - - return useQuery({ - queryKey: ['SearchItems', { parentId, collectionType, searchTerm }], - queryFn: async ({ signal }) => { - if (!api) throw new Error('No API instance available'); - if (!userId) throw new Error('No User ID provided'); - - const sections: Section[] = []; - - const addSection = ( - title: string, - items: BaseItemDto[] | null | undefined, - cardOptions?: CardOptions - ) => { - if (items && items?.length > 0) { - sections.push({ title, items, cardOptions }); - } - }; - - // Livetv libraries - if (collectionType && isLivetv(collectionType)) { - // Movies row - const moviesData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.LiveTvProgram], - isMovie: true, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Movies', moviesData.Items, { - ...LIVETV_CARD_OPTIONS, - shape: CardShape.PortraitOverflow - }); - - // Episodes row - const episodesData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.LiveTvProgram], - isMovie: false, - isSeries: true, - isSports: false, - isKids: false, - isNews: false, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Episodes', episodesData.Items, { - ...LIVETV_CARD_OPTIONS - }); - - // Sports row - const sportsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.LiveTvProgram], - isSports: true, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Sports', sportsData.Items, { - ...LIVETV_CARD_OPTIONS - }); - - // Kids row - const kidsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.LiveTvProgram], - isKids: true, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Kids', kidsData.Items, { - ...LIVETV_CARD_OPTIONS - }); - - // News row - const newsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.LiveTvProgram], - isNews: true, - searchTerm: searchTerm - }, - { signal } - ); - addSection('News', newsData.Items, { - ...LIVETV_CARD_OPTIONS - }); - - // Programs row - const programsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.LiveTvProgram], - isMovie: false, - isSeries: false, - isSports: false, - isKids: false, - isNews: false, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Programs', programsData.Items, { - ...LIVETV_CARD_OPTIONS - }); - - // Channels row - const channelsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.TvChannel], - searchTerm: searchTerm - }, - { signal } - ); - addSection('Channels', channelsData.Items); - } - - // Movie libraries - if (!collectionType || isMovies(collectionType)) { - // Movies row - const moviesData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.Movie], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Movies', moviesData.Items, { - showYear: true - }); - } - - // TV Show libraries - if (!collectionType || isTVShows(collectionType)) { - // Shows row - const showsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.Series], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Shows', showsData.Items, { - showYear: true - }); - - // Episodes row - const episodesData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.Episode], - parentId: parentId, - isMissing: user?.Configuration?.DisplayMissingEpisodes, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Episodes', episodesData.Items, { - coverImage: true, - showParentTitle: true - }); - } - - // People are included for Movies and TV Shows - if ( - !collectionType - || isMovies(collectionType) - || isTVShows(collectionType) - ) { - // People row - const peopleData = await fetchPeople( - api, - userId, - { - searchTerm: searchTerm - }, - { signal } - ); - addSection('People', peopleData.Items, { - coverImage: true - }); - } - - // Music libraries - if (!collectionType || isMusic(collectionType)) { - // Playlists row - const playlistsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.Playlist], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Playlists', playlistsData.Items); - - // Artists row - const artistsData = await fetchArtists( - api, - userId, - { - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Artists', artistsData.Items, { - coverImage: true - }); - - // Albums row - const albumsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.MusicAlbum], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Albums', albumsData.Items, { - showYear: true - }); - - // Songs row - const songsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.Audio], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Songs', songsData.Items, { - showParentTitle: true, - shape: CardShape.SquareOverflow - }); - } - - // Other libraries do not support in-library search currently - if (!collectionType) { - // Videos row - const videosData = await fetchItemsByType( - api, - userId, - { - mediaTypes: [MediaType.Video], - excludeItemTypes: [ - BaseItemKind.Movie, - BaseItemKind.Episode, - BaseItemKind.TvChannel - ], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - - addSection('HeaderVideos', videosData.Items, { - showParentTitle: true - }); - - // Programs row - const programsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.LiveTvProgram], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Programs', programsData.Items, { - ...LIVETV_CARD_OPTIONS - }); - - // Channels row - const channelsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.TvChannel], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Channels', channelsData.Items); - - // Photo Albums row - const photoAlbumsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.PhotoAlbum], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('HeaderPhotoAlbums', photoAlbumsData.Items); - - // Photos row - const photosData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.Photo], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Photos', photosData.Items); - - // Audio Books row - const audioBooksData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.AudioBook], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('HeaderAudioBooks', audioBooksData.Items); - - // Books row - const booksData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.Book], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Books', booksData.Items); - - // Collections row - const collectionsData = await fetchItemsByType( - api, - userId, - { - includeItemTypes: [BaseItemKind.BoxSet], - parentId: parentId, - searchTerm: searchTerm - }, - { signal } - ); - addSection('Collections', collectionsData.Items); - } - - return sections; - }, - enabled: !!api && !!userId - }); -}; diff --git a/src/hooks/useCurrentTab.ts b/src/hooks/useCurrentTab.ts index 888be3c675..11c2569fc4 100644 --- a/src/hooks/useCurrentTab.ts +++ b/src/hooks/useCurrentTab.ts @@ -6,7 +6,7 @@ const useCurrentTab = () => { const [searchParams, setSearchParams] = useSearchParams(); const searchParamsTab = searchParams.get('tab'); const libraryId = - location.pathname === '/livetv.html' ? + location.pathname === '/livetv' ? 'livetv' : searchParams.get('topParentId'); const activeTab: number = diff --git a/src/hooks/useUserSettings.tsx b/src/hooks/useUserSettings.tsx index 84eb49117e..289588669e 100644 --- a/src/hooks/useUserSettings.tsx +++ b/src/hooks/useUserSettings.tsx @@ -7,6 +7,8 @@ import Events, { type Event } from 'utils/events'; import { useApi } from './useApi'; interface UserSettings { + customCss?: string + disableCustomCss: boolean theme?: string dashboardTheme?: string dateTimeLocale?: string @@ -15,6 +17,9 @@ interface UserSettings { // NOTE: This is an incomplete list of only the settings that are currently being used const UserSettingField = { + // Custom CSS + CustomCss: 'customCss', + DisableCustomCss: 'disableCustomCss', // Theme settings Theme: 'appTheme', DashboardTheme: 'dashboardTheme', @@ -23,11 +28,15 @@ const UserSettingField = { Language: 'language' }; -const UserSettingsContext = createContext({}); +const UserSettingsContext = createContext({ + disableCustomCss: false +}); export const useUserSettings = () => useContext(UserSettingsContext); export const UserSettingsProvider: FC> = ({ children }) => { + const [ customCss, setCustomCss ] = useState(); + const [ disableCustomCss, setDisableCustomCss ] = useState(false); const [ theme, setTheme ] = useState(); const [ dashboardTheme, setDashboardTheme ] = useState(); const [ dateTimeLocale, setDateTimeLocale ] = useState(); @@ -36,14 +45,25 @@ export const UserSettingsProvider: FC> = ({ children const { user } = useApi(); const context = useMemo(() => ({ + customCss, + disableCustomCss, theme, dashboardTheme, dateTimeLocale, locale: language - }), [ theme, dashboardTheme, dateTimeLocale, language ]); + }), [ + customCss, + disableCustomCss, + theme, + dashboardTheme, + dateTimeLocale, + language + ]); // Update the values of the user settings const updateUserSettings = useCallback(() => { + setCustomCss(userSettings.customCss()); + setDisableCustomCss(userSettings.disableCustomCss()); setTheme(userSettings.theme()); setDashboardTheme(userSettings.dashboardTheme()); setDateTimeLocale(userSettings.dateTimeLocale()); diff --git a/src/index.jsx b/src/index.jsx index 169f44857c..81627c4ad8 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -17,7 +17,6 @@ import { loadCoreDictionary } from 'lib/globalize/loader'; import { initialize as initializeAutoCast } from 'scripts/autocast'; import browser from './scripts/browser'; import keyboardNavigation from './scripts/keyboardNavigation'; -import { currentSettings } from './scripts/settings/userSettings'; import { getPlugins } from './scripts/settings/webSettings'; import taskButton from './scripts/taskbutton'; import { pageClassOn, serverAddress } from './utils/dashboard'; @@ -116,9 +115,6 @@ build: ${__JF_BUILD_VERSION__}`); // Load platform specific features loadPlatformFeatures(); - // Load custom CSS styles - loadCustomCss(); - // Enable navigation controls keyboardNavigation.enable(); autoFocuser.enable(); @@ -191,54 +187,7 @@ function loadPlatformFeatures() { } } -function loadCustomCss() { - // Apply custom CSS - const apiClient = ServerConnections.currentApiClient(); - if (apiClient) { - const brandingCss = fetch(apiClient.getUrl('Branding/Css')) - .then(function(response) { - if (!response.ok) { - throw new Error(response.status + ' ' + response.statusText); - } - return response.text(); - }) - .catch(function(err) { - console.warn('Error applying custom css', err); - }); - - const handleStyleChange = async () => { - let style = document.querySelector('#cssBranding'); - if (!style) { - // Inject the branding css as a dom element in body so it will take - // precedence over other stylesheets - style = document.createElement('style'); - style.id = 'cssBranding'; - document.body.appendChild(style); - } - - const css = []; - // Only add branding CSS when enabled - if (!currentSettings.disableCustomCss()) css.push(await brandingCss); - // Always add user CSS - css.push(currentSettings.customCss()); - - style.textContent = css.join('\n'); - }; - - Events.on(ServerConnections, 'localusersignedin', handleStyleChange); - Events.on(ServerConnections, 'localusersignedout', handleStyleChange); - Events.on(currentSettings, 'change', (e, prop) => { - if (prop == 'disableCustomCss' || prop == 'customCss') { - handleStyleChange(); - } - }); - - handleStyleChange(); - } -} - function registerServiceWorker() { - /* eslint-disable compat/compat */ if (navigator.serviceWorker && window.appMode !== 'cordova' && window.appMode !== 'android') { navigator.serviceWorker.register('serviceworker.js').then(() => console.log('serviceWorker registered') @@ -248,7 +197,6 @@ function registerServiceWorker() { } else { console.warn('serviceWorker unsupported'); } - /* eslint-enable compat/compat */ } async function renderApp() { diff --git a/src/lib/globalize/index.js b/src/lib/globalize/index.js index fc76a209df..1029a2280d 100644 --- a/src/lib/globalize/index.js +++ b/src/lib/globalize/index.js @@ -79,7 +79,7 @@ export function updateCurrentCulture() { let culture; try { culture = userSettings.language(); - } catch (err) { + } catch { console.error('no language set in user settings'); } culture = culture || getDefaultLanguage(); @@ -92,7 +92,7 @@ export function updateCurrentCulture() { let dateTimeCulture; try { dateTimeCulture = userSettings.dateTimeLocale(); - } catch (err) { + } catch { console.error('no date format set in user settings'); } diff --git a/src/lib/legacy/domParserTextHtml.js b/src/lib/legacy/domParserTextHtml.js index cea84c79f6..9cace5df2e 100644 --- a/src/lib/legacy/domParserTextHtml.js +++ b/src/lib/legacy/domParserTextHtml.js @@ -22,7 +22,7 @@ // text/html parsing is natively supported return; } - } catch (ex) { /* noop */ } + } catch { /* noop */ } DOMParserPrototype.parseFromString = function (markup, type) { if (/^\s*text\/html\s*(?:;|$)/i.test(type)) { diff --git a/src/lib/legacy/keyboardEvent.js b/src/lib/legacy/keyboardEvent.js index b2e114a383..488a914a19 100644 --- a/src/lib/legacy/keyboardEvent.js +++ b/src/lib/legacy/keyboardEvent.js @@ -8,7 +8,7 @@ try { new window.KeyboardEvent('event', { bubbles: true, cancelable: true }); - } catch (e) { + } catch { // We can't use `KeyboardEvent` in old WebKit because `initKeyboardEvent` // doesn't seem to populate some properties (`keyCode`, `which`) that // are read-only. diff --git a/src/lib/legacy/patchHeaders.js b/src/lib/legacy/patchHeaders.js index 5c99b6a358..e8d7c80922 100644 --- a/src/lib/legacy/patchHeaders.js +++ b/src/lib/legacy/patchHeaders.js @@ -13,7 +13,7 @@ if (window.Headers) { try { new window.Headers(undefined); - } catch (_) { + } catch { console.debug('patch \'Headers\' to accept \'undefined\''); const _Headers = window.Headers; diff --git a/src/manifest.json b/src/manifest.json index f220dcaa37..1e8f9dd713 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -3,7 +3,7 @@ "description": "The Free Software Media System", "lang": "en-US", "short_name": "Jellyfin", - "start_url": "index.html#/home.html", + "start_url": "index.html#/home", "theme_color": "#101010", "background_color": "#101010", "display": "standalone", diff --git a/src/plugins/chromecastPlayer/plugin.js b/src/plugins/chromecastPlayer/plugin.js index 59b01e15c2..868f026918 100644 --- a/src/plugins/chromecastPlayer/plugin.js +++ b/src/plugins/chromecastPlayer/plugin.js @@ -1109,7 +1109,8 @@ class ChromecastPlayer { return this.getPlayerStateInternal()?.NowPlayingItem?.IndexNumber; } - clearQueue(currentTime) { // eslint-disable-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars + clearQueue(currentTime) { // not supported yet } } diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index f25ba3994e..9ab641e9e7 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1512,7 +1512,7 @@ export class HtmlVideoPlayer { trackElement.removeCue(trackElement.cues[0]); } } catch (e) { - console.error('error removing cue from textTrack'); + console.error('error removing cue from textTrack', e); } trackElement.mode = 'disabled'; diff --git a/src/plugins/syncPlay/core/PlaybackCore.js b/src/plugins/syncPlay/core/PlaybackCore.js index 73ab977eb6..c148d30b29 100644 --- a/src/plugins/syncPlay/core/PlaybackCore.js +++ b/src/plugins/syncPlay/core/PlaybackCore.js @@ -221,6 +221,7 @@ class PlaybackCore { // Account for player imperfections, we got half a second of tollerance we can play with // (the server tollerates a range of values when client reports that is ready). const rangeWidth = 100; // In milliseconds. + // eslint-disable-next-line sonarjs/pseudo-random const randomOffsetTicks = Math.round((Math.random() - 0.5) * rangeWidth) * Helper.TicksPerMillisecond; this.scheduleSeek(command.When, command.PositionTicks + randomOffsetTicks); console.debug('SyncPlay applyCommand: adding random offset to force seek:', randomOffsetTicks, command); diff --git a/src/plugins/syncPlay/core/players/GenericPlayer.js b/src/plugins/syncPlay/core/players/GenericPlayer.js index 2093191e62..ff127b1a03 100644 --- a/src/plugins/syncPlay/core/players/GenericPlayer.js +++ b/src/plugins/syncPlay/core/players/GenericPlayer.js @@ -158,7 +158,7 @@ class GenericPlayer { * Sets the playback rate, if supported. * @param {number} value The playback rate. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars setPlaybackRate(value) { // Do nothing. } @@ -197,7 +197,7 @@ class GenericPlayer { * Seeks the player to the specified position. * @param {number} positionTicks The new position. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localSeek(positionTicks) { // Override } @@ -213,7 +213,7 @@ class GenericPlayer { * Sends a command to the player. * @param {Object} command The command. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localSendCommand(command) { // Override } @@ -222,7 +222,7 @@ class GenericPlayer { * Starts playback. * @param {Object} options Playback data. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localPlay(options) { // Override } @@ -231,7 +231,7 @@ class GenericPlayer { * Sets playing item from playlist. * @param {string} playlistItemId The item to play. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localSetCurrentPlaylistItem(playlistItemId) { // Override } @@ -240,7 +240,7 @@ class GenericPlayer { * Removes items from playlist. * @param {Array} playlistItemIds The items to remove. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localRemoveFromPlaylist(playlistItemIds) { // Override } @@ -250,7 +250,7 @@ class GenericPlayer { * @param {string} playlistItemId The item to move. * @param {number} newIndex The new position. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localMovePlaylistItem(playlistItemId, newIndex) { // Override } @@ -259,7 +259,7 @@ class GenericPlayer { * Queues in the playlist. * @param {Object} options Queue data. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localQueue(options) { // Override } @@ -268,7 +268,7 @@ class GenericPlayer { * Queues after the playing item in the playlist. * @param {Object} options Queue data. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localQueueNext(options) { // Override } @@ -291,7 +291,7 @@ class GenericPlayer { * Sets repeat mode. * @param {string} value The repeat mode. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localSetRepeatMode(value) { // Override } @@ -300,7 +300,7 @@ class GenericPlayer { * Sets shuffle mode. * @param {string} value The shuffle mode. */ - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-unused-vars localSetQueueShuffleMode(value) { // Override } diff --git a/src/scripts/browserDeviceProfile.js b/src/scripts/browserDeviceProfile.js index eeb1551f52..db3b3c72bd 100644 --- a/src/scripts/browserDeviceProfile.js +++ b/src/scripts/browserDeviceProfile.js @@ -921,6 +921,19 @@ export default function (options) { profile.ContainerProfiles = []; + if (browser.tizen) { + // Tizen doesn't support more than 32 streams in a single file + profile.ContainerProfiles.push({ + Type: 'Video', + Conditions: [{ + Condition: 'LessThanEqual', + Property: 'NumStreams', + Value: '32', + IsRequired: false + }] + }); + } + profile.CodecProfiles = []; const supportsSecondaryAudio = canPlaySecondaryAudio(videoTestElement); diff --git a/src/scripts/datetime.js b/src/scripts/datetime.js index 6de53c0167..bcc48b1d74 100644 --- a/src/scripts/datetime.js +++ b/src/scripts/datetime.js @@ -211,7 +211,7 @@ export function getDisplayDateTime(date) { if (typeof date === 'string') { try { date = parseISO8601Date(date, true); - } catch (err) { + } catch { return date; } } @@ -227,7 +227,7 @@ export function getDisplayTime(date) { if (typeof date === 'string') { try { date = parseISO8601Date(date, true); - } catch (err) { + } catch { return date; } } diff --git a/src/scripts/gamepadtokey.js b/src/scripts/gamepadtokey.js index da3b88e27f..571c06c32c 100644 --- a/src/scripts/gamepadtokey.js +++ b/src/scripts/gamepadtokey.js @@ -178,7 +178,7 @@ function resetThrottle(key) { const isElectron = navigator.userAgent.toLowerCase().indexOf('electron') !== -1; function allowInput() { // This would be nice but always seems to return true with electron - if (!isElectron && document.hidden) { /* eslint-disable-line compat/compat */ + if (!isElectron && document.hidden) { return false; } @@ -356,7 +356,6 @@ function isGamepadConnected() { } function onFocusOrGamepadAttach() { - /* eslint-disable-next-line compat/compat */ if (isGamepadConnected() && document.hasFocus()) { console.log('Gamepad connected! Starting input loop'); startInputLoop(); @@ -364,7 +363,6 @@ function onFocusOrGamepadAttach() { } function onFocusOrGamepadDetach() { - /* eslint-disable-next-line compat/compat */ if (!isGamepadConnected() || !document.hasFocus()) { console.log('Gamepad disconnected! No other gamepads are connected, stopping input loop'); stopInputLoop(); diff --git a/src/scripts/itemsByName.js b/src/scripts/itemsByName.js index 92dcc1f314..936c7b8773 100644 --- a/src/scripts/itemsByName.js +++ b/src/scripts/itemsByName.js @@ -302,26 +302,26 @@ function loadItems(element, item, type, query, listOptions) { function getMoreItemsHref(item, type) { if (item.Type === 'Genre') { - return '#/list.html?type=' + type + '&genreId=' + item.Id + '&serverId=' + item.ServerId; + return '#/list?type=' + type + '&genreId=' + item.Id + '&serverId=' + item.ServerId; } if (item.Type === 'MusicGenre') { - return '#/list.html?type=' + type + '&musicGenreId=' + item.Id + '&serverId=' + item.ServerId; + return '#/list?type=' + type + '&musicGenreId=' + item.Id + '&serverId=' + item.ServerId; } if (item.Type === 'Studio') { - return '#/list.html?type=' + type + '&studioId=' + item.Id + '&serverId=' + item.ServerId; + return '#/list?type=' + type + '&studioId=' + item.Id + '&serverId=' + item.ServerId; } if (item.Type === 'MusicArtist') { - return '#/list.html?type=' + type + '&artistId=' + item.Id + '&serverId=' + item.ServerId; + return '#/list?type=' + type + '&artistId=' + item.Id + '&serverId=' + item.ServerId; } if (item.Type === 'Person') { - return '#/list.html?type=' + type + '&personId=' + item.Id + '&serverId=' + item.ServerId; + return '#/list?type=' + type + '&personId=' + item.Id + '&serverId=' + item.ServerId; } - return '#/list.html?type=' + type + '&parentId=' + item.Id + '&serverId=' + item.ServerId; + return '#/list?type=' + type + '&parentId=' + item.Id + '&serverId=' + item.ServerId; } function addCurrentItemToQuery(query, item) { diff --git a/src/scripts/keyboardNavigation.js b/src/scripts/keyboardNavigation.js index 8e5797cd8d..a07a8a270e 100644 --- a/src/scripts/keyboardNavigation.js +++ b/src/scripts/keyboardNavigation.js @@ -64,7 +64,7 @@ let hasFieldKey = false; try { hasFieldKey = 'key' in new KeyboardEvent('keydown'); } catch (e) { - console.error("error checking 'key' field"); + console.error("error checking 'key' field", e); } if (!hasFieldKey) { @@ -239,7 +239,7 @@ function attachGamepadScript() { } // No need to check for gamepads manually at load time, the eventhandler will be fired for that -if (navigator.getGamepads && appSettings.enableGamepad()) { /* eslint-disable-line compat/compat */ +if (navigator.getGamepads && appSettings.enableGamepad()) { window.addEventListener('gamepadconnected', attachGamepadScript); } diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index b1722a148d..d36f805856 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -214,11 +214,11 @@ function showSearch() { } function onHeaderUserButtonClick() { - Dashboard.navigate('mypreferencesmenu.html'); + Dashboard.navigate('mypreferencesmenu'); } function onHeaderHomeButtonClick() { - Dashboard.navigate('home.html'); + Dashboard.navigate('home'); } function showAudioPlayer() { @@ -321,7 +321,7 @@ function onMainDrawerSelect() { function refreshLibraryInfoInDrawer(user) { let html = ''; html += '
'; - html += `${globalize.translate('Home')}`; + html += `${globalize.translate('Home')}`; // placeholder for custom menu links html += '
'; @@ -406,7 +406,7 @@ function getUserViews(apiClient, userId) { guideView.Name = globalize.translate('Guide'); guideView.ImageTags = {}; guideView.icon = 'dvr'; - guideView.url = '#/livetv.html?tab=1'; + guideView.url = '#/livetv?tab=1'; list.push(guideView); } } @@ -503,7 +503,7 @@ function onSelectServerClick() { } function onSettingsClick() { - Dashboard.navigate('mypreferencesmenu.html'); + Dashboard.navigate('mypreferencesmenu'); } function onExitAppClick() { diff --git a/src/scripts/screensavermanager.js b/src/scripts/screensavermanager.js index 2ef416a387..fccc2751a8 100644 --- a/src/scripts/screensavermanager.js +++ b/src/scripts/screensavermanager.js @@ -31,7 +31,7 @@ function getScreensaverPlugin(isLoggedIn) { let option; try { option = userSettings.get('screensaver', false); - } catch (err) { + } catch { option = isLoggedIn ? 'backdropscreensaver' : 'logoscreensaver'; } diff --git a/src/scripts/themeManager.js b/src/scripts/themeManager.js index 70f4810041..f976dba82e 100644 --- a/src/scripts/themeManager.js +++ b/src/scripts/themeManager.js @@ -1,16 +1,7 @@ import { getDefaultTheme, getThemes as getConfiguredThemes } from './settings/webSettings'; -let themeStyleElement = document.querySelector('#cssTheme'); let currentThemeId; -function unloadTheme() { - const elem = themeStyleElement; - if (elem) { - elem.removeAttribute('href'); - currentThemeId = null; - } -} - function getThemes() { return getConfiguredThemes(); } @@ -29,11 +20,7 @@ function getThemeStylesheetInfo(id) { theme = getDefaultTheme(); } - return { - stylesheetPath: 'themes/' + theme.id + '/theme.css', - themeId: theme.id, - color: theme.color - }; + return theme; }); } @@ -45,36 +32,12 @@ function setTheme(id) { } getThemeStylesheetInfo(id).then(function (info) { - if (currentThemeId && currentThemeId === info.themeId) { + if (currentThemeId && currentThemeId === info.id) { resolve(); return; } - const linkUrl = info.stylesheetPath; - unloadTheme(); - - let link = themeStyleElement; - - if (!link) { - // Inject the theme css as a dom element in body so it will take - // precedence over other stylesheets - link = document.createElement('link'); - link.id = 'cssTheme'; - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('type', 'text/css'); - document.body.appendChild(link); - } - - const onLoad = function (e) { - e.target.removeEventListener('load', onLoad); - resolve(); - }; - - link.addEventListener('load', onLoad); - - link.setAttribute('href', linkUrl); - themeStyleElement = link; - currentThemeId = info.themeId; + currentThemeId = info.id; document.getElementById('themeColor').content = info.color; }); @@ -82,6 +45,6 @@ function setTheme(id) { } export default { - getThemes: getThemes, - setTheme: setTheme + getThemes, + setTheme }; diff --git a/src/strings/af.json b/src/strings/af.json index 07c50a6c2a..990ed405bb 100644 --- a/src/strings/af.json +++ b/src/strings/af.json @@ -304,7 +304,7 @@ "ConfirmDeleteItems": "As u hierdie items uitvee sal dit beide die lêers op u stelsel en die inhoud in die media versameling uitvee. Is u seker u wil voortgaan?", "ConfirmDeleteItem": "As u hierdie item uitvee sal dit beide die lêer op u stelsel en die inhoud in die media versameling uitvee. Is u seker u wil voortgaan?", "ConfirmDeleteImage": "Verwyder beeld?", - "ConfigureDateAdded": "Bepaal hoe datum gelaai gebruik word in die paneelbord onder versameling-instellings", + "ConfigureDateAdded": "Stel op hoe die metadata vir 'Datum bygevoeg' bepaal word in die Dashboard > Biblioteke > Vertoon", "Composer": "Komponis", "CommunityRating": "Gemeenskapgradering", "ColorTransfer": "Kleur oordrag", @@ -523,7 +523,7 @@ "HeaderSpecialEpisodeInfo": "Spesiale edisode inligting", "HeaderSortOrder": "Sorteer orde", "HeaderSortBy": "Sorteer deur", - "HeaderSetupLibrary": "Stel op jou media reeks", + "HeaderSetupLibrary": "Stel jou media-biblioteke op", "HeaderServerSettings": "Server instellings", "HeaderServerAddressSettings": "Server address instellings", "HeaderSeriesStatus": "Seisoen status", @@ -938,13 +938,13 @@ "HeaderAddLyrics": "Voeg Lirieke Toe", "Anime": "Anime", "HeaderVideoAdvanced": "Video Gevorderd", - "IgnoreDts": "Ignoreer DTS (tydstempel dekodering)", + "IgnoreDts": "Ignoreer DTS (dekoderings-tydstempel)", "Illustrator": "Illustreerder", "HeaderNewPlaylist": "Nuwe Snitlys", "HeaderPreviewLyrics": "Lirieke Voorskou", - "HeaderUploadLyrics": "Lirieke Oplaai", + "HeaderUploadLyrics": "Laai lirieke op", "HomeVideosPhotos": "Tuisvideo's en foto's", - "HeaderRecordingMetadataSaving": "Metadata van die Opname", + "HeaderRecordingMetadataSaving": "Opname-metadata", "HeaderGuestCast": "Byspelers", "HeaderEpisodesStatus": "Episodes se Status", "IgnoreDtsHelp": "Die deaktivering van hierdie opsie mag sommige probleme oplos, soos bv. geen oudio op kanale met aparte oudio- en videostrome.", @@ -953,5 +953,17 @@ "HeaderNextItem": "Volgende {0}", "HeaderNextItemPlayingInValue": "Volgende {0} Speel in {1}", "HeaderNoLyrics": "Geen lirieke gevind nie", - "HeaderPerformance": "Prestasie" + "HeaderPerformance": "Prestasie", + "Custom": "Pasgemaak", + "ItemDetails": "Item Informasie", + "AutoSubtitleStylingHelp": "Hierdie modus sal outomaties kies tussen die standaard en pasgemaakte onderskrif-style, afhangend van watter tipe toestel jy gebruik.", + "HeaderNextVideo": "Volgende Video", + "CustomSubtitleStylingHelp": "Onderskrif-styling werk op meeste toestelle, maar dit kan 'n ekstra impak op werkverrigting hê.", + "DeleteServerConfirmation": "Is jy seker jy wil hierdie bediener uitvee?", + "CopyLogSuccess": "Log-inhoud suksesvol gekopieer.", + "LabelAlbumGain": "Album Versterking", + "DisplayLoadError": "Daar het 'n fout voorgekom tydens die laai van vertoonkonfigurasie-data.", + "HeaderNextEpisode": "Volgende Episode", + "LabelAllowContentWithTags": "Laat items met etikette toe", + "LabelAllowFmp4TranscodingContainer": "Laat fMP4 transkodering houer toe" } diff --git a/src/strings/ar.json b/src/strings/ar.json index f5419ef628..3dc810e181 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1819,5 +1819,12 @@ "AlwaysBurnInSubtitleWhenTranscoding": "انسخ الترجمة دائماً عند تحويل الترميز", "AlwaysBurnInSubtitleWhenTranscodingHelp": "نسخ جميع العناوين الفرعية عند تشغيل تحويل الترميز. يضمن ذلك مزامنة الترجمة بعد تحويل الترميز على حساب انخفاض سرعة التحويل.", "ChannelResolutionSDPAL": "SD (PAL)", - "EnableTrueHdHelp": "لا تفعّلها إلا إذا كان جهازك يدعم TrueHD أو كان متصلاً بجهاز استقبال صوتي متوافق، وإلا فقد يتسبب ذلك في فشل التشغيل." + "EnableTrueHdHelp": "لا تفعّلها إلا إذا كان جهازك يدعم TrueHD أو كان متصلاً بجهاز استقبال صوتي متوافق، وإلا فقد يتسبب ذلك في فشل التشغيل.", + "HeaderPageNotFound": "لم يتم العثور على الصفحة", + "HeaderNextEpisode": "حلقة جديدة", + "LabelDuration": "المدة", + "LabelDisableVbrAudioEncoding": "تعطيل VBR لترميز الصوت", + "HeaderNextVideo": "الفيديو التالي", + "LabelDevice": "الجهاز", + "LabelEnablePlugin": "تفعيل البرنامج الإضافي" } diff --git a/src/strings/be-by.json b/src/strings/be-by.json index 8b263a77ca..be3d706cc9 100644 --- a/src/strings/be-by.json +++ b/src/strings/be-by.json @@ -1955,5 +1955,9 @@ "LabelMediaSegmentProviders": "Пастаўшчыкі сегментаў медыяфайлаў", "MediaSegmentProvidersHelp": "Уключыце і расстаўце вашых пераважных пастаўшчыкоў сегментаў медыяфайлаў у парадку прыярытэту.", "MediaSegmentType.Commercial": "Рэклама", - "MediaSegmentAction.None": "Няма" + "MediaSegmentAction.None": "Няма", + "HeaderNextVideo": "Наступнае відэа", + "HeaderPageNotFound": "Старонка не знойдзена", + "LabelSaveTrickplayLocally": "Захаваць выявы trickplay побач з медыяфайламі", + "LabelSaveTrickplayLocallyHelp": "Захаванне выяў trickplay у тэчках з медыяфайламі дазволіць размясціць іх побач з вашымі медыяфайламі для зручнай міграцыі і доступу." } diff --git a/src/strings/ca.json b/src/strings/ca.json index 56533503fa..28cb3292bd 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -1702,7 +1702,7 @@ "HeaderPerformance": "Rendiment", "LabelDummyChapterCountHelp": "El nombre màxim d'imatges del capítol que s'extreuran per a cada fitxer multimèdia.", "LabelParallelImageEncodingLimit": "Límit de codificació paral·lela d'imatges", - "LabelParallelImageEncodingLimitHelp": "Número màxim de codificacions d'imatge que es poden executar en paral·lel. Si s'estableix a 0, es triarà un límit en funció del número de nuclis.", + "LabelParallelImageEncodingLimitHelp": "Número màxim de codificacions d'imatge que es poden executar en paral·lel. Si es deixa buit, es triarà un límit en funció del número de nuclis.", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Els extres sovint tenen el mateix nom incrustat que el principal, marqueu-ho per utilitzar-los títols incrustats de totes maneres.", "SaveRecordingNFO": "Desa les metadades EPG d'enregistrament a NFO", "SaveRecordingImages": "Guarda les imatges d'enregistrament EPG", @@ -1885,7 +1885,7 @@ "SaveLyricsIntoMediaFolders": "Desa la lletra a les carpetes multimèdia", "SaveLyricsIntoMediaFoldersHelp": "Emmagatzemar les lletres al costat dels fitxers d'àudio permetrà gestionar-les més fàcilment.", "LabelSelectPreferredTranscodeVideoAudioCodec": "Còdec d'àudio de transcodificació preferit en la reproducció de vídeo", - "LibraryScanFanoutConcurrencyHelp": "Nombre màxim de tasques paral·leles durant les exploracions de la biblioteca. Si s'estableix a 0, es triarà un límit basat en el nombre de nuclis del vostre sistema. ADVERTÈNCIA: establir aquest número massa alt pot causar problemes amb els sistemes de fitxers de xarxa; si trobeu problemes, baixeu aquest número.", + "LibraryScanFanoutConcurrencyHelp": "Nombre màxim de tasques paral·leles durant les exploracions de la biblioteca. Si es deixa buit, es triarà un límit basat en el nombre de nuclis del vostre sistema. ADVERTÈNCIA: establir aquest número massa alt pot causar problemes amb els sistemes de fitxers de xarxa; si trobeu problemes, baixeu aquest número.", "SelectPreferredTranscodeVideoAudioCodecHelp": "Seleccioneu el còdec d'àudio preferit per transcodificar per al contingut de vídeo. Si el còdec preferit no és compatible, el servidor utilitzarà el següent millor còdec disponible.", "LibraryScanFanoutConcurrency": "Límit de tasques d'exploració paral·leles per a les biblioteques", "Penciller": "Dibuixant", @@ -2002,5 +2002,11 @@ "LastActive": "Últim actiu", "CopyLogSuccess": "Registres copiats satisfactòriament.", "Retry": "Tronar a provar", - "LogLoadFailure": "Error al carregar el registre. És probable que encara s'estigui escrivint en ell." + "LogLoadFailure": "Error al carregar el registre. És probable que encara s'estigui escrivint en ell.", + "MetadataNfoLoadError": "No s'han pogut carregar les configuracions de metadades NFO", + "SettingsPageLoadError": "No s'ha pogut carregar la pàgina de configuracions", + "DisplayLoadError": "S'ha produït un error en carregar les dades de configuració de la pantalla.", + "HeaderPageNotFound": "Pàgina no trobada", + "PageNotFound": "Aquesta no és la pàgina que estàs buscant.", + "MetadataImagesLoadError": "No s'han pogut carregar les configuracions de metadades" } diff --git a/src/strings/cs.json b/src/strings/cs.json index e3df1412bf..26931bc3f6 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1719,7 +1719,7 @@ "Short": "Krátký film", "HeaderPerformance": "Výkon", "LabelParallelImageEncodingLimit": "Počet paralelních kódování obrázků", - "LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Nastavením na 0 bude limit nastaven dle počtu jader CPU.", + "LabelParallelImageEncodingLimitHelp": "Maximální počet kódování obrázků, které mohou běžet zároveň. Ponecháním prázdné hodnoty bude limit nastaven dle počtu jader CPU.", "LabelEnableAudioVbr": "Povolit kódování zvuku VBR", "LabelEnableAudioVbrHelp": "Proměnlivý bitový tok (VBR) nabízí lepší poměr mezi kvalitou a průměrným bitovým tokem, ale někdy může způsobit dodatečné načítání či problémy s kompatibilitou.", "Select": "Vybrat", @@ -1891,7 +1891,7 @@ "Letterer": "Lettrista", "Penciller": "Výtvarník", "Translator": "Překladatel", - "LibraryScanFanoutConcurrencyHelp": "Maximální počet souběžných úloh skenování knihovny. Nastavením na 0 bude počet dán počtem jader CPU. UPOZORNĚNÍ: Příliš vyskoý počet může způsobit problémy se síťovými souborými systémy. V takovém případě počet snižte.", + "LibraryScanFanoutConcurrencyHelp": "Maximální počet souběžných úloh skenování knihovny. Ponecháním prázdné hodnoty bude počet dán počtem jader CPU. UPOZORNĚNÍ: Příliš vyskoý počet může způsobit problémy se síťovými souborými systémy. V takovém případě počet snižte.", "LibraryScanFanoutConcurrency": "Maximální počet souběžných skenování knihovny", "LabelSelectPreferredTranscodeVideoAudioCodec": "Preferovaný audio kodek pro překódovaní při přehrávání videí", "SelectPreferredTranscodeVideoAudioCodecHelp": "Vybrat preferovaný audio kodek pro překódovaní při přehrávání videí. Pokud preferovaný kodek není podporován, server vybere jiný dostupný kodek.", @@ -2005,8 +2005,14 @@ "DeleteServerConfirmation": "Opravdu chcete odstranit tento server?", "LibraryNameInvalid": "Název knihovny nesmí být prázdný.", "CopyLogSuccess": "Obsah logu byl úspěšně zkopírován.", - "Retry": "Opakovat", + "Retry": "Zkusit znovu", "LogLoadFailure": "Načtení souboru logu se nezdařilo. Možná se do něj právě zapisuje.", "DisplayLoadError": "Načítání konfiguračních dat zobrazení se nezdařilo.", - "MetadataImagesLoadError": "Načítání nastavení metadat se nezdařilo" + "MetadataImagesLoadError": "Načítání nastavení metadat se nezdařilo", + "MetadataNfoLoadError": "Načtení nastavení metadat v souborech NFO se nezdařilo", + "HeaderPageNotFound": "Stránka nebyla nalezena", + "PageNotFound": "Toto není stránka, kterou hledáš.", + "SettingsPageLoadError": "Načtení stránky nastavení se nezdařilo", + "RetryWithGlobalSearch": "Zkusit hledat globálně", + "StreamCountExceedsLimit": "Počet streamů překračuje limit" } diff --git a/src/strings/da.json b/src/strings/da.json index 8c74cccd5d..514f3a1be4 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -1993,7 +1993,7 @@ "LabelMediaSegmentProviders": "Mediesegment tilbydere", "MediaSegmentProvidersHelp": "Aktiver og arranger dine foretrukne mediesegment-tilbydere efter prioritering.", "DeleteServerConfirmation": "Er du sikker på at du ønsker slette denne server?", - "AutoSubtitleStylingHelp": "Denne tilstand vil automatisk skifte mellem oprindelig og brugerdefineret stylings-mekanismer baseret på din enheds type.", + "AutoSubtitleStylingHelp": "Denne tilstand vil automatisk skifte mellem oprindelig og brugerdefineret undertekst stylings-mekanismer baseret på din enheds type.", "Custom": "Brugerdefineret", "CustomSubtitleStylingHelp": "Undertekse styling vil virke på de fleste enheder, men kommer med en præstations pris.", "LabelSubtitleStyling": "Undertekst Styling", diff --git a/src/strings/de.json b/src/strings/de.json index 2a4ac20d00..6476d0b787 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -96,7 +96,7 @@ "ColorSpace": "Farbraum", "CommunityRating": "Communitybewertung", "Composer": "Komponist", - "ConfigureDateAdded": "Legen Sie fest, wie die Metadaten für ‚Hinzugefügt am‘ im Dashboard unter Bibliotheken > Anzeige bestimmt werden.", + "ConfigureDateAdded": "Legen Sie fest, wie die Metadaten für ‚Hinzugefügt am‘ unter Dashboard > Bibliotheken > Anzeige bestimmt werden.", "ConfirmDeleteImage": "Bild löschen?", "ConfirmDeleteItem": "Das Löschen dieses Objekts löscht die Datei vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", "ConfirmDeleteItems": "Das Löschen dieser Objekte löscht die Dateien vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", @@ -1718,7 +1718,7 @@ "Featurette": "Hinter den Kulissen", "Short": "Kurzfilm", "LabelParallelImageEncodingLimit": "Limit der parallelen Bildkodierung", - "LabelParallelImageEncodingLimitHelp": "Maximale Anzahl von Bildkodierungen, die parallel ausgeführt werden dürfen. Wenn Sie diesen Wert auf 0 setzen, wird eine Grenze auf der Grundlage der Kernanzahl Ihres Systems festgelegt.", + "LabelParallelImageEncodingLimitHelp": "Maximale Anzahl von Bildkodierungen, die parallel ausgeführt werden dürfen. Wenn Sie diesen Wert auf 0 lassen, wird ein Limit auf Grundlage der Kernanzahl Ihres Systems festgelegt.", "HeaderPerformance": "Leistung", "LabelEnableAudioVbr": "Aktiviere Audiokodierung mit variabler Bitrate (VBR)", "LabelEnableAudioVbrHelp": "Eine variable Bitrate bietet bessere Qualität im Vergleich zu einer konstanten, kann jedoch in manchen Fällen zu Problemen beim Buffering und der Kompatibilität führen.", @@ -1881,7 +1881,7 @@ "LabelSelectPreferredTranscodeVideoAudioCodec": "Bevorzugter Transcode-Audiocodec bei der Videowiedergabe", "Translator": "Übersetzer", "LibraryScanFanoutConcurrency": "Limit der Parallelen Aufgaben für das Scanen der Bibliotheken", - "LibraryScanFanoutConcurrencyHelp": "Anzahl der Maximalen parallelen Aufgaben während des Bibliotheksscans. Wenn sie diesen Wert auf 0 Setzten werden soviele parallelen Aufgaben gestartet wie dieser Instanz/auf diesem System vorhanden sind. WARNUNG: Wenn Sie diese Zahl zu hoch einstellen, kann es zu Problemen mit Bibliotheken die über das Netzwerk verbunden sind kommen; wenn dies der fall ist, senken Sie diese Zahl.", + "LibraryScanFanoutConcurrencyHelp": "Anzahl der Maximalen parallelen Aufgaben während des Bibliotheksscans. Wenn Sie diesen Wert auf 0 lassen, wird ein Limit auf Grundlage der Kernanzahl Ihres Systems festgelegt. WARNUNG: Wenn Sie diese Zahl zu hoch einstellen, kann es zu Problemen mit Bibliotheken, die über das Netzwerk verbunden sind, kommen; wenn dies der Fall ist, senken Sie diese Zahl.", "PlaylistError.AddFailed": "Fehler beim Hinzufügen zur Wiedergabeliste", "PlaylistError.CreateFailed": "Fehler beim Erstellen der Wiedergabeliste", "SavePassword": "Passwort speichern", @@ -2005,6 +2005,12 @@ "LabelDevice": "Gerät", "LastActive": "Zuletzt aktiv", "CopyLogSuccess": "Protokollinhalte erfolgreich kopiert.", - "Retry": "Erneut Versuchen", - "LogLoadFailure": "Fehler beim Laden der Protokolldatei. Sie wird möglicherweise noch beschrieben." + "Retry": "Erneut versuchen", + "LogLoadFailure": "Fehler beim Laden der Protokolldatei. Sie wird möglicherweise noch beschrieben.", + "MetadataNfoLoadError": "NFO-Einstellungen für Metadaten konnten nicht geladen werden", + "DisplayLoadError": "Ein Fehler trat während des Ladens der Konfigurationsdaten auf.", + "MetadataImagesLoadError": "Einstellungen für Metadaten konnten nicht geladen werden", + "HeaderPageNotFound": "Seite nicht gefunden", + "PageNotFound": "Dies ist nicht die Seite, die Sie suchen.", + "SettingsPageLoadError": "Einstellungsseite konnte nicht geladen werden" } diff --git a/src/strings/el.json b/src/strings/el.json index 4a390a1018..df50ffa1b5 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -99,7 +99,7 @@ "ColorTransfer": "Μεταφορά χρώματος", "CommunityRating": "Βαθμολογία Κοινότητας", "Composer": "Συνθέτης", - "ConfigureDateAdded": "Καθορίστε πώς προστίθενται τα μεταδεδομένα για την \"Ημερομηνία προσθήκης\" στον Πίνακα Ελέγχου > Βιβλιοθήκες - Ρυθμίσεις NFO", + "ConfigureDateAdded": "Καθορίστε πώς προστίθενται τα μεταδεδομένα για την \"Ημερομηνία προσθήκης\" στον Πίνακα Ελέγχου > Βιβλιοθήκες > Προβολή", "ConfirmDeleteImage": "Διαγραφή εικόνας;", "ConfirmDeleteItem": "Η διαγραφή αυτού του στοιχείου θα το διαγράψει τόσο από το σύστημα αρχείων όσο και από τη βιβλιοθήκη πολυμέσων σας. Είστε βέβαιοι ότι θέλετε να συνεχίσετε;", "ConfirmDeleteItems": "Η διαγραφή αυτών των στοιχείων θα τα διαγράψει τόσο από το σύστημα αρχείων όσο και από τη βιβλιοθήκη πολυμέσων σας. Είστε βέβαιοι ότι θέλετε να συνεχίσετε;", @@ -119,7 +119,7 @@ "DefaultSubtitlesHelp": "Οι υπότιτλοι φορτώνονται με βάση τις προεπιλεγμένες και αναγκασμένες σημαίες στα ενσωματωμένα μεταδεδομένα. Οι προτιμήσεις γλώσσας εξετάζονται όταν υπάρχουν πολλές επιλογές.", "Delete": "Διαγραφή", "DeleteDeviceConfirmation": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν τη συσκευή; Θα εμφανιστεί ξανά την επόμενη φορά που ένας χρήστης θα συνδεθεί με αυτή.", - "DeleteImage": "διαγράψτε την εικόνα", + "DeleteImage": "Διαγραφή εικόνας", "DeleteImageConfirmation": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την εικόνα;", "DeleteMedia": "Διαγραφή πολυμέσων", "DeleteUser": "Διαγραφή χρήστη", @@ -165,7 +165,7 @@ "EnableThemeSongsHelp": "Αναπαραγωγή της θεματικής μουσικής στο παρασκήνιο κατά την περιήγηση στη βιβλιοθήκη.", "EnableThemeVideosHelp": "Αν είναι ενεργοποιημένη, τα βίντεο θεμάτων θα αναπαράγονται στο παρασκήνιο κατά την περιήγηση στη βιβλιοθήκη.", "Ended": "Τέλος", - "EndsAtValue": "Τελειώνει σε {0}", + "EndsAtValue": "Τελειώνει στις {0}", "Episodes": "Επεισόδια", "ErrorAddingMediaPathToVirtualFolder": "Παρουσιάστηκε σφάλμα κατά την προσθήκη της διαδρομής πολυμέσων. Παρακαλούμε βεβαιωθείτε ότι η διαδρομή είναι έγκυρη και ότι το Jellyfin έχει πρόσβαση σε αυτήν.", "ErrorDeletingItem": "Παρουσιάστηκε σφάλμα κατά τη διαγραφή του στοιχείου από τον σέρβερ. Ελέγξτε ότι το Jellyfin έχει πρόσβαση εγγραφής στο φάκελο πολυμέσων και δοκιμάστε ξανά.", @@ -430,7 +430,7 @@ "LabelEnableDlnaServer": "Ενεργοποίηση DLNA σέρβερ", "LabelEnableDlnaServerHelp": "Επιτρέπει στις συσκευές UPnP στο δίκτυό σας να περιηγούνται και να αναπαράγουν περιεχόμενο.", "LabelEnableHardwareDecodingFor": "Ενεργοποίηση αποκωδικοποίησης υλικού για", - "LabelEnableRealtimeMonitor": "Ενεργοποιήστε την παρακολούθηση σε πραγματικό χρόνο", + "LabelEnableRealtimeMonitor": "Ενεργοποίηση παρακολούθησης σε πραγματικό χρόνο", "LabelEnableRealtimeMonitorHelp": "Οι αλλαγές στα αρχεία θα υποβληθούν αμέσως σε επεξεργασία στα υποστηριζόμενα συστήματα αρχείων.", "LabelEnableSingleImageInDidlLimit": "Περιορισμός σε ενιαία ενσωματωμένη εικόνα", "LabelEnableSingleImageInDidlLimitHelp": "Ορισμένες συσκευές δεν θα έχουν σωστή απόδοση αν ενσωματωθούν πολλές εικόνες μέσα στο DIDL.", @@ -439,7 +439,7 @@ "LabelEvent": "Γεγονός", "LabelEveryXMinutes": "Κάθε", "LabelExtractChaptersDuringLibraryScan": "Εξαγωγή εικόνων κεφαλαίου κατά τη διάρκεια της σάρωσης βιβλιοθήκης", - "LabelExtractChaptersDuringLibraryScanHelp": "Δημιουργήστε εικόνες κεφαλαίου όταν εισάγονται βίντεο κατά τη σάρωση της βιβλιοθήκης. Διαφορετικά, θα εξαχθούν κατά τη διάρκεια της προγραμματισμένης διεργασίας των εικόνων κεφαλαίου, επιτρέποντας στην τακτική σάρωση της βιβλιοθήκης να ολοκληρωθεί γρηγορότερα.", + "LabelExtractChaptersDuringLibraryScanHelp": "Δημιουργία εικόνων κεφαλαίου όταν εισάγονται βίντεο κατά τη σάρωση της βιβλιοθήκης. Διαφορετικά, θα εξαχθούν κατά τη διάρκεια της προγραμματισμένης διεργασίας των εικόνων κεφαλαίου, επιτρέποντας την ταχύτερη ολοκλήρωση της τακτικής σάρωσης βιβλιοθήκης.", "LabelFailed": "Αποτυχία", "LabelFinish": "Τέλος", "LabelFont": "Γραμματοσειρά", @@ -530,7 +530,7 @@ "LabelPlayDefaultAudioTrack": "Αναπαραγωγή προεπιλεγμένου κομματιού ήχου ανεξάρτητα από τη γλώσσα", "LabelPlaylist": "Λίστα", "LabelPreferredDisplayLanguage": "Προτιμώμενη γλώσσα εμφάνισης", - "LabelPreferredSubtitleLanguage": "Προτεινόμενη Γλώσσα υποτίτλων", + "LabelPreferredSubtitleLanguage": "Προτιμώμενη γλώσσα υποτίτλων", "LabelProfileCodecsHelp": "Διαχωρίζονται με κόμμα. Αυτό μπορεί να μείνει κενό για να εφαρμοστεί σε όλα τα codecs.", "LabelProfileContainersHelp": "Διαχωρίζονται με κόμμα. Αυτό μπορεί να μείνει κενό για να εφαρμοστεί σε όλα τα containers.", "LabelProtocol": "Πρωτόκολλο", @@ -552,18 +552,18 @@ "LabelScreensaver": "Προφύλαξη οθόνης", "LabelSeasonNumber": "Αριθμός κύκλου", "LabelSelectFolderGroups": "Αυτόματη ομαδοποίηση περιεχομένου από τους ακόλουθους φακέλους σε προβολές όπως ταινίες, μουσική και τηλεόραση", - "LabelSelectFolderGroupsHelp": "Οι φάκελοι που δεν έχουν επιλεγεί θα εμφανίζονται από μόνοι τους στη δική τους άποψη.", + "LabelSelectFolderGroupsHelp": "Οι φάκελοι που δεν έχουν επιλεγεί θα εμφανίζονται από μόνοι τους στη δική τους προβολή.", "LabelSelectUsers": "Επιλογή Χρηστών", "LabelSelectVersionToInstall": "Επιλέξτε έκδοση για εγκατάσταση", "LabelSendNotificationToUsers": "Στείλτε την ειδοποίηση στη διεύθυνση", "LabelSerialNumber": "Σειριακός Αριθμός", "LabelSeriesRecordingPath": "Διαδρομή εγγραφής σειρών", "LabelServerHostHelp": "192.168.1.100:8096 ή https://myserver.com", - "LabelSkipBackLength": "Παράλειψη πίσω μήκους", + "LabelSkipBackLength": "Παράλειψη προς τα πίσω", "LabelSkipForwardLength": "Παράλειψη προς τα εμπρός", "LabelSkipIfAudioTrackPresent": "Παράλειψη εάν το προεπιλεγμένο ηχητικό κομμάτι ταιριάζει με τη γλώσσα λήψης", "LabelSkipIfGraphicalSubsPresent": "Παράλειψη εάν το βίντεο περιέχει ήδη ενσωματωμένους υπότιτλους", - "LabelSkipIfGraphicalSubsPresentHelp": "Κρατώντας εκδόσεις κειμένου των υπότιτλων θα έχει ως αποτέλεσμα πιο την αποτελεσματική παράδοση και θα μειώσει την πιθανότητα της μετακωδικοποίησης βίντεο.", + "LabelSkipIfGraphicalSubsPresentHelp": "Η διατήρηση των εκδόσεων κειμένου των υπότιτλων θα έχει ως αποτέλεσμα πιο την αποτελεσματική παράδοση και θα μειώσει την πιθανότητα διακωδικοποίησης βίντεο.", "LabelSonyAggregationFlagsHelp": "Καθορίζει το περιεχόμενο του στοιχείου 'aggregationFlags' στο 'urn:schemas-sonycom:av' namespace.", "LabelSortBy": "Ταξινόμηση κατά", "LabelSortOrder": "Σειρά ταξινόμησης", @@ -616,7 +616,7 @@ "Live": "Ζωντανά", "LiveBroadcasts": "Ζωντανές εκπομπές", "LiveTV": "ΖΩΝΤΑΝΗ ΤΗΛΕΌΡΑΣΗ", - "Logo": "λογότυπο", + "Logo": "Λογότυπο", "ManageLibrary": "Διαχείριση βιβλιοθήκης", "ManageRecording": "Διαχείριση Εγγραφών", "MarkPlayed": "έχει αναπαραχθεί", @@ -699,35 +699,35 @@ "Next": "Επόμενο", "NextUp": "Επόμενο", "No": "Οχι", - "MessageNoNextUpItems": "Δεν βρέθηκε κανένα. Ξεκινήστε παρακολουθώντας τις εκπομπές σας!", + "MessageNoNextUpItems": "Δεν βρέθηκε τίποτα. Ξεκινήστε να παρακολουθείτε τις σειρές σας!", "MessageNoPluginConfiguration": "Αυτό το plugin δεν απαιτεί ρυθμίσεις.", "NoSubtitleSearchResultsFound": "Δεν βρέθηκαν αποτελέσματα.", - "NoSubtitlesHelp": "Οι υπότιτλοι δεν θα φορτωθούν από προεπιλογή.Μπορούν ακόμα να ενεργοποιούνται χειροκίνητα κατά την αναπαραγωγή.", + "NoSubtitlesHelp": "Οι υπότιτλοι δεν θα φορτωθούν από προεπιλογή. Μπορούν να ενεργοποιηθούν χειροκίνητα κατά την αναπαραγωγή.", "None": "Κανένα", "Normal": "Κανονικό", "NumLocationsValue": "{0} φάκελοι", - "Off": "Κανένας", + "Off": "Ανενεργό", "OneChannel": "Ένα κανάλι", "OnlyForcedSubtitles": "Μόνο αναγκασμένοι υπότιτλοι", "OnlyForcedSubtitlesHelp": "Μόνο οι υπότιτλοι που έχουν επισημανθεί ως αναγκασμένοι θα φορτωθούν.", - "OnlyImageFormats": "Μόνο μορφές εικόνων (VOBSUB, PGS, SUB / IDX κ.λπ.)", + "OnlyImageFormats": "Μόνο μορφές εικόνων (VobSub, PGS, SUB)", "OptionAdminUsers": "Διαχειριστές", "OptionAllUsers": "Ολοι οι χρήστες", - "OptionAllowAudioPlaybackTranscoding": "Επέτρεψε την αναπαραγωγή μουσικής που χρειάζεται αναπροσαρμογή", - "OptionAllowBrowsingLiveTv": "ΖΩΝΤΑΝΗ ΤΗΛΕΩΡΑΣΗ", + "OptionAllowAudioPlaybackTranscoding": "Να επιτρέπεται η αναπαραγωγή μουσικής που χρειάζεται διακωδικοποίηση", + "OptionAllowBrowsingLiveTv": "Να επιτρέπεται η πρόσβαση στη Ζωντανή Τηλεόραση", "OptionAllowContentDownloading": "Επιτρέπετε η λήψη πολυμέσων", "OptionAllowLinkSharing": "Να επιτρέπεται η κοινή χρήση των πολυμέσων", - "OptionAllowLinkSharingHelp": "Διανέμονται μόνο ιστοσελίδες που περιέχουν πληροφορίες μέσων. Τα αρχεία πολυμέσων δεν μοιράζονται ποτέ δημόσια. Οι μετοχές είναι περιορισμένες χρονικά και θα λήξουν μετά από {0} ημέρες.", - "OptionAllowManageLiveTv": "Επιτρέψτε τη διαχείριση της ζωντανής τηλεοπτικής εγγραφής", - "OptionAllowMediaPlayback": "Δυνατότητα αναπαραγωγής πολυμέσων", + "OptionAllowLinkSharingHelp": "Διαμοιράζονται μόνο ιστοσελίδες που περιέχουν πληροφορίες μέσων. Τα αρχεία πολυμέσων δεν διαμοιράζονται ποτέ δημόσια. Οι διαμοιρασμοί είναι περιορισμένοι χρονικά και θα λήξουν μετά από {0} ημέρες.", + "OptionAllowManageLiveTv": "Να επιτρέπεται η διαχείριση της εγγραφής ζωντανής τηλεοπτικής", + "OptionAllowMediaPlayback": "Να επιτρέπεται η αναπαραγωγή πολυμέσων", "OptionAllowMediaPlaybackTranscodingHelp": "Ο περιορισμός της πρόσβασης στη διακωδικοποίηση μπορεί να προκαλέσει αποτυχίες αναπαραγωγής στους διαμεσολαβητές αναπαραγωγής λόγω μη υποστηριζόμενων μορφών μέσων.", "OptionAllowRemoteControlOthers": "Επιτρέψτε τον τηλεχειρισμό άλλων χρηστών", "OptionAllowRemoteSharedDevices": "Επιτρέψτε τον τηλεχειρισμό των κοινόχρηστων συσκευών", "OptionAllowRemoteSharedDevicesHelp": "Οι συσκευές DLNA θεωρούνται κοινές έως ότου ο χρήστης αρχίσει να τις ελέγχει.", - "OptionAllowSyncTranscoding": "Επιτρέψτε τη λήψη που χρειάζεται αναδιαμόρφωση", + "OptionAllowSyncTranscoding": "Να επιτρέπεται η λήψη και ο συγχρονισμός πολυμέσων που απαιτούν διακωδικοποίηση", "OptionAllowUserToManageServer": "Επιτρέψτε σε αυτόν τον χρήστη να διαχειρίζεται το διακομιστή", "OptionAllowVideoPlaybackRemuxing": "Επέτρεψε την αναπαραγωγή βίντεο που χρειάζεται αναπροσαρμογή", - "OptionAllowVideoPlaybackTranscoding": "Επέτρεψε την αναπαραγωγή βίντεο που χρειάζεται αναπροσαρμογή", + "OptionAllowVideoPlaybackTranscoding": "Να επιτρέπεται η αναπαραγωγή βίντεο που απαιτεί διακωδικοποίηση", "OptionCommunityRating": "Βαθμολογία Κοινότητας", "OptionCriticRating": "Βαθμολογία κριτών", "OptionCustomUsers": "Προσαρμοσμένο", @@ -754,7 +754,7 @@ "OptionHasThemeSong": "Θεματικό Τραγούδι", "OptionHasThemeVideo": "Θεματικό Βίντεο", "OptionHideUser": "Απόκρυψη αυτού του χρήστη από τις οθόνες σύνδεσης", - "OptionHideUserFromLoginHelp": "Χρήσιμο για ιδιωτικούς ή κρυφό λογαριασμούς διαχειριστή. Ο χρήστης θα πρέπει να συνδεθεί χειροκίνητα εισάγοντας το όνομα χρήστη και τον κωδικό πρόσβασής του.", + "OptionHideUserFromLoginHelp": "Χρήσιμο για ιδιωτικούς ή κρυφούς λογαριασμούς διαχειριστή. Ο χρήστης θα πρέπει να συνδεθεί χειροκίνητα εισάγοντας το όνομα χρήστη και τον κωδικό πρόσβασής του.", "OptionImdbRating": "Βαθμολογία IMDb", "OptionLikes": "Συμπαθεί", "OptionMax": "Μέγιστο", @@ -768,9 +768,9 @@ "OptionPlainVideoItemsHelp": "Όλα τα βίντεο αναφέρονται στο DIDL ως \"object.item.videoItem\" αντί για πιο συγκεκριμένο τύπο, όπως \"object.item.videoItem.movie\".", "OptionPlayCount": "Φορές Αναπαραγωγής", "OptionPremiereDate": "Ημερομηνία πρεμιέρας", - "OptionReleaseDate": "Ημερομηνία Προβολής", + "OptionReleaseDate": "Ημερομηνία κυκλοφορίας", "OptionResumable": "Αναληπτέος", - "OptionSaveMetadataAsHidden": "Αποθηκεύστε τα μεταδεδομένα και τις εικόνες ως κρυφά αρχεία", + "OptionSaveMetadataAsHidden": "Αποθήκευση μεταδεδομένων και εικόνων ως κρυφά αρχεία", "OptionSubstring": "Υποσύνολο", "OptionTrackName": "Όνομα Αρχείου", "OptionTvdbRating": "Βαθμολογία TheTVDB", @@ -779,11 +779,11 @@ "OptionWeekdays": "Καθημερινές", "OptionWeekends": "Σαββατοκύριακα", "OptionWeekly": "Εβδομαδιαία", - "OriginalAirDateValue": "Αρχική ημερομηνία κυκλοφορίας: {0}", + "OriginalAirDateValue": "Ημερομηνία πρώτης προβολής: {0}", "Overview": "Επισκόπηση", - "PackageInstallCancelled": "Η εγκατάσταση {0} (version {1}) ακυρώθηκε.", - "PackageInstallCompleted": "Η εγκατάσταση {0} (version {1}) ολοκληρώθηκε.", - "PackageInstallFailed": "{0} (version {1}) Η εγκατάσταση απέτυχε.", + "PackageInstallCancelled": "Η εγκατάσταση του {0} (version {1}) ακυρώθηκε.", + "PackageInstallCompleted": "Η εγκατάσταση του {0} (version {1}) ολοκληρώθηκε.", + "PackageInstallFailed": "Η εγκατάσταση του {0} (version {1}) απέτυχε.", "ParentalRating": "Καταλληλότητα", "PasswordMatchError": "Ο κωδικός πρόσβασης και ο κωδικός επιβεβαίωσης πρέπει να είναι ίδιοι.", "PasswordResetComplete": "Ο κωδικός πρόσβασης επαναφέρθηκε.", @@ -806,7 +806,7 @@ "Playlists": "Λίστες αναπαραγωγής", "PleaseConfirmPluginInstallation": "Παρακαλώ κάντε κλικ στο OK για να επιβεβαιώσετε ότι έχετε διαβάσει τα ανωτέρω και επιθυμείτε να προχωρήσετε με την εγκατάσταση του πρόσθετου.", "PleaseEnterNameOrId": "Εισαγάγετε ένα όνομα ή ένα εξωτερικό αναγνωριστικό.", - "PleaseRestartServerName": "Κάντε επανεκκίνηση του Jellyfin {0}.", + "PleaseRestartServerName": "Παρακαλώ κάντε επανεκκίνηση του Jellyfin σε {0}.", "PleaseSelectTwoItems": "Επιλέξτε τουλάχιστον δύο στοιχεία.", "MessagePluginInstalled": "Η προσθήκη έχει εγκατασταθεί με επιτυχία. Θα πρέπει να γίνει επανεκκίνηση του διακομιστή Jellyfin για να εφαρμοστούν οι αλλαγές.", "Premiere": "Πρεμιέρα", @@ -930,10 +930,10 @@ "TitlePlayback": "Αναπαραγωγή", "TrackCount": "{0} κομμάτια", "Trailers": "Τρέϊλερς", - "Transcoding": "Κωδικοποίηση", + "Transcoding": "Διακωδικοποίηση", "Tuesday": "Τρίτη", "Uniform": "ομοειδής", - "UninstallPluginConfirmation": "Είσαι σίγουρος ότι θέλεις να απεγκαταστήσεις το {0};", + "UninstallPluginConfirmation": "Θέλετε σίγουρα να απεγκαταστήσετε το {0};", "HeaderUninstallPlugin": "απεγκατάστησετε το plugin", "Unmute": "Με ήχο", "Unplayed": "Δεν παίχθηκε", @@ -1016,9 +1016,9 @@ "ButtonOk": "Οκ", "ButtonNetwork": "Δίκτυο", "AllowOnTheFlySubtitleExtractionHelp": "Οι ενσωματωμένοι υπότιτλοι μπορούν να εξαχθούν από βίντεο και να σταλούν στους διαμεσολαβητές αναπαραγωγής σε απλό κείμενο για να αποφευχθούν μετατροπές βίντεο. Σε μερικά συστήματα αυτό μπορεί να πάρει πολύ ώρα και να κάνει το βίντεο να κολλάει κατά την διάρκεια της εξαγωγής. Απενεργοποιήστε το για να έχετε ενσωματωμένους υπότιτλους πάνω στο βίντεο όταν αυτοί δεν υποστηρίζονται από την συσκευή.", - "AllowOnTheFlySubtitleExtraction": "Επίτρεψε την εξαγωγή υποτίτλων σε πραγματικό χρόνο", + "AllowOnTheFlySubtitleExtraction": "Να επιτρέπεται η εξαγωγή υποτίτλων σε πραγματικό χρόνο", "AllowMediaConversionHelp": "Παραχώρησε ή στέρησε πρόσβαση στην λειτουργία μετατροπής μέσων.", - "AllowHWTranscodingHelp": "Επιτρέπει τον δέκτη να διακωδικοποιεί τις ροές σε πραγματικό χρόνο. Αυτό μπορεί να βοηθήσει στην ελάττωση του φόρτου διακωδικοποίησης που απαιτείται από τον διακομιστή.", + "AllowHWTranscodingHelp": "Να επιτρέπεται η διακωδικοποίηση των ροών από τον δέκτη σε πραγματικό χρόνο. Αυτό μπορεί να βοηθήσει στην ελάττωση του φόρτου διακωδικοποίησης που απαιτείται από τον διακομιστή.", "Alerts": "Προειδοποίηση", "LeaveBlankToNotSetAPassword": "Μπορείτε να αφήσετε αυτό το πεδίο κενό για να μην ορίσετε κωδικό πρόσβασης.", "DashboardArchitecture": "Αρχιτεκτονική:{0}", @@ -1087,7 +1087,7 @@ "MusicVideos": "Μουσικά Βίντεο", "Bwdif": "Φίλτρο παρεμβολής Bob Weaver (BWDIF)", "Arranger": "Ταξιθέτηση", - "AllowTonemappingHelp": "Η αντιστοίχηση απόχρωσης μπορεί να αλλάξει το δυναμικό εύρος ενός βίντεο από HDR σε SDR διατηρώντας την ευκρίνεια και τα χρώματα της εικόνας, τα οποία είναι σημαντικές πληροφορίες για την απόδοση της αρχικής σκηνής. Προς το παρόν δουλεύει μόνο όταν μετακωδικοποιούνται βίντεο με ενσωματωμένα μεταδεδομένα 10bit HDR10, HLG και DoVi. Αυτή η επιλογή απαιτεί το αντίστοιχο πρόγραμμα εκτέλεσης GPGPU.", + "AllowTonemappingHelp": "Η αντιστοίχιση τονικότητας μπορεί να αλλάξει το δυναμικό εύρος ενός βίντεο από HDR σε SDR διατηρώντας την ευκρίνεια και τα χρώματα της εικόνας, τα οποία είναι σημαντικές πληροφορίες για την απόδοση της αρχικής σκηνής. Προς το παρόν λειτουργεί μόνο με βίντεο 10bit HDR10, HLG και DoVi. Αυτή η επιλογή απαιτεί το αντίστοιχο πρόγραμμα εκτέλεσης GPGPU.", "AgeValue": "({0} έτη)", "OptionBluray": "BD", "MediaInfoTimestamp": "Xρονική σφραγίδα", @@ -1108,14 +1108,14 @@ "LabelOptionalNetworkPath": "Φάκελος κοινού δικτύου", "LabelMetadataSaversHelp": "Επιλογή των μορφών αρχείων για χρήση κατά την αποθήκευση των μεταδεδομένων σας.", "LabelMetadataReaders": "Αναγνώστες μεταδεδομένων", - "LabelLogs": "Καταγραφές", + "LabelLogs": "Αρχεία καταγραφής", "LabelKodiMetadataSaveImagePaths": "Αποθήκευση διαδρομών εικόνων εντός αρχείων NFO", "LabelKodiMetadataDateFormatHelp": "Όλες οι ημερομηνίες εντός των αρχείων NFO θα αναλυθούν χρησιμοποιώντας αυτή τη μορφή.", "LabelKodiMetadataDateFormat": "Μορφή ημερομηνίας κυκλοφορίας", "LabelKidsCategories": "Κατηγορίες για παιδιά", "LabelImportOnlyFavoriteChannels": "Περιορισμός στα κανάλια επιλεγμένα ως αγαπημένα", "LabelImageFetchersHelp": "Ενεργοποιήστε και ταξινομήστε τα προγράμματα λήψης εικόνων που προτιμάτε με σειρά προτεραιότητας.", - "LabelH264Crf": "Κωδικοποίηση H.264 CRF", + "LabelH264Crf": "CRF κωδικοποίησης H.264", "LabelFileOrUrl": "Αρχείο ή URL", "LabelDidlMode": "Κατάσταση DIDL", "LabelDateAddedBehaviorHelp": "Αν υπάρχει τιμή στα μεταδεδομένα, θα εμφανίζεται πάντα πριν από οποιαδήποτε από αυτές τις επιλογές.", @@ -1126,7 +1126,7 @@ "DisableCustomCss": "Απενεργοποίηση προσαρμοσμένου κώδικα CSS που παρέχεται από τον διακομιστή", "ButtonExitApp": "Έξοδος από την Εφαρμογή", "AddToFavorites": "Προσθήκη στα αγαπημένα", - "EnableTonemapping": "Ενεργοποίση χαρτογράφησης Απόχρωσης", + "EnableTonemapping": "Ενεργοποίηση αντιστοίχισης τονικότητας", "H264CrfHelp": "Ο Συντελεστής Σταθερής Αποτίμησης (Constant Rate Factor - CRF) είναι η προκαθορισμένη ρύθμιση ποιότητας για κωδικοποιητές x264 και x265 που χρησιμοποιούν λογισμικό. Μπορείτε να θέσετε τιμές μεταξύ 0 και 51, όπου οι χαμηλότερες τιμές θα καταλήξουν σε καλύτερη ποιότητα (με κόστος μεγαλύτερα αρχεία). Οι λογικές τιμές είναι μεταξύ 18 και 25. Προκαθορισμένες τιμές για x264 είναι 23 και για x265 είναι 28, οπότε μπορείτε να χρησιμοποιήσετε αυτές τις τιμές ως σημείο εκκίνησης. Οι κωδικοποιητές που χρησιμοποιούν υλικό δεν χρησιμοποιούν αυτές τις ρυθμίσεις.", "DeinterlaceMethodHelp": "Επιλέξτε ποια μέθοδο απόμπλεξης να χρησιμοποιείται όταν διακωδικοποιείται συμπεριμπλεγμένο περιεχόμενο. Όταν είναι ενεργοποιημένη η επιτάχυνση με χρήση υλικού που υποστηρίζει απόμπλεξη με χρήση υλικού, θα χρησιμοποιηθεί η απόμπλεξη με χρήση υλικού αντί για αυτή την ρύθμιση.", "DirectPlayHelp": "Το πηγαίο αρχείο είναι απόλυτα συμβατό με αυτόν τον client και η συνεδρία λαμβάνει το αρχείο χωρίς αλλαγές.", @@ -1142,14 +1142,14 @@ "GoogleCastUnsupported": "Δεν υποστηρίζεται το Google Cast", "Framerate": "Ρυθμός καρέ", "FFmpegSavePathNotFound": "Δεν μπορέσαμε να βρούμε το FFmpeg χρησιμοποιώντας το μονοπάτι που εισάγατε. Απαιτείται επίσης το FFprobe και πρέπει να βρίσκεται στον ίδιο φάκελο. Τα μέρη αυτά συνήθως πακετάρονται μαζί, στην ίδια λήψη. Παρακαλούμε ελέγξτε το μονοπάτι και δοκιμάστε ξανά.", - "FetchingData": "Ανακτώνται περισσότερα δεδομένα", + "FetchingData": "Ανάκτηση περισσότερων δεδομένων", "ErrorPlayerNotFound": "Δεν βρέθηκε αναπαραγωγέας για τα πολυμέσα που ζητήθηκαν.", "Engineer": "Μηχανικός ήχου", "EnableRewatchingNextUpHelp": "Ενεργοποιήστε την εμφάνιση επεισοδίων που έχετε ήδη παρακολουθήσει στις ενότητες 'Επόμενα'.", "EnableRewatchingNextUp": "Ενεργοποιήστε την επανάληψη παρακολούθησης στα 'Επόμενα'", "EnableBlurHash": "Ενεργοποίηση θολών προσωρινών εικόνων", "Cursive": "Καλλιγραφικό", - "CopyFailed": "Δεν μπόρεσε να αντιγραφεί", + "CopyFailed": "Δεν ήταν δυνατή η αντιγραφή", "Copy": "Αντιγραφή", "Copied": "Αντιγράφηκε", "Conductor": "Μαέστρος", @@ -1192,7 +1192,7 @@ "MessagePlaybackError": "Υπήρξε ένα σφάλμα στην αναπαραγωγή αυτού του αρχείου στο δέκτη Google Cast σας.", "MessageChromecastConnectionError": "Ο δέκτης Google Cast σας δε μπορεί να επικοινωνήσει με το διακομιστή Jellyfin. Παρακαλούμε ελέγξτε τη σύνδεση και προσπαθήστε ξανά.", "LabelSelectStereo": "Στερεοφωνικό", - "LabelAllowedAudioChannels": "Μέγιστα Επιτρεπόμενα Κανάλια Ήχου", + "LabelAllowedAudioChannels": "Μέγιστος επιτρεπόμενος αριθμός καναλιών ήχου", "LabelAlbumArtMaxResHelp": "Μέγιστη ανάλυση του γραφικού άλμπουμ μέσω του πεδίου 'upnp:albumArtURI'.", "LabelAirsAfterSeason": "Προβάλλεται μετά τη σεζόν", "LabelChromecastVersion": "Έκδοση Google Cast", @@ -1253,7 +1253,7 @@ "DownloadAll": "Λήψη Όλων", "LabelFolder": "Φάκελος", "LabelHDHomerunPortRangeHelp": "Περιορίζει το εύρος της θύρας HDHomeRun UDP σε αυτήν την τιμή. (Η προεπιλογή είναι 1024 - 645535).", - "LabelH265Crf": "H.265 που κωδικοποιεί CRF", + "LabelH265Crf": "CRF κωδικοποίησης H.265", "LabelEnableSSDPTracing": "Ενεργοποίηση SSDP Tracing", "LabelEncoderPreset": "Προεπιλογή κωδικοποίησης", "LabelHardwareEncoding": "Κωδικοποίηση υλικού", @@ -1271,11 +1271,11 @@ "LabelKodiMetadataEnableExtraThumbs": "Αντιγράψτε το extrafanart στο πεδίο extrathumbs", "LabelLibraryPageSizeHelp": "Ορίστε τον αριθμό των στοιχείων που θα εμφανίζονται σε μια σελίδα βιβλιοθήκης. Ορίστε στο 0 για να απενεργοποιήσετε τη σελιδοποίηση.", "LabelMetadataDownloadersHelp": "Ενεργοποιήστε και ταξινομήστε τα προγράμματα λήψης μεταδεδομένων που προτιμάτε με σειρά προτεραιότητας. Τα προγράμματα λήψης χαμηλότερης προτεραιότητας θα χρησιμοποιηθούν μόνο για τη συμπλήρωση πληροφοριών που λείπουν.", - "LabelMaxDaysForNextUpHelp": "Ορίστε τον μέγιστο αριθμό ημερών που μια εκπομπή θα πρέπει να παραμείνει στη λίστα \"Επόμενα\" χωρίς να την παρακολουθήσετε.", + "LabelMaxDaysForNextUpHelp": "Ορίστε τον μέγιστο αριθμό ημερών που μια σειρά θα πρέπει να παραμείνει στη λίστα \"Επόμενα\" χωρίς να την παρακολουθήσετε.", "LabelIconMaxResHelp": "Μέγιστη ανάλυση εικονιδίων που εκτίθενται μέσω της ιδιότητας 'upnp:icon'.", "LabelIdentificationFieldHelp": "Μια έκφραση υποσυμβολοσειράς ή regex χωρίς διάκριση πεζών-κεφαλαίων.", "LabelKodiMetadataUser": "Αποθήκευση δεδομένων παρακολούθησης χρήστη σε αρχεία NFO για", - "LabelKodiMetadataUserHelp": "Αποθηκεύστε δεδομένα παρακολούθησης σε αρχεία NFO για χρήση σε άλλες εφαρμογές.", + "LabelKodiMetadataUserHelp": "Αποθήκευση δεδομένων παρακολούθησης σε αρχεία NFO για χρήση σε άλλες εφαρμογές.", "LabelLibraryPageSize": "Μέγεθος σελίδας βιβλιοθήκης", "LabelMaxDaysForNextUp": "Μέγιστος αριθμός ημερών στα \"Επόμενα\"", "LabelLineup": "Σύνταξη", @@ -1322,7 +1322,7 @@ "LabelVideoRange": "Εύρος βίντεο", "Larger": "Mεγαλύτερο", "LastSeen": "Τελευταία ενέργεια {0}", - "ListPaging": "{0}-{1} of {2}", + "ListPaging": "{0}-{1} από {2}", "Lyricist": "Στιχουργός", "LabelTonemappingRange": "Εύρος αντιστοίχισης τόνου", "LabelTonemappingParam": "Παράμετρος αντιστοίχισης τόνου", @@ -1356,7 +1356,7 @@ "LabelPostProcessorArguments": "Ορίσματα γραμμής εντολών Μετα-επεξεργαστη", "LabelPostProcessorArgumentsHelp": "Χρησιμοποιήστε το {path} ως διαδρομή προς το αρχείο εγγραφής.", "LabelRepositoryNameHelp": "Ένα προσαρμοσμένο όνομα για να διακρίνει αυτό το αποθετήριο από οποιοδήποτε άλλο προστεθεί στον διακομιστή σας.", - "LabelScheduledTaskLastRan": "Τελευταίο τρέξιμο {0}, λαμβάνοντας {1}.", + "LabelScheduledTaskLastRan": "Τελευταία εκτέλεση {0}, πήρε {1}.", "LabelSlowResponseTime": "Χρόνος σε ms μετά τον οποίο μια απόκριση θεωρείται αργή", "LabelSortName": "Ταξινόμηση ονόματος", "LabelSubtitleDownloaders": "Πρόγραμμα λήψης υποτίτλων", @@ -1366,7 +1366,7 @@ "LabelSyncPlayHaltPlayback": "Διακοπή τοπικής αναπαραγωγής", "LabelSyncPlayHaltPlaybackDescription": "Και αγνοήστε τις τρέχουσες ενημερώσεις playlist", "LabelSyncPlayNewGroup": "Νέα ομάδα", - "LabelSyncPlayNewGroupDescription": "Δημιουργήστε μια νέα ομάδα", + "LabelSyncPlayNewGroupDescription": "Δημιουργία μιας νέας ομάδας", "LabelSyncPlayTimeSyncDevice": "Συγχρονισμός χρόνου με", "LabelSyncPlaySettingsSyncCorrection": "Διόρθωση συγχρονισμού", "LabelSyncPlaySettingsMinDelaySpeedToSyncHelp": "Ελάχιστη καθυστέρηση αναπαραγωγής (σε ms) μετά την οποία το SpeedToSync προσπαθεί να διορθώσει τη θέση αναπαραγωγής.", @@ -1388,12 +1388,12 @@ "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", "OptionLoginAttemptsBeforeLockoutHelp": "Η τιμή μηδέν σημαίνει κληρονομιά της προεπιλογής τριών προσπαθειών για τους κανονικούς χρήστες και πέντε για τους διαχειριστές. Η ρύθμιση σε -1 θα απενεργοποιήσει τη δυνατότητα.", "PasswordResetProviderHelp": "Επιλέξτε έναν πάροχο επαναφοράς κωδικού πρόσβασης που θα χρησιμοποιείται όταν αυτός ο χρήστης ζητά επαναφορά κωδικού πρόσβασης.", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Χρησιμοποιήστε τις πληροφορίες επεισοδίου από τα ενσωματωμένα μεταδεδομένα, εάν είναι διαθέσιμα.", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Χρήση πληροφοριών επεισοδίου από τα ενσωματωμένα μεταδεδομένα, εάν είναι διαθέσιμες.", "TonemappingAlgorithmHelp": "Η χαρτογράφηση τόνου μπορεί να ρυθμιστεί με ακρίβεια. Εάν δεν είστε εξοικειωμένοι με αυτές τις επιλογές, απλώς διατηρήστε την προεπιλογή. Η συνιστώμενη τιμή είναι 'BT.2390'.", "UnsupportedPlayback": "Το Jellyfin δεν μπορεί να αποκρυπτογραφήσει περιεχόμενο που προστατεύεται από DRM, αλλά όλο το περιεχόμενο θα δοκιμαστεί ανεξάρτητα, συμπεριλαμβανομένων των προστατευμένων τίτλων. Ορισμένα αρχεία ενδέχεται να εμφανίζονται εντελώς μαύρα λόγω κρυπτογράφησης ή άλλων μη υποστηριζόμενων λειτουργιών, όπως διαδραστικοί τίτλοι.", "XmlTvPathHelp": "Μια διαδρομή προς ένα αρχείο XMLTV. Το Jellyfin θα διαβάζει αυτό το αρχείο και θα το ελέγχει περιοδικά για ενημερώσεις. Είστε υπεύθυνοι για τη δημιουργία και την ενημέρωση του αρχείου.", "UseEpisodeImagesInNextUp": "Χρησιμοποιήστε εικόνες επεισοδίων στις ενότητες «Επόμενο» και «Συνέχεια παρακολούθησης»", - "UseEpisodeImagesInNextUpHelp": "Οι ενότητες \"Επόμενο επάνω\" και \"Συνέχεια παρακολούθησης\" θα χρησιμοποιούν εικόνες επεισοδίων ως μικρογραφίες αντί για την κύρια μικρογραφία της εκπομπής.", + "UseEpisodeImagesInNextUpHelp": "Οι ενότητες \"Επόμενο\" και \"Συνέχεια παρακολούθησης\" θα χρησιμοποιούν εικόνες επεισοδίων ως μικρογραφίες αντί για την κύρια μικρογραφία της σειράς.", "MessageRenameMediaFolder": "Η μετονομασία μιας βιβλιοθήκης πολυμέσων θα έχει ως αποτέλεσμα την απώλεια όλων των μεταδεδομένων, προχωρήστε με προσοχή.", "MessageSyncPlayGroupDoesNotExist": "Η ένταξη στην ομάδα απέτυχε επειδή δεν υπάρχει.", "MessageUnauthorizedUser": "Δεν έχετε εξουσιοδότηση πρόσβασης στον διακομιστή αυτήν τη στιγμή. Επικοινωνήστε με τον διαχειριστή του διακομιστή σας για περισσότερες πληροφορίες.", @@ -1401,9 +1401,9 @@ "MessageUnsetContentHelp": "Το περιεχόμενο θα εμφανίζεται ως απλοί φάκελοι. Για καλύτερα αποτελέσματα, χρησιμοποιήστε τη διαχείριση μεταδεδομένων για να ορίσετε τους τύπους περιεχομένου των υποφακέλων.", "NoNewDevicesFound": "Δε βρέθηκαν νέες συσκευές. Για να προσθέσετε έναν νέο δέκτη, κλείστε αυτό το παράθυρο διαλόγου και εισαγάγετε τις πληροφορίες της συσκευής με μη αυτόματο τρόπο.", "OptionAutomaticallyGroupSeriesHelp": "Οι σειρές που είναι κατανεμημένες σε πολλούς φακέλους σε αυτήν τη βιβλιοθήκη θα συγχωνευθούν αυτόματα σε μια ενιαία σειρά.", - "SaveSubtitlesIntoMediaFolders": "Αποθηκεύστε τους υπότιτλους σε φακέλους πολυμέσων", + "SaveSubtitlesIntoMediaFolders": "Αποθήκευση υπότιτλων στους φακέλους των πολυμέσων", "RemuxHelp1": "Τα μέσα βρίσκονται σε μη συμβατό κοντέινερ αρχείων (MKV, AVI, WMV, κ.λπ.), αλλά τόσο η ροή βίντεο όσο και η ροή ήχου είναι συμβατά με τη συσκευή. Τα μέσα θα επανασυσκευάζονται χωρίς απώλειες αμέσως πριν σταλούν στη συσκευή.", - "PreferFmp4HlsContainerHelp": "Προτιμήστε να χρησιμοποιείτε το fMP4 ως το προεπιλεγμένο κοντέινερ για το HLS, καθιστώντας δυνατή τη ροή περιεχομένου HEVC σε υποστηριζόμενες συσκευές.", + "PreferFmp4HlsContainerHelp": "Προτίμηση χρήσης του fMP4 ως το προεπιλεγμένο κοντέινερ για HLS, καθιστώντας δυνατή τη ροή περιεχομένου HEVC και AV1 σε υποστηριζόμενες συσκευές.", "AudioBitrateNotSupported": "Ο ρυθμός μετάδοσης bit του ήχου δεν υποστηρίζεται", "VideoResolutionNotSupported": "Η ανάλυση του βίντεο δεν υποστηρίζεται", "LabelHardwareEncodingOptions": "Επιλογές κωδικοποίησης υλικού", @@ -1419,7 +1419,7 @@ "MessageGetInstalledPluginsError": "Παρουσιάστηκε σφάλμα κατά τη λήψη της λίστας με τις τρέχουσες εγκατεστημένες προσθήκες.", "MessageNoItemsAvailable": "Δεν υπάρχουν διαθέσιμα στοιχεία αυτήν τη στιγμή.", "MessageNoCollectionsAvailable": "Οι συλλογές σάς επιτρέπουν να απολαμβάνετε εξατομικευμένες ομαδοποιήσεις Ταινιών, Σειρών και Άλμπουμ. Κάντε κλικ στο κουμπί '+' για να ξεκινήσετε τη δημιουργία συλλογών.", - "MessageNoGenresAvailable": "Ενεργοποιήστε ορισμένους παρόχους μεταδεδομένων να αντλούν είδη από το διαδίκτυο.", + "MessageNoGenresAvailable": "Επιτρέψτε σε ορισμένους παρόχους μεταδεδομένων να αντλούν είδη από το διαδίκτυο.", "MessageNoServersAvailable": "Δεν βρέθηκαν διακομιστές με χρήση της αυτόματης ανακάλυψης διακομιστή.", "OptionIsHD": "HD", "OptionMaxActiveSessions": "Ορίστε τον μέγιστο αριθμό ταυτόχρονων περιόδων σύνδεσης χρήστη.", @@ -1435,8 +1435,8 @@ "OptionResElement": "στοιχείο 'res'", "OtherArtist": "Άλλος Καλλιτέχνης", "PlaybackRate": "Ταχύτητα αναπαραγωγής", - "PreferEmbeddedTitlesOverFileNames": "Προτιμήστε τους ενσωματωμένους τίτλους από τα ονόματα αρχείων", - "AllowEmbeddedSubtitlesAllowAllOption": "Επιτρέπονται όλα", + "PreferEmbeddedTitlesOverFileNames": "Προτίμηση ενσωματωμένων τίτλων αντί των ονομάτων αρχείων", + "AllowEmbeddedSubtitlesAllowAllOption": "Να επιτρέπονται όλα", "AllowEmbeddedSubtitlesAllowNoneOption": "Να μην επιτρέπεται κανένα", "AllowEmbeddedSubtitlesAllowTextOption": "Να επιτρέπεται το κείμενο", "Remixer": "Remixer", @@ -1445,10 +1445,10 @@ "ShowParentImages": "Εμφάνιση εικόνων προγράμματος", "Subtitle": "Υπότιτλος", "StoryArc": "Story Arc", - "SubtitleOffset": "Αντισταθμίζμως Υποτίτλων", + "SubtitleOffset": "Αντιστάθμιση Υποτίτλων", "SubtitleVerticalPositionHelp": "Αριθμός γραμμής όπου εμφανίζεται το κείμενο. Οι θετικοί αριθμοί δείχνουν από πάνω προς τα κάτω. Οι αρνητικοί αριθμοί δείχνουν από κάτω προς τα πάνω.", "TabContainers": "Δοχεία", - "TabLogs": "καταγραφές", + "TabLogs": "Αρχεία καταγραφής", "TabNetworking": "Δικτύωση", "TabRepositories": "Αποθετήρια", "TextSent": "Το κείμενο στάλθηκε.", @@ -1484,7 +1484,7 @@ "AudioChannelsNotSupported": "Ο αριθμός των καναλιών ήχου δεν υποστηρίζεται", "AudioSampleRateNotSupported": "Ο ρυθμός δειγματοληψίας του ήχου δεν υποστηρίζεται", "AudioProfileNotSupported": "Το προφίλ του κωδικοποιητή ήχου δεν υποστηρίζεται", - "InterlacedVideoNotSupported": "Το διαπλεκόμενο βίντεο δεν υποστηρίζεται", + "InterlacedVideoNotSupported": "Το πλεγμένο βίντεο δεν υποστηρίζεται", "SecondaryAudioNotSupported": "Τα δευτερεύοντα κομμάτια ήχου δεν υποστηρίζονται", "VideoBitDepthNotSupported": "Τα δευτερεύοντα κομμάτια ήχου δεν υποστηρίζονται", "RefFramesNotSupported": "Τα πλαίσια αναφοράς δεν υποστηρίζονται", @@ -1505,7 +1505,7 @@ "OptionRequirePerfectSubtitleMatchHelp": "Η απαίτηση τέλειας αντιστοίχισης θα φιλτράρει τους υπότιτλους ώστε να περιλαμβάνουν μόνο αυτούς που έχουν δοκιμαστεί και επαληθευτεί με το ακριβές αρχείο βίντεο σας. Η κατάργηση της επιλογής θα αυξήσει την πιθανότητα λήψης των υπότιτλων, αλλά θα αυξήσει τις πιθανότητες εσφαλμένου ή λανθασμένου κειμένου υπότιτλων.", "Other": "Αλλα", "Photo": "Φωτογραφία", - "PreferEmbeddedEpisodeInfosOverFileNames": "Προτιμήστε τις ενσωματωμένες πληροφορίες επεισοδίων από τα ονόματα αρχείων", + "PreferEmbeddedEpisodeInfosOverFileNames": "Προτίμηση ενσωματωμένων πληροφοριών επεισοδίων αντί των ονομάτων αρχείων", "PosterCard": "Κάρτα αφίσας", "Production": "Παραγωγή", "QuickConnectActivationSuccessful": "Ενεργοποιήθηκε με επιτυχία", @@ -1518,30 +1518,30 @@ "SyncPlayGroupDefaultTitle": "ομάδα του {0}", "TitleHostingSettings": "Ρυθμίσεις φιλοξενίας", "TypeOptionPluralMusicArtist": "Μουσικοί Καλλιτέχνες", - "Video": "βίντεο", + "Video": "Βίντεο", "WriteAccessRequired": "Το Jellyfin απαιτεί πρόσβαση εγγραφής σε αυτόν τον φάκελο. Βεβαιωθείτε ότι έχετε πρόσβαση εγγραφής και δοκιμάστε ξανά.", "EnableFallbackFontHelp": "Ενεργοποίηση προσαρμοσμένων εναλλακτικών γραμματοσειρών. Αυτό μπορεί να αποφύγει το πρόβλημα της εσφαλμένης απόδοσης υποτίτλων.", "EnableFallbackFont": "Ενεργοποίηση εναλλακτικών γραμματοσειρών", "LabelDirectStreamingInfo": "Πληροφορίες άμεσης ροής", "LabelRemuxingInfo": "Remuxing Πληροφορίες", "EnableEnhancedNvdecDecoder": "Ενεργοποίηση βελτιωμένου αποκωδικοποιητή NVDEC", - "Controls": "Έλεγχοι", - "ContainerNotSupported": "Το δοχείο δεν υποστηρίζεται", - "SubtitleCodecNotSupported": "Ο κωδικοποιητής υποτίτλων δεν υποστηρίζεται", - "VideoCodecNotSupported": "Ο κωδικοποιητής βίντεο δεν υποστηρίζεται", + "Controls": "Χειριστήρια", + "ContainerNotSupported": "Το κοντέινερ δεν υποστηρίζεται", + "SubtitleCodecNotSupported": "Η κωδικοποίηση των υποτίτλων δεν υποστηρίζεται", + "VideoCodecNotSupported": "Η κωδικοποίηση του βίντεο δεν υποστηρίζεται", "VideoLevelNotSupported": "Το επίπεδο του κωδικοποιητή βίντεο δεν υποστηρίζεται", "VideoProfileNotSupported": "Το προφίλ του κωδικοποιητή βίντεο δεν υποστηρίζεται", "ContainerBitrateExceedsLimit": "Ο ρυθμός μετάδοσης bit του βίντεο υπερβαίνει το όριο", "AudioIsExternal": "Η ροή ήχου είναι εξωτερική", "MessageChangeRecordingPath": "Η αλλαγή του φακέλου εγγραφής σας δεν θα μεταφέρει τις υπάρχουσες εγγραφές από την παλιά θέση στη νέα. Θα χρειαστεί να τα μετακινήσετε χειροκίνητα αν θέλετε.", "OptionAllowContentDownload": "Να επιτρέπεται η λήψη πολυμέσων", - "OptionDateAddedImportTime": "Χρησιμοποιήστε την ημερομηνία που έχει σαρωθεί στη βιβλιοθήκη", + "OptionDateAddedImportTime": "Χρήση της ημερομηνίας που έχει σαρωθεί στη βιβλιοθήκη", "RemuxHelp2": "Το Re-mux χρησιμοποιεί πολύ μικρή επεξεργαστική ισχύ με ποιότητα πολυμέσων χωρίς απώλειες.", "VideoFramerateNotSupported": "Ο ρυθμός καρέ του βίντεο δεν υποστηρίζεται", "MessageSyncPlayDisabled": "Το SyncPlay είναι απενεργοποιημένο.", "TypeOptionPluralSeries": "Τηλεοπτικά προγράμματα", "LabelStereoDownmixAlgorithm": "Αλγόριθμος Stereo Downmix", - "MixedMoviesShows": "Μικτές ταινίες και εκπομπές", + "MixedMoviesShows": "Μικτές Ταινίες και Σειρές", "MoreMediaInfo": "Πληροφορίες πολυμέσων", "MusicArtist": "Μουσικός Καλλιτέχνης", "MusicLibraryHelp": "Διαβάστε τον {0}οδηγό ονομασίας μουσικής{1}.", @@ -1559,7 +1559,7 @@ "MessageImageTypeNotSelected": "Επιλέξτε έναν τύπο εικόνας από το αναπτυσσόμενο μενού.", "MessageNoFavoritesAvailable": "Δεν υπάρχουν διαθέσιμα αγαπημένα αυτήν τη στιγμή.", "MessageNoRepositories": "Δεν υπάρχουν αποθετήρια.", - "MessagePluginInstallDisclaimer": "Οι προσθήκες που έχουν δημιουργηθεί από μέλη της κοινότητας είναι ένας πολύ καλός τρόπος για να βελτιώσετε την εμπειρία σας με πρόσθετες λειτουργίες και προνόμια. Πριν την εγκατάσταση, λάβετε υπόψη τα αποτελέσματα που μπορεί να έχουν στον διακομιστή σας, όπως μεγαλύτερες σαρώσεις βιβλιοθήκης, πρόσθετη επεξεργασία παρασκηνίου και μειωμένη σταθερότητα του συστήματος.", + "MessagePluginInstallDisclaimer": "ΠΡΟΣΟΧΗ: Η εγκατάσταση πρόσθετων από τρίτες πηγές εγκυμονεί κινδύνους. Πιθανόν να περιέχουν ασταθή ή επικίνδυνο κώδικα, και μπορεί να αλλάξει ανά πάσα στιγμή. Εγκαταστήστε πρόσθετα μόνο από πηγές που εμπιστεύεστε και παρακαλούμε να λάβετε υπόψη τα αποτελέσματα που μπορεί να έχουν, συμπεριλαμβανομένης της επικοινωνίας με υπηρεσίες εκτός του διακομιστή σας, μεγαλύτερες σαρώσεις βιβλιοθήκης ή αυξημένο φόρτο λειτουργιών παρασκηνίου.", "MessageSent": "Το μήνυμα στάλθηκε.", "MessageSyncPlayEnabled": "Το SyncPlay ενεργοποιήθηκε.", "MessageSyncPlayErrorMissingSession": "Η ενεργοποίηση του SyncPlay απέτυχε! Λείπει η συνεδρία.", @@ -1592,38 +1592,38 @@ "OptionRequirePerfectSubtitleMatch": "Κατεβάστε μόνο υπότιτλους που ταιριάζουν απόλυτα με αρχεία βίντεο", "MessageCreateAccountAt": "Δημιουργία λογαριασμού στο {0}", "OptionSaveMetadataAsHiddenHelp": "Η αλλαγή αυτού θα ισχύει για νέα μεταδεδομένα που θα αποθηκευτούν στο εξής. Τα υπάρχοντα αρχεία μεταδεδομένων θα ενημερωθούν την επόμενη φορά που θα αποθηκευτούν από τον διακομιστή.", - "OriginalAirDate": "Πρωτότυπη ημερομηνία προβολής", + "OriginalAirDate": "Ημερομηνία πρώτης προβολής", "PathNotFound": "Το μονοπάτι δεν βρέθηκε. Βεβαιωθείτε ότι η διαδρομή είναι έγκυρη και δοκιμάστε ξανά.", "Person": "Άτομο", "PersonRole": "ως {0}", "PlaybackErrorPlaceHolder": "Αυτό είναι ένα σύμβολο κράτησης θέσης για φυσικά μέσα που το Jellyfin δεν μπορεί να παίξει. Τοποθετήστε το δίσκο για αναπαραγωγή.", "PleaseAddAtLeastOneFolder": "Προσθέστε τουλάχιστον έναν φάκελο σε αυτήν τη βιβλιοθήκη κάνοντας κλικ στο κουμπί '+' στην ενότητα 'Φάκελοι'.", "PreferEmbeddedTitlesOverFileNamesHelp": "Καθορίστε τον τίτλο εμφάνισης που θα χρησιμοποιείται όταν δεν υπάρχουν διαθέσιμα μεταδεδομένα Διαδικτύου ή τοπικά μεταδεδομένα.", - "AllowEmbeddedSubtitles": "Απενεργοποιήστε διαφορετικούς τύπους ενσωματωμένων υποτίτλων", - "AllowEmbeddedSubtitlesHelp": "Απενεργοποιήστε τους υπότιτλους που είναι συσκευασμένοι σε κοντέινερ πολυμέσων. Απαιτείται πλήρης ανανέωση της βιβλιοθήκης.", + "AllowEmbeddedSubtitles": "Απενεργοποίηση διαφορετικών τύπων ενσωματωμένων υποτίτλων", + "AllowEmbeddedSubtitlesHelp": "Απενεργοποίηση υποτίτλων που εμπεριέχονται σε κοντέινερ πολυμέσων. Απαιτείται πλήρης ανανέωση της βιβλιοθήκης.", "AllowEmbeddedSubtitlesAllowImageOption": "Να επιτρέπεται η εικόνα", "Preview": "Προεπισκόπηση", "PreviousTrack": "Μετάβαση στο προηγούμενο", "Print": "Εκτύπωσή", "PluginFromRepo": "{0} από το χώρο αποθήκευσης {1}", "QuickConnect": "Γρήγορη σύνδεση", - "QuickConnectAuthorizeCode": "Εισαγάγετε τον κωδικό {0} για να συνδεθείτε", + "QuickConnectAuthorizeCode": "Εισάγετε τον κωδικό {0} για να συνδεθείτε", "QuickConnectAuthorizeSuccess": "Η συσκευή σας πιστοποιήθηκε επιτυχώς!", "QuickConnectDescription": "Για να συνδεθείτε με το Quick Connect, επιλέξτε το κουμπί 'Quick Connect' στη συσκευή από την οποία συνδέεστε και εισαγάγετε τον κωδικό που εμφανίζεται παρακάτω.", "QuickConnectNotActive": "Το Quick Connect δεν είναι ενεργό σε αυτόν τον διακομιστή", "QuickConnectNotAvailable": "Ζητήστε από τον διαχειριστή του διακομιστή σας να ενεργοποιήσει τη Γρήγορη σύνδεση", "RecommendationStarring": "Με πρωταγωνιστή {0}", - "ReleaseGroup": "Ομάδα απελευθέρωσης", + "ReleaseGroup": "Ομάδα κυκλοφορίας", "RememberAudioSelections": "Ορισμός κομματιού ήχου με βάση το προηγούμενο στοιχείο", "RememberAudioSelectionsHelp": "Προσπαθήστε να ρυθμίσετε το κομμάτι ήχου στην πλησιέστερη αντιστοίχιση με το τελευταίο βίντεο.", - "ResetPassword": "Επαναφέρετε τον κωδικό πρόσβασης", + "ResetPassword": "Επαναφορά κωδικού πρόσβασης", "SaveChanges": "Αποθήκευσε τις αλλαγές", "SaveSubtitlesIntoMediaFoldersHelp": "Η αποθήκευση υποτίτλων δίπλα σε αρχεία βίντεο θα επιτρέψει την ευκολότερη διαχείρισή τους.", "QuickConnectAuthorizeFail": "Άγνωστος κωδικός γρήγορης σύνδεσης", "QuickConnectDeactivated": "Το Quick Connect απενεργοποιήθηκε πριν εγκριθεί το αίτημα σύνδεσης", "QuickConnectInvalidCode": "Μη έγκυρος κωδικός γρήγορης σύνδεσης", "Season": "Σειρά", - "SelectServer": "Επιλέξτε Διακομιστής", + "SelectServer": "Επιλογή Διακομιστή", "SeriesDisplayOrderHelp": "Ταξινομήστε επεισόδια κατά ημερομηνία μετάδοσης, παραγγελία DVD ή απόλυτη αρίθμηση.", "SettingsWarning": "Η αλλαγή αυτών των τιμών μπορεί να προκαλέσει αστάθεια ή αποτυχίες συνδεσιμότητας. Εάν αντιμετωπίζετε προβλήματα, συνιστούμε να τα αλλάξετε ξανά στην προεπιλογή.", "SimultaneousConnectionLimitHelp": "Ο μέγιστος αριθμός επιτρεπόμενων ταυτόχρονων ροών. Εισαγάγετε 0 χωρίς όριο.", @@ -1632,7 +1632,7 @@ "SyncPlayAccessHelp": "Η λειτουργία SyncPlay επιτρέπει τον συγχρονισμό της αναπαραγωγής με άλλες συσκευές. Επιλέξτε το επίπεδο πρόσβασης που έχει αυτός ο χρήστης στο SyncPlay.", "ThumbCard": "Κάρτα αντίχειρα", "TypeOptionPluralEpisode": "Επεισόδιά", - "UseDoubleRateDeinterlacingHelp": "Αυτή η ρύθμιση χρησιμοποιεί τον ρυθμό πεδίου κατά την αποσυμπίεση, που συχνά αναφέρεται ως αποσυμπίεση bob, η οποία διπλασιάζει τον ρυθμό καρέ του βίντεο για να παρέχει πλήρη κίνηση όπως αυτή που θα βλέπατε κατά την προβολή πλεγμένων βίντεο σε μια τηλεόραση.", + "UseDoubleRateDeinterlacingHelp": "Αυτή η ρύθμιση χρησιμοποιεί τον ρυθμό πεδίου κατά την απόπλεξη, που συχνά αναφέρεται ως bob deinterlacing, η οποία διπλασιάζει τον ρυθμό καρέ του βίντεο για να παρέχει πλήρη κίνηση όπως αυτή που θα βλέπατε κατά την προβολή πλεγμένων βίντεο σε μια τηλεόραση.", "WeeklyAt": "{0}s στο {1}", "ViewAlbumArtist": "Προβολή καλλιτέχνη άλμπουμ", "Whitelist": "Λευκή λίστα", @@ -1645,11 +1645,11 @@ "LabelFallbackFontPathHelp": "Καθορίστε μια διαδρομή που περιέχει εναλλακτικές γραμματοσειρές για την απόδοση υποτίτλων ASS/SSA. Το μέγιστο επιτρεπόμενο συνολικό μέγεθος γραμματοσειράς είναι 20 MB. Συνιστώνται ελαφριές και φιλικές προς τον Ιστό μορφές γραμματοσειράς όπως το woff2.", "LabelTranscodingInfo": "Πληροφορίες διακωδικοποίησης", "AspectRatioFill": "Γέμισμα", - "PreferFmp4HlsContainer": "Προτιμήστε το fMP4-HLS Media Container", + "PreferFmp4HlsContainer": "Προτίμηση του fMP4-HLS Media Container", "YoutubePlaybackError": "Δεν είναι δυνατή η αναπαραγωγή του ζητούμενου βίντεο.", "YoutubeDenied": "Δεν επιτρέπεται η αναπαραγωγή του ζητούμενου βίντεο σε ενσωματωμένα προγράμματα αναπαραγωγής.", "AllowVppTonemappingHelp": "Πλήρης αντιστοίχιση τόνου βάσει προγράμματος οδήγησης Intel. Προς το παρόν λειτουργεί μόνο σε συγκεκριμένο υλικό με βίντεο HDR10. Αυτό έχει μεγαλύτερη προτεραιότητα σε σύγκριση με άλλη εφαρμογή OpenCL.", - "PreferSystemNativeHwDecoder": "Προτιμήστε τους εγγενείς αποκωδικοποιητές υλικού DXVA ή VA-API του λειτουργικού συστήματος", + "PreferSystemNativeHwDecoder": "Προτίμηση εγγενών αποκωδικοποιητών λειτουργικού συστήματος DXVA ή VA-API υλικού", "EnableIntelLowPowerH264HwEncoder": "Ενεργοποιήστε τον κωδικοποιητή υλικού Intel Low-Power H.264", "AnamorphicVideoNotSupported": "Το αναμορφικό βίντεο δεν υποστηρίζεται", "VideoBitrateNotSupported": "Ο ρυθμός μετάδοσης bit του βίντεο δεν υποστηρίζεται", @@ -1678,17 +1678,17 @@ "Poster": "Αφίσα", "Profile": "Προφίλ", "TabCodecs": "Κωδικοποιητές", - "Thumb": "Αντίχειρας", - "UseDoubleRateDeinterlacing": "Διπλασιάστε τον ρυθμό καρέ κατά την αποσυμπίεση", + "Thumb": "Μικρογραφία", + "UseDoubleRateDeinterlacing": "Διπλασιασμός ρυθμού καρέ κατά την απόπλεξη", "ValueContainer": "Δοχείο: {0}", - "Yadif": "YADIF", + "Yadif": "Yet Another DeInterlacing Filter (YADIF)", "Trailer": "τρέιλερ ταινίας", - "Mixer": "Αναμικτής", + "Mixer": "Μικτής", "MediaInfoDoViTitle": "Τίτλος DV", "LabelEnableAudioVbrHelp": "Το μεταβλητό bitrate προσφέρει καλύτερη ποιότητα από τη μέση αναλογία bitrate, αλλά σε μερικές περιστάσεις μπορεί να προκαλέσει προβλήματα φόρτωσης και συμβατότητας.", "LabelDummyChapterDuration": "Διάστημα", "LabelEnableAudioVbr": "Ενεργοποίηση της VBR κωδικοποίησης ήχων", - "LabelParallelImageEncodingLimit": "Όριο παράλληλης κωδικοποίησης εικόνας", + "LabelParallelImageEncodingLimit": "Οριο παράλληλης κωδικοποίησης εικόνων", "HeaderRecordingMetadataSaving": "Καταγραφή Μεταδεδομένων", "HeaderPerformance": "Επίδοση", "LabelDummyChapterDurationHelp": "Το διάστημα ανάμεσα στα ψεύτικα κεφάλαια. Ορισμός σε 0 για την απενεργοποίηση παραγωγής ψεύτικων κεφαλαίων. Η μεταβολή αυτού δεν θα έχει επίδραση στα ήδη υπάρχοντα ψεύτικα κεφάλαια.", @@ -1750,23 +1750,23 @@ "GoHome": "Μετάβαση στην Αρχική", "LogLevel.Debug": "Εντοπισμός σφαλμάτων", "SubtitleLightGray": "Ανοιχτό γκρι", - "ResolutionMatchSource": "Πηγή αντιστοίχισης", - "SaveRecordingNFO": "Αποθηκεύστε τα μεταδεδομένα εγγραφής EPG στο NFO", + "ResolutionMatchSource": "Ιδιο με την πηγή", + "SaveRecordingNFO": "Αποθήκευση μεταδεδομένων εγγραφής EPG σε NFO", "UnknownError": "Προέκυψε ένα άγνωστο σφάλμα.", "LabelIsHearingImpaired": "Για άτομα με προβλήματα ακοής (SDH)", "AllowAv1Encoding": "Να επιτρέπεται η κωδικοποίηση σε μορφή AV1", "HearingImpairedShort": "ΗI/SDH", "HeaderConfirmRepositoryInstallation": "Επιβεβαιώστε την εγκατάσταση του αποθετηρίου πρόσθετων", "MessageRepositoryInstallDisclaimer": "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Η εγκατάσταση ενός αποθετηρίου πρόσθετου τρίτου μέρους εγκυμονεί κινδύνους. Μπορεί να περιέχει ασταθή ή κακόβουλο κώδικα και μπορεί να αλλάξει ανά πάσα στιγμή. Εγκαταστήστε αποθετήρια μόνο από συντάκτες που εμπιστεύεστε.", - "PreferEmbeddedExtrasTitlesOverFileNames": "Προτιμήστε τους ενσωματωμένους τίτλους από τα ονόματα αρχείων για πρόσθετα", - "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Τα πρόσθετα έχουν συχνά το ίδιο ενσωματωμένο όνομα με τον γονέα, ελέγξτε αυτό για να χρησιμοποιήσετε ενσωματωμένους τίτλους για αυτά ούτως ή άλλως.", + "PreferEmbeddedExtrasTitlesOverFileNames": "Προτίμηση ενσωματωμένων τίτλων αντί των ονομάτων αρχείων για extras", + "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Τα extras έχουν συχνά το ίδιο ενσωματωμένο όνομα με τον γονέα, επιλέξτε το για χρήση ενσωματωμένων τίτλων για αυτά ούτως ή άλλως.", "LabelSegmentKeepSecondsHelp": "Χρονικό διάστημα σε δευτερόλεπτα, για το οποίο τα τμήματα θα διατηρούνται έπειτα από την λήψη τους από τον χρήστη. Λειτουργεί μόνο αν η ανίχνευση τμημάτων είναι ενεργοποιημένη.", "AllowSubtitleManagement": "Επίτρεψε στον χρήστη να επεξεργάζεται υποτίτλους", "AllowContentWithTagsHelp": "Μόνο εμφάνιση πολυμέσων με τουλάχιστον μία από τις καθορισμένες ετικέτες.", "AllowFmp4TranscodingContainerHelp": "Επιτρέψτε το δοχείο μετακωδικοποίησης fMP4 για αυτόν τον δέκτη για να ενεργοποιήσετε τα περιεχόμενα HEVC και HDR. Δεν είναι όλοι οι δέκτες συμβατοί με αυτό το κοντέινερ. Απενεργοποιήστε το εάν αντιμετωπίζετε προβλήματα αναπαραγωγής.", "AllowStreamSharingHelp": "Επιτρέψτε στο Jellyfin να αντιγράψει τη ροή mpegts από τον δέκτη και να μοιραστεί αυτή τη διπλή ροή στους πελάτες του. Αυτό είναι χρήσιμο όταν ο δέκτης έχει όριο συνολικού αριθμού ροών, αλλά μπορεί επίσης να προκαλέσει προβλήματα αναπαραγωγής.", "AirPlay": "AirPlay", - "SelectAudioNormalizationHelp": "Track gain - ρυθμίζει την ένταση κάθε κομματιού, ώστε να αναπαράγεται με την ίδια ένταση. Album gain - ρυθμίζει την ένταση όλων των κομματιών ενός άλμπουμ μόνο, διατηρώντας το δυναμικό εύρος του άλμπουμ. Η εναλλαγή μεταξύ της επιλογής «Off» και άλλων επιλογών απαιτεί επανεκκίνηση της τρέχουσας αναπαραγωγής.", + "SelectAudioNormalizationHelp": "Ενίσχυση κομματιών - ρυθμίζει την ένταση κάθε κομματιού, ώστε να αναπαράγεται με την ίδια ένταση. Ενίσχυση άλμπουμ - ρυθμίζει την ένταση όλων των κομματιών ενός άλμπουμ μόνο, διατηρώντας το δυναμικό εύρος του άλμπουμ. Η εναλλαγή μεταξύ της επιλογής «Ανενεργό» και άλλων επιλογών απαιτεί επανεκκίνηση της τρέχουσας αναπαραγωγής.", "DateModified": "Ημερομηνία επεξεργασίας", "EnableDtsHelp": "Ενεργοποιήστε το μόνο εάν η συσκευή σας υποστηρίζει DTS ή είναι συνδεδεμένη σε συμβατό δέκτη ήχου, διαφορετικά ενδέχεται να προκαλέσει αποτυχία αναπαραγωγής.", "HeaderAddLyrics": "Προσθήκη Στίχων", @@ -1790,7 +1790,7 @@ "EnableLibrary": "Ενεργοποίηση της βιβλιοθήκης", "ChannelResolutionUHD4K": "UHD (4K)", "DeleteName": "Διαγραφή {0}", - "AllowTonemappingSoftwareHelp": "Η χαρτογράφηση τόνων μπορεί να μετατρέψει το δυναμικό εύρος ενός βίντεο από HDR σε SDR, διατηρώντας παράλληλα τις λεπτομέρειες και τα χρώματα της εικόνας, που είναι πολύ σημαντικές πληροφορίες για την αναπαράσταση της αρχικής σκηνής. Προς το παρόν λειτουργεί μόνο με βίντεο 10bit HDR10, HLG και DoVi.", + "AllowTonemappingSoftwareHelp": "Η αντιστοίχιση τονικότητας μπορεί να μετατρέψει το δυναμικό εύρος ενός βίντεο από HDR σε SDR, διατηρώντας παράλληλα τις λεπτομέρειες και τα χρώματα της εικόνας, που είναι πολύ σημαντικές πληροφορίες για την αναπαράσταση της αρχικής σκηνής. Προς το παρόν λειτουργεί μόνο με βίντεο 10bit HDR10, HLG και DoVi.", "ChannelResolutionSD": "SD", "Creator": "Δημιουργός", "Alternate": "Εναλλακτική", @@ -1819,16 +1819,16 @@ "DeleteEpisode": "Διαγραφή Επεισοδίου", "EnableHi10p": "Ενεργοποίηση προφίλ H.264 High 10", "EnableTrueHd": "Ενεργοποίηση TrueHD", - "EnableTrueHdHelp": "Ενεργοποίησε το μόνο εάν η συσκευή σου υποστηρίζει TrueHD ή είναι συνδεδεμένη σε συμβατό δέκτη ήχου, διαφορετικά μπορεί να προκληθεί αποτυχία αναπαραγωγής.", + "EnableTrueHdHelp": "Ενεργοποιήστε το μόνο εάν η συσκευή σας υποστηρίζει TrueHD ή είναι συνδεδεμένη σε συμβατό δέκτη ήχου, διαφορετικά ενδέχεται να προκαλέσει αποτυχία αναπαραγωγής.", "ErrorDeletingLyrics": "Υπήρξε σφάλμα στη διαγραφή των στίχων από τον διακομιστή. Ελέγξτε ότι το Jellyfin έχει πρόσβαση συγγραφής στο φάκελο πολυμέσων και δοκιμάστε ξανά.", "FallbackMaxStreamingBitrateHelp": "Το μέγιστο bitrate ροής χρησιμοποιείται ως εναλλακτική λύση όταν το ffprobe δεν μπορεί να προσδιορίσει το bitrate της ροής προέλευσης. Αυτό βοηθάει στην αποτροπή των client από το να ζητούν υπερβολικά υψηλό bitrate μετακωδικοποίησης, το οποίο θα μπορούσε να προκαλέσει αποτυχία της συσκευής αναπαραγωγής και υπερφόρτωση του κωδικοποιητή.", "HeaderAllRecordings": "Όλες οι ηχογραφήσεις", "HeaderNextItem": "Επόμενο {0}", "LabelAllowContentWithTags": "Επιτροπή αντικειμένων με ετικέτες", "LabelAllowFmp4TranscodingContainer": "Επιτροπή fMP4 container μετακωδικοποίητη", - "LabelAlbumGain": "Ένταση Άλμπουμ", + "LabelAlbumGain": "Ενίσχυση άλμπουμ", "HeaderLyricDownloads": "Λήψεις Στίχων", - "HeaderMediaSegmentActions": "Δράσεις τμημάτων μέσων ενημέρωσης", + "HeaderMediaSegmentActions": "Ενέργειες τμημάτων πολυμέσων", "LabelAudioTagSettings": "Ρυθμίσεις ετικετών ήχου", "LabelCustomTagDelimiters": "Προσαρμοσμένος οριοθέτης ετικετών", "MediaSegmentAction.AskToSkip": "Ερώτηση για Παράληψη", @@ -1861,23 +1861,23 @@ "LabelIsSynced": "Είναι Συγχρονισμένο", "LabelNoChangelog": "Δεν υπάρχει ημερολόγιο αλλαγών για αυτή την έκδοση.", "LabelQsvDeviceHelp": "Προσδιορίστε την συσκευή για το Intel QSV σε ένα σύστημα με πολλαπλές GPU. Στο Linux, αυτός είναι ο κόμβος απόδοσης, π.χ., /dev/dri/renderD128. Στα Windows, αυτό είναι ο δείκτης της συσκευής αρχίζοντας από το 0. Αφήστε το κενό εκτός κι αν ξέρετε τι κάνετε.", - "LibraryScanFanoutConcurrencyHelp": "Μέγιστος αριθμός παράλληλων διεργασιών κατά τις σαρώσεις βιβλιοθήκης. Αν αυτό είναι 0, θα επιλεγεί ένα όριο βασισμένο στον αριθμό πυρήνων του συστήματος. ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αν ο αριθμός αυτός είναι πολύ υψηλός, μπορεί να προκλειθούν προβλήματα με τα συστήματα αρχείων δικτύου· αν συναντήσετε προβλήματα χαμηλώστε τον αριθμό.", + "LibraryScanFanoutConcurrencyHelp": "Μέγιστος αριθμός παράλληλων διεργασιών κατά τις σαρώσεις βιβλιοθήκης. Αφήνοντάς το κενό, θα επιλεγεί ένα όριο με βάση τον αριθμό πυρήνων του συστήματος. ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αν ο αριθμός αυτός είναι πολύ υψηλός, μπορεί να προκληθούν προβλήματα με τα συστήματα αρχείων δικτύου· αν συναντήσετε προβλήματα χαμηλώστε τον αριθμό.", "LabelMediaSegmentProviders": "Προμηθευτές τμημάτων πολυμέσων", - "LibraryScanFanoutConcurrency": "Όριο παράλληλων σαρώσεων βιβλιοθήκης", + "LibraryScanFanoutConcurrency": "Οριο παράλληλων σαρώσεων βιβλιοθήκης", "LabelQsvDevice": "Συσκευή QSV", "LabelScreensaverTime": "Χρόνος προφύλαξης οθόνης", "LabelScreensaverTimeHelp": "Ο χρόνος σε δευτερόλεπτα που απαιτείται για να αρχίσει η προφύλαξη οθόνης.", "LabelEnableLUFSScanHelp": "Οι πελάτες μπορούν να κανονικοποιούν την αναπαραγωγή ήχου για να έχουν ίση ένταση σε όλα τα κομμάτια. Αυτό θα κάνει τις σαρώσεις βιβλιοθηκών αργότερες και θα χρειαστεί περισσότερους πόρους.", "LabelFallbackMaxStreamingBitrate": "Εναλλακτικό μέγιστο bitrate ροής", - "LabelSelectPreferredTranscodeVideoCodec": "Προτιμόμενο codec διακωδικοποιημένου βίνετο", - "AutoSubtitleStylingHelp": "Αυτή η λειτουργία θα αλλάζει αυτόματα μεταξύ των προσαρμοσμένων μηχανισμών στυλ υποτίτλων και της συσκευής βασισμένη στον τύπο της συσκευής σας.", + "LabelSelectPreferredTranscodeVideoCodec": "Προτιμώμενο codec διακωδικοποίησης βίνετο", + "AutoSubtitleStylingHelp": "Αυτή η λειτουργία θα αλλάζει αυτόματα μεταξύ των εγγενών και των προσαρμοσμένων μηχανισμών στυλ υποτίτλων με βάση τον τύπο της συσκευής σας.", "Custom": "Προσαρμοσμένο", "CustomSubtitleStylingHelp": "Τα στυλ υποτίτλων θα δουλεύουν στις περισσότερες συσκευές, αλλά θα μειώνουν την απόδοση.", "LabelSubtitleStyling": "Στυλ υποτίτλων", "LabelMediaSegmentsType": "{0} Τμήματα", "LabelSaveTrickplayLocally": "Αποθήκευση εικόνων trickplay δίπλα στα πολυμέσα", "LabelLyricDownloaders": "Προγράμματα λήψης στίχων", - "LabelParallelImageEncodingLimitHelp": "Μέγιστος αριθμός παράλληλων κωδικοποιήσεων εικόνας. Αν αυτό είναι 0, θα επιλεγεί ένα όριο βασισμένο στον αριθμό πυρήνων του συστήματος.", + "LabelParallelImageEncodingLimitHelp": "Μέγιστος αριθμός κωδικοποιήσεων εικόνων που μπορούν να εκτελούνται παράλληλα. Αφήνοντάς το κενό, θα επιλεγεί ένα όριο με βάση τον αριθμό πυρήνων του συστήματος.", "LabelSaveTrickplayLocallyHelp": "Η αποθήκευση των εικόνων trickplay μέσα στους φακέλους πολυμέσων θα τις βάλει δίπλα στα πολυμέσα σας για εύκολη μετάβαση και πρόσβαση.", "LabelRepository": "Αποθετήριο", "Letterer": "Ψηφιογράφος", @@ -1885,7 +1885,7 @@ "Lyric": "Στίχος", "LogoScreensaver": "Λογότυπο Προφύλαξης Οθόνης", "MediaSegmentProvidersHelp": "Ενεργοποίηση και ταξινόμηση των προτιμωμένων παροχέων τμημάτων πολυμέσων σε σειρά προτεραιότητας.", - "LibraryInvalidItemIdError": "H βιβλιοθήκη βρίσκεται σε μη έγκυρη κατάσταση και δεν μπορεί να τροποποιηθεί. Πιθανότατα αντιμετοπίζετε σφάλμα: η διαδρομή στην βάση δεδομένη δεν είναι η σωστή στον δίσκο.", + "LibraryInvalidItemIdError": "H βιβλιοθήκη βρίσκεται σε μη έγκυρη κατάσταση και δεν μπορεί να τροποποιηθεί. Πιθανότατα αντιμετωπίζετε σφάλμα: η διαδρομή στην βάση δεδομένη δεν είναι η σωστή στο σύστημα αρχείων.", "Lyrics": "Στίχοι", "MediaInfoRotation": "Προσανατολισμός", "LimitSupportedVideoResolution": "Περιορισμός μέγιστης υποστηριζόμενης ανάλυσης βίντεο", @@ -1893,6 +1893,76 @@ "MediaSegmentAction.None": "Τίποτα", "DeleteServerConfirmation": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον διακομιστή;", "LabelDevice": "Συσκευή", - "LyricDownloadersHelp": "Ενεργοποίησε και κατάταξε τους προτιμόμενους παρόχους στίχων κατά σειρά προτεραιότητας.", - "LibraryNameInvalid": "Το όνομα της βιβλιοθήκης δεν μπορεί να είναι κενό ή να ξεκινά/τελειώνει με κενό." + "LyricDownloadersHelp": "Ενεργοποιήστε το και κατατάξτε τους προτιμώμενους παρόχους στίχων σας κατά σειρά προτεραιότητας.", + "LibraryNameInvalid": "Το όνομα της βιβλιοθήκης δεν μπορεί να είναι κενό.", + "ViewLyrics": "Προβολή στίχων", + "SelectPreferredTranscodeVideoAudioCodecHelp": "Επιλογή του προτιμώμενου κωδικοποιητή ήχου για διακωδικοποίηση σε περιεχόμενο βίντεο. Εάν ο προτιμώμενος κωδικοποιητής δεν υποστηρίζεται, ο διακομιστής θα χρησιμοποιήσει τον επόμενο καλύτερο διαθέσιμο κωδικοποιητή.", + "MetadataNfoLoadError": "Αποτυχία φόρτωσης ρυθμίσεων NFO μεταδεδομένων", + "LabelTrackGain": "Ενίσχυση κομματιών", + "NoLyricsSearchResultsFound": "Δεν βρέθηκαν στίχοι.", + "MoviesAndShows": "Ταινίες και Σειρές", + "NativeSubtitleStylingHelp": "Το στυλ υπότιτλων δεν θα λειτουργήσει σε ορισμένες συσκευές. Ωστόσο, δεν συνοδεύεται από επιβάρυνση επιδόσεων.", + "SelectPreferredTranscodeVideoCodecHelp": "Επιλογή του προτιμώμενου κωδικοποιητή βίντεο για διακωδικοποίηση. Εάν ο προτιμώμενος κωδικοποιητής δεν υποστηρίζεται, ο διακομιστής θα χρησιμοποιήσει τον επόμενο καλύτερο διαθέσιμο κωδικοποιητή.", + "MoveToBottom": "Μετακίνηση τέρμα κάτω", + "MoveToTop": "Μετακίνηση στην κορυφή", + "RenderPgsSubtitle": "Πειραματική απόδοση υποτίτλων PGS", + "RenderPgsSubtitleHelp": "Προσδιορίστε εάν ο πελάτης πρέπει να αποδίδει υπότιτλους PGS αντί να χρησιμοποιεί μόνιμα εγγεγραμμένους υπότιτλους. Αυτό μπορεί να αποφύγει τη διακωδικοποίηση από την πλευρά του διακομιστή σε αντάλλαγμα rendering με καλύτερη απόδοση από την πλευρά του πελάτη.", + "LabelExtractTrickplayDuringLibraryScanHelp": "Δημιουργία εικόνων trickplay όταν εισάγονται βίντεο κατά τη σάρωση βιβλιοθήκης. Διαφορετικά, θα εξαχθούν κατά τη διάρκεια της προγραμματισμένης εργασίας εικόνων trickplay. Εάν η δημιουργία έχει ρυθμιστεί σε μη αποκλεισμό, αυτό δεν θα επηρεάσει τον χρόνο που χρειάζεται για να ολοκληρωθεί μια σάρωση βιβλιοθήκης.", + "LabelImageIntervalHelp": "Χρονικό διάστημα (ms) μεταξύ κάθε νέας εικόνας trickplay.", + "PlaybackError.RateLimitExceeded": "Αυτό το πολυμέσο δεν μπορεί να αναπαραχθεί αυτήν τη στιγμή λόγω περιορισμών αξιολόγησης.", + "PasswordMissingSaveError": "Ο νέος κωδικός πρόσβασης δεν μπορεί να είναι κενός.", + "TonemappingModeHelp": "Επιλέξτε τη λειτουργία αντιστοίχισης τόνου. Εάν αντιμετωπίζετε στιγμιότυπα με χαμηλή ευκρίνεια, δοκιμάστε να μεταβείτε στη λειτουργία RGB.", + "MessageCancelSeriesTimerError": "Παρουσιάστηκε σφάλμα κατά την ακύρωση του χρονοδιακόπτη σειράς", + "PreviewLyrics": "Προεπισκόπηση στίχων", + "MessageCancelTimerError": "Παρουσιάστηκε σφάλμα κατά την ακύρωση του χρονοδιακόπτη", + "EnableVideoToolboxTonemapping": "Ενεργοποίηση αντιστοίχισης τονικότητας VideoToolbox", + "LabelEncodingFormatOptions": "Επιλογές μορφής κωδικοποίησης", + "EncodingFormatHelp": "Επιλέξτε την κωδικοποίηση βίντεο στην οποία το Jellyfin θα πρέπει να κάνει διακωδικοποίηση. Το Jellyfin θα χρησιμοποιεί κωδικοποίηση λογισμικού (software) όταν δεν είναι διαθέσιμη η επιτάχυνση υλικού για την επιλεγμένη μορφή. Η κωδικοποίηση H264 θα είναι πάντα ενεργοποιημένη.", + "AllowVideoToolboxTonemappingHelp": "Αντιστοίχιση τονικότητας με επιτάχυνση υλικού που παρέχεται από το VideoToolbox. Λειτουργεί με τις περισσότερες μορφές HDR, συμπεριλαμβανομένων των HDR10, HDR10+ και HLG, αλλά δεν λειτουργεί με το Dolby Vision Profile 5. Αυτό έχει μεγαλύτερη προτεραιότητα σε σύγκριση με μια άλλη υλοποίηση Metal.", + "SavePassword": "Αποθήκευση κωδικού πρόσβασης", + "PlaybackError.NotAllowed": "Δεν επιτρέπεται η αναπαραγωγή αυτού του πολυμέσου.", + "PriorityIdle": "Σε αδράνεια", + "LabelScanBehaviorHelp": "Η προεπιλεγμένη συμπεριφορά είναι μη αποκλεισμός, η οποία θα προσθέσει πολυμέσα στη βιβλιοθήκη πριν ολοκληρωθεί η δημιουργία trickplay. Ο αποκλεισμός θα εξασφαλίσει τη δημιουργία αρχείων trickplay πριν από την προσθήκη πολυμέσων στη βιβλιοθήκη, αλλά θα κάνει τις σαρώσεις σημαντικά μεγαλύτερες σε διάρκεια.", + "LabelJpegQualityHelp": "Η ποιότητα συμπίεσης JPEG για εικόνες trickplay.", + "LabelTrickplayThreads": "Νήματα FFmpeg", + "LabelTrickplayThreadsHelp": "Ο αριθμός των νημάτων που θα περάσουν στο όρισμα '-threads' του ffmpeg.", + "OptionExtractTrickplayImage": "Ενεργοποίηση εξαγωγής εικόνων με trickplay", + "LabelExtractTrickplayDuringLibraryScan": "Εξαγωγή εικόνων trickplay κατά τη σάρωση βιβλιοθήκης", + "Trickplay": "Trickplay", + "LabelTrickplayAccel": "Ενεργοποίηση αποκωδικοποίησης υλικού", + "LabelTrickplayKeyFrameOnlyExtractionHelp": "Εξαγωγή key frames μόνο, για σημαντικά ταχύτερη επεξεργασία με λιγότερο ακριβή χρονισμό. Εάν ο διαμορφωμένος αποκωδικοποιητής υλικού δεν υποστηρίζει αυτήν τη λειτουργία, θα γίνει χρήση του αποκωδικοποιητή λογισμικού.", + "LabelProcessPriorityHelp": "Η ρύθμιση αυτής της χαμηλότερης ή υψηλότερης τιμής θα καθορίσει πώς η CPU δίνει προτεραιότητα στη διαδικασία δημιουργίας ffmpeg trickplay σε σχέση με άλλες διεργασίες. Αν παρατηρήσετε επιβράδυνση κατά τη δημιουργία εικόνων trickplay, αλλά δεν θέλετε να σταματήσετε εντελώς τη δημιουργία τους, δοκιμάστε να μειώσετε αυτό καθώς και τον αριθμό νημάτων.", + "ExtractTrickplayImagesHelp": "Οι εικόνες trickplay είναι παρόμοιες με τις εικόνες κεφαλαίων, με τη διαφορά ότι καλύπτουν όλο το μήκος του περιεχομένου και χρησιμοποιούνται για την εμφάνιση μιας προεπισκόπησης κατά την περιήγηση σε ένα βίντεο.", + "LabelTrickplayAccelEncoding": "Ενεργοποίηση κωδικοποίησης MJPEG με επιτάχυνση υλικού", + "ReplaceTrickplayImages": "Αντικατάσταση υπαρχουσών εικόνων trickplay", + "LabelTrickplayAccelEncodingHelp": "Προς το παρόν διατίθεται μόνο σε QSV, VA-API, VideoToolbox και RKMPP, αυτή η επιλογή δεν έχει καμία επίδραση σε άλλες μεθόδους επιτάχυνσης υλικού.", + "LabelTrickplayKeyFrameOnlyExtraction": "Δημιουργία εικόνων μόνο από key frames", + "LabelWidthResolutionsHelp": "Λίστα με τα πλάτη (px) στα οποία θα δημιουργηθούν οι εικόνες trickplay, διαχωρισμένων με κόμματα. Ολες οι εικόνες πρέπει να δημιουργούνται αναλογικά με την πηγή, επομένως ένα πλάτος 320 σε ένα βίντεο 16:9 καταλήγει περίπου 320x180.", + "Retry": "Δοκιμή ξανά", + "Reset": "Επαναφορά", + "PlaybackError.ASS_RENDER_ERROR": "Παρουσιάστηκε σφάλμα στην απόδοση των ASS/SSA υποτίτλων.", + "HeaderPageNotFound": "Δεν βρέθηκε η σελίδα", + "PageNotFound": "Αυτή δεν είναι η σελίδα που ψάχνεις.", + "CopyLogSuccess": "Το περιεχόμενο του αρχείου καταγραφής αντιγράφηκε επιτυχώς.", + "DisplayLoadError": "Ένα σφάλμα προέκυψε κατά την φόρτωση των δεδομένων ρύθμισης προβολής.", + "PluginLoadRepoError": "Προέκυψε σφάλμα κατά την λήψη των λεπτομερειών του πρόσθετου από το εναποθετήριο.", + "PluginUninstallError": "Προέκυψε σφάλμα κατά την απεγκατάσταση του πρόσθετου.", + "PlaybackError.NO_MEDIA_ERROR": "Αδυναμία εύρεσης έγκυρης πηγής μέσου προς αναπαραγωγή.", + "PlaybackError.SERVER_ERROR": "Η αναπαραγωγή απέτυχε λόγω σφάλματος του διακομιστή.", + "PlaylistError.AddFailed": "Σφάλμα κατά την προσθήκη στην λίστα αναπαραγωγής", + "PlaylistError.CreateFailed": "Σφάλμα κατά τη δημιουργία της λίστας αναπαραγωγής", + "PlaylistError.UpdateFailed": "Σφάλμα κατά την ενημέρωση της λίστας αναπαραγωγής", + "PluginDisableError": "Προέκυψε σφάλμα κατά την απενεργοποίηση του πρόσθετου.", + "PluginLoadConfigError": "Προέκυψε σφάλμα κατά την λήψη των ρυθμίσεων του πρόσθετου.", + "PluginEnableError": "Προέκυψε σφάλμα κατά την ενεργοποίηση του πρόσθετου.", + "LastActive": "Τελευταία ενεργός", + "PlaybackError.PLAYER_ERROR": "Η αναπαραγωγή απέτυχε λόγω κρίσιμου σφάλματος στον αναπαραγωγέα.", + "PlaylistPublic": "Επιτρέψτε ελεύθερη πρόσβαση", + "PlaylistPublicDescription": "Επιτρέψτε πρόσβαση στην λίστα αναπαραγωγής από οποιονδήποτε συνδεδεμένο χρήστη.", + "PlaybackError.NETWORK_ERROR": "Η αναπαραγωγή απέτυχε λόγω σφάλματος δικτύου.", + "PlaybackError.MEDIA_NOT_SUPPORTED": "Η αναπαραγωγή απέτυχε διότι το μέσο δεν υποστηρίζεται από αυτό το πρόγραμμα.", + "PlaybackError.MEDIA_DECODE_ERROR": "Η αναπαραγωγή απέτυχε λόγω σφάλματος στην αποκωδικοποίηση του μέσου.", + "MetadataImagesLoadError": "Αποτυχία φόρτωσης ρυθμίσεων των μεταδεδομένων", + "PlaybackError.FATAL_HLS_ERROR": "Παρουσιάστηκε κρίσιμο σφάλμα στην ροή HLS.", + "SettingsPageLoadError": "Αποτυχία φόρτωσης σελίδας ρυθμίσεων" } diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index dec2ef3658..9fd676af1c 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1719,7 +1719,7 @@ "Short": "Short", "HeaderPerformance": "Performance", "LabelParallelImageEncodingLimit": "Parallel image encoding limit", - "LabelParallelImageEncodingLimitHelp": "Maximum number of image encodings that are allowed to run in parallel. Setting this to 0 will choose a limit based on your systems core count.", + "LabelParallelImageEncodingLimitHelp": "Maximum number of image encodings that are allowed to run in parallel. Leaving this empty will choose a limit based on your systems core count.", "LabelEnableAudioVbr": "Enable VBR audio encoding", "LabelEnableAudioVbrHelp": "Variable bitrate offers better quality to average bitrate ratio, but in some rare cases may cause buffering and compatibility issues.", "LabelTonemappingMode": "Tone mapping mode", @@ -1880,7 +1880,7 @@ "LabelSelectPreferredTranscodeVideoAudioCodec": "Preferred transcode audio codec in video playback", "Letterer": "Letterer", "LibraryScanFanoutConcurrency": "Parallel library scan tasks limit", - "LibraryScanFanoutConcurrencyHelp": "Maximum number of parallel tasks during library scans. Setting this to 0 will choose a limit based on your systems core count. WARNING: Setting this number too high may cause issues with network file systems; if you encounter problems lower this number.", + "LibraryScanFanoutConcurrencyHelp": "Maximum number of parallel tasks during library scans. Leaving this empty will choose a limit based on your system's core count. WARNING: Setting this number too high may cause issues with network file systems; if you encounter problems lower this number.", "Penciller": "Penciler", "PlaylistError.AddFailed": "Error adding to playlist", "PlaylistError.CreateFailed": "Error creating playlist", @@ -2006,5 +2006,12 @@ "LibraryNameInvalid": "Library name cannot be empty.", "CopyLogSuccess": "Log contents copied successfully.", "Retry": "Retry", - "LogLoadFailure": "Failed to load the log file. It may still be actively written to." + "LogLoadFailure": "Failed to load the log file. It may still be actively written to.", + "MetadataNfoLoadError": "Failed to load metadata NFO settings", + "DisplayLoadError": "An error occurred while loading display configuration data.", + "HeaderPageNotFound": "Page not found", + "PageNotFound": "This is not the page you are looking for.", + "MetadataImagesLoadError": "Failed to load metadata settings", + "SettingsPageLoadError": "Failed to load settings page", + "RetryWithGlobalSearch": "Retry with a global search" } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 8007057b71..2d6678c325 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -473,6 +473,7 @@ "HeaderNoLyrics": "No lyrics found", "HeaderOnNow": "On Now", "HeaderOtherItems": "Other Items", + "HeaderPageNotFound": "Page not found", "HeaderParentalRatings": "Parental Ratings", "HeaderPassword": "Password", "HeaderPasswordReset": "Password Reset", @@ -822,7 +823,7 @@ "LabelOriginalTitle": "Original title", "LabelOverview": "Overview", "LabelParallelImageEncodingLimit": "Parallel image encoding limit", - "LabelParallelImageEncodingLimitHelp": "Maximum number of image encodings that are allowed to run in parallel. Setting this to 0 will choose a limit based on your systems core count.", + "LabelParallelImageEncodingLimitHelp": "Maximum number of image encodings that are allowed to run in parallel. Leaving this empty will choose a limit based on your systems core count.", "LabelParentalRating": "Parental rating", "LabelParentNumber": "Parent number", "LabelPassword": "Password", @@ -1019,7 +1020,7 @@ "LibraryAccessHelp": "Select the libraries to share with this user. Administrators will be able to edit all folders using the metadata manager.", "LibraryNameInvalid": "Library name cannot be empty.", "LibraryScanFanoutConcurrency": "Parallel library scan tasks limit", - "LibraryScanFanoutConcurrencyHelp": "Maximum number of parallel tasks during library scans. Setting this to 0 will choose a limit based on your systems core count. WARNING: Setting this number too high may cause issues with network file systems; if you encounter problems lower this number.", + "LibraryScanFanoutConcurrencyHelp": "Maximum number of parallel tasks during library scans. Leaving this empty will choose a limit based on your systems core count. WARNING: Setting this number too high may cause issues with network file systems; if you encounter problems lower this number.", "LibraryInvalidItemIdError": "The library is in an invalid state and cannot be edited. You are possibly encountering a bug: the path in the database is not the correct path on the filesystem.", "LimitSupportedVideoResolution": "Limit maximum supported video resolution", "LimitSupportedVideoResolutionHelp": "Use 'Maximum Allowed Video Transcoding Resolution' as maximum supported video resolution.", @@ -1174,6 +1175,7 @@ "MessageUnsetContentHelp": "Content will be displayed as plain folders. For best results use the metadata manager to set the content types of sub-folders.", "MetadataImagesLoadError": "Failed to load metadata settings", "MetadataManager": "Metadata Manager", + "MetadataNfoLoadError": "Failed to load metadata NFO settings", "MetadataSettingChangeHelp": "Changing metadata settings will affect new content added going forward. To refresh existing content, open the detail screen and click the 'Refresh' button, or do bulk refreshes using the 'Metadata Manager'.", "MillisecondsUnit": "ms", "MinutesAfter": "minutes after", @@ -1314,6 +1316,7 @@ "PackageInstallCancelled": "{0} (version {1}) installation cancelled.", "PackageInstallCompleted": "{0} (version {1}) installation completed.", "PackageInstallFailed": "{0} (version {1}) installation failed.", + "PageNotFound": "This is not the page you are looking for.", "ParentalRating": "Parental rating", "PasswordMatchError": "Password and password confirmation must match.", "PasswordRequiredForAdmin": "A password is required for admin accounts.", @@ -1448,6 +1451,7 @@ "ReplaceExistingImages": "Replace existing images", "ReplaceTrickplayImages": "Replace existing trickplay images", "Retry": "Retry", + "RetryWithGlobalSearch": "Retry with a global search", "Reset": "Reset", "ResetPassword": "Reset Password", "ResolutionMatchSource": "Match Source", @@ -1495,6 +1499,7 @@ "ServerRestartNeededAfterPluginInstall": "Jellyfin will need to be restarted after installing the plugin.", "ServerUpdateNeeded": "This server needs to be updated. To download the latest version, please visit {0}", "Settings": "Settings", + "SettingsPageLoadError": "Failed to load settings page", "SettingsSaved": "Settings saved.", "SettingsWarning": "Changing these values may cause instability or connectivity failures. If you experience any problems, we recommend changing them back to default.", "Share": "Share", @@ -1526,6 +1531,7 @@ "StoryArc": "Story Arc", "StopPlayback": "Stop playback", "StopRecording": "Stop recording", + "StreamCountExceedsLimit": "The number of streams exceeds the limit", "Studio": "Studio", "Studios": "Studios", "Subtitle": "Subtitle", diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 26e8c14e8d..94b41625aa 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -141,7 +141,7 @@ "ColorTransfer": "Transferencia de color", "CommunityRating": "Puntuación de la comunidad", "Composer": "Compositor", - "ConfigureDateAdded": "Configurá cómo se determinan los metadatos para 'Fecha agregada' en el Panel de Control > Biblioteca > Configuraciones NFO", + "ConfigureDateAdded": "Configurá cómo se determinan los metadatos para 'Fecha agregada' en el Panel de Control > Biblioteca > Visualización", "ConfirmDeleteImage": "¿Eliminar imágen?", "ConfirmDeleteItem": "Eliminar este elemento lo va a eliminar tanto del sistema de archivos como de la biblioteca de medios. ¿Estás seguro que deseás continuar?", "ConfirmDeleteItems": "Eliminar estos elementos los va a eliminar tanto del sistema de archivos como de la biblioteca de medios. ¿Estás seguro que deseás continuar?", @@ -1985,5 +1985,8 @@ "LabelMediaSegmentProviders": "Proveedores del segmento de medios", "MediaSegmentProvidersHelp": "Habilitá y clasificá a tus proveedores de segmentos de medios preferidos en orden de prioridad.", "HeaderNextEpisode": "Siguiente capítulo", - "HeaderNextVideo": "Siguiente video" + "HeaderNextVideo": "Siguiente video", + "AutoSubtitleStylingHelp": "Este modo cambiará automáticamente entre los modos de estilo nativo y personalizado de subtítulos basándose en el tipo de su dispositivo.", + "CopyLogSuccess": "El contenido del registro se ha copiado satisfactoriamente.", + "Custom": "Personalizado" } diff --git a/src/strings/es.json b/src/strings/es.json index 849085e040..f85b5dd661 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1708,7 +1708,7 @@ "PreferEmbeddedExtrasTitlesOverFileNames": "Prefiere títulos incrustados sobre nombres de archivo para extras", "LabelDummyChapterCountHelp": "Número máximo de imágenes de capítulos que se extraerán para cada archivo multimedia.", "LabelEnableAudioVbrHelp": "La tasa de bits variable ofrece una mejor relación entre calidad y tasa de bits promedio, pero en algunos casos raros puede causar problemas de almacenamiento de búfer y compatibilidad.", - "LabelParallelImageEncodingLimitHelp": "Cantidad máxima de codificaciones de imágenes que pueden ejecutarse en paralelo. Establecer esto en 0 elegirá un límite basado en la cantidad de nucleos (CPU) en su sistema.", + "LabelParallelImageEncodingLimitHelp": "Cantidad máxima de codificaciones de imágenes que pueden ejecutarse en paralelo. Dejando vacío el valor elegirá un límite basado en la cantidad de nucleos (CPU) en su sistema.", "ResolutionMatchSource": "Coincidir fuente", "SubtitleMagenta": "Magenta", "SubtitleWhite": "Blanco", @@ -1756,7 +1756,7 @@ "LabelDeveloper": "Desarrollador", "MessageRepositoryInstallDisclaimer": "ADVERTENCIA: Instalar un complemento de terceros conlleva riesgos. Puede contener código inestable o malicioso, y puede cambiar en cualquier momento. Solo instale complementos de autores en los que confíe.", "HeaderEpisodesStatus": "Estado de los episodios", - "AllowSegmentDeletion": "No Permitir Ninguno", + "AllowSegmentDeletion": "Borrar segmentos", "AllowSegmentDeletionHelp": "Elimine segmentos antiguos después de que el cliente los haya descargado. Esto evita tener que almacenar todo el archivo transcodificado en el disco. Desactívelo si tiene problemas de reproducción.", "LabelThrottleDelaySecondsHelp": "Tiempo en segundos después del cual se acelerará el transcodificador. Debe ser lo suficientemente grande para que el cliente mantenga un búfer saludable. Solo funciona si el estrangulamiento \"throttling\" está habilitada.", "LabelSegmentKeepSeconds": "Tiempo que se mantendrán los segmentos", @@ -1870,7 +1870,7 @@ "OptionExtractTrickplayImage": "Habilitar la extracción de imágenes de trickplay", "LabelExtractTrickplayDuringLibraryScanHelp": "Generar imágenes de trickplay cuando los vídeos se importan durante el escaneo de la biblioteca. De lo contrario se extraerán durante la tarea programada de extracción de imágenes de trickplay. Si la generación es no bloqueante esto no afectará al tiempo que la biblioteca tarda en escanearse.", "Author": "Autor", - "LibraryScanFanoutConcurrencyHelp": "Número máximo de tareas en paralelo durante los escaneos de la biblioteca. Configurar este valor en 0 seleccionará un límite basado en la cantidad de núcleos de tu sistema. ADVERTENCIA: Configurar un número demasiado alto puede causar problemas con sistemas de archivos en red; si experimentas inconvenientes, reduce este valor.", + "LibraryScanFanoutConcurrencyHelp": "Número máximo de tareas en paralelo durante los escaneos de la biblioteca. Dejar el campo vacío seleccionará un límite basado en la cantidad de núcleos de tu sistema. ADVERTENCIA: Configurar un número demasiado alto puede causar problemas con sistemas de archivos en red; si experimentas inconvenientes, reduce este valor.", "LibraryScanFanoutConcurrency": "Límite de tareas de escaneo en paralelo de la biblioteca", "Penciller": "Lapicista", "PlaylistError.CreateFailed": "Error creando lista de reproduccion", @@ -1987,7 +1987,7 @@ "MediaSegmentProvidersHelp": "Habilite y clasifique por orden de prioridad a sus proveedores de segmentos de medios preferidos.", "HeaderNextEpisode": "Próximo episodio", "HeaderNextVideo": "Próximo video", - "CustomSubtitleStylingHelp": "El estilo de los subtítulos funcionará en la mayoría de los dispositivos, pero conlleva una sobrecarga adicional de rendimiento.", + "CustomSubtitleStylingHelp": "El estilo en los subtítulos funcionará en la mayoría de los dispositivos, pero tendrá una sobrecarga adicional de rendimiento.", "Custom": "Personalizado", "LabelSubtitleStyling": "Estilo de subtítulos", "Native": "Nativo", @@ -2006,5 +2006,11 @@ "CopyLogSuccess": "El contenido del registro se ha copiado satisfactoriamente.", "Retry": "Reintentar", "LogLoadFailure": "Fallo al cargar el archivo de registro. Es posible que siga siendo activamente escrito.", - "HeaderMediaSegmentActions": "Acciones del segmento de medios" + "HeaderMediaSegmentActions": "Acciones del segmento de medios", + "MetadataNfoLoadError": "Error al cargar la configuración de metadatos NFO", + "DisplayLoadError": "Un error ocurrió mientras se cargaba la configuración de visualización.", + "MetadataImagesLoadError": "Error al cargar la configuración de metadatos", + "HeaderPageNotFound": "Página no encontrada", + "PageNotFound": "Esta no es la página que está buscando.", + "SettingsPageLoadError": "Fallo al cargar la página de configuraciones" } diff --git a/src/strings/eu.json b/src/strings/eu.json index 9a1f660d06..693eaa6270 100644 --- a/src/strings/eu.json +++ b/src/strings/eu.json @@ -1253,7 +1253,7 @@ "AnyLanguage": "Edozein hizkuntza", "AlwaysPlaySubtitlesHelp": "Hizkuntza-lehentasunarekin bat datozen azpitituluak kargatu egingo dira, audio-hizkuntza edozein dela ere.", "AlwaysPlaySubtitles": "Beti erakutsi azpitituluak", - "AllowTonemappingHelp": "Tonuen mapaketak HDR bideo baten maila dinamikoa SDR bihur dezake irudian xehetasunak eta koloreak mantentzen diren bitartean; beraz, garrantzitsua da jatorrizko eszena irudikatzeko. Une honetan txertatutako HDR10 edo HLG metadatuekin bideoak transkodetzen direnean bakarrik funtzionatzen du. Erreprodukzioa arina ez bada edo huts egiten badu, kontuan hartu dagokion hardware bidezko deskodegailua desaktibatu behar dela.", + "AllowTonemappingHelp": "Tonu-mapaketak bideo baten barruti dinamikoa eraldatu dezake HDRtik SDR-ra, jatorrizko eszena irudikatzeko informazio oso garrantzitsuak diren irudien xehetasunak eta koloreak mantenduz. Gaur egun 10bit HDR10, HLG eta DoVi bideoekin bakarrik funtzionatzen du. Honek dagokion GPGPU exekuzio-denbora behar du.", "AllowRemoteAccessHelp": "Aktibatuta ez badago, urruneko konexio guztiak blokeatu egingo dira.", "AllowRemoteAccess": "Baimendu zerbitzari honetarako urrutiko konexioak", "AllowOnTheFlySubtitleExtractionHelp": "Bezeroa bateragarria denean, azpitituluak erreprodukzioan zehar atera daitezke, bideoa ez bihurtzeko. Hala ere, eta zerbitzari batzuetan, honek denbora asko behar izan dezake eta erreprodukzioak ebakiak izan ditzake prozesuan zehar. Aukera hau desgaitzen du azpitituluak zuzenean bideoan grabatzeko, bezeroarekin berez bateragarriak ez direnean.", @@ -1639,5 +1639,12 @@ "LabelSegmentKeepSeconds": "Segmentuak gordetzeko denbora..", "AirPlay": "AirPlay", "AllowContentWithTagsHelp": "Erakutsi zehaztutako etiketetik gutxienez bat duen serieen media.", - "AllowSubtitleManagement": "Baimendu erabiltzaile honek azpitituluak editatzea" + "AllowSubtitleManagement": "Baimendu erabiltzaile honek azpitituluak editatzea", + "SelectAudioNormalizationHelp": "Pista irabazia - pista bakoitzaren bolumena doitzen du ozentasun berarekin erreproduzitu daitezen. Album irabazia - pista bakoitzaren bolumena doitzen du album batean soilik, albumaren eremu dinamikoa mantentzeko. \"Itzalita\" eta beste aukeren artean aldatzeak uneko erreproduzkzioa berrabiaraztea behar du.", + "LabelProcessPriorityHelp": "Handiago edo txikiago ezartzeak PUZ-ak ffmpeg trickplay sortzeko prozesua beste prozesu batzuekin alderatuta nola lehenesten duen zehaztuko du. Trickplay irudiak sortzen dituzun bitartean moteltzea nabaritzen baduzu, baina ez duzu sorpena erabat gelditu nahi, saiatu hau eta hari kopurua ere jaisten.", + "LibraryScanFanoutConcurrencyHelp": "Liburutegiko azterketarako gehienezko zeregin paraleloen kopurua. 0 ezartzean, zure sistemako nukleoen kopuruan oinarritutako muga bat aukeratuko da. KONTUZ: Hau altuegi ezartzeak arazoak sor ditzake sareko fitxategi-sistemekin; arazorik baduzu, murriztu zenbaki hau.", + "LabelQsvDeviceHelp": "Zehaztu Intel QSVrako gailua GPU sistema multi-GPU batean. Linuxen, hau errenderizazio nodoa da adib. /dev/dri/renderD128. Windowsen, hau gailuaren indizea 0tik aurrera da. Utzi zuri zer egiten ari zaren jakin ezean.", + "AllowVideoToolboxTonemappingHelp": "VideoToolbox-ek emandako hardware bidezko tonu-mapatzea. HDR formatu gehienekin funtzionatzen du, HDR10, HDR10 + eta HLG barne, baina ez du Dolby Vision 5. profilarekin funtzionatzen. Honek lehentasun handiagoa du beste Metal-eko inplementazioarekin alderatuta.", + "FallbackMaxStreamingBitrateHelp": "Gehieneko streaming bit-tasa erabiltzen da ffprobe-ek ezin duenean iturriaren stream bit-tasa atzeman. Honek bezeroak transkodetze bit-tasa handiegia eskatzea saihesten du, horrek erreproduzitzaileak huts egitea eta kodetzailea gainkargatu dezakelako.", + "Retry": "Saiatu berriro" } diff --git a/src/strings/fa.json b/src/strings/fa.json index 0bef3aae26..a055b7a5b4 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -1707,5 +1707,23 @@ "HeaderAllRecordings": "همه‌ی ضبط‌ها", "Inker": "جوهرافشان", "HeaderMediaSegmentActions": "اقدام‌های بخش محتوا", - "HeaderNoLyrics": "متن شعری یافت نشد" + "HeaderNoLyrics": "متن شعری یافت نشد", + "CustomSubtitleStylingHelp": "استایل‌بندی زیرنویس در بیشتر دستگاه‌ها کار می‌کند، اما ممکن است باعث افزایش مصرف منابع شود.", + "DisplayLoadError": "خطایی در هنگام بارگذاری داده‌های پیکربندی نمایش رخ داد.", + "HeaderPageNotFound": "صفحه مورد نظر پیدا نشد", + "AutoSubtitleStylingHelp": "این حالت به‌طور خودکار بین مکانیزم‌های بومی و سفارشی نمایش زیرنویس بر اساس نوع دستگاه شما جابه‌جا می‌شود.", + "Custom": "سفارشی", + "CopyLogSuccess": "محتوای گزارش با موفقیت کپی شد.", + "LabelDelimiterWhitelist": "فهرست سفید جداکننده‌ها", + "DeleteServerConfirmation": "آیا مطمئن هستید که می‌خواهید این سرور را حذف کنید؟", + "LabelBackdropScreensaverIntervalHelp": "زمان به ثانیه بین پس‌زمینه‌های مختلف هنگام استفاده از اسکرین‌سیور پس‌زمینه.", + "LabelDelimiterWhitelistHelp": "آیتم‌هایی که باید از تقسیم برچسب‌ها مستثنی شوند. هر آیتم در یک خط وارد شود.", + "EnableHi10p": "فعال کردن پروفایل H.264 High 10", + "LabelBuildVersion": "نسخه ساخت", + "LabelCustomTagDelimiters": "محدوده جداکننده برچسب سفارشی", + "LabelCustomTagDelimitersHelp": "کاراکترهایی که به‌عنوان جداکننده برای تفکیک برچسب‌ها در نظر گرفته می‌شوند.", + "LabelDevice": "دستگاه", + "LabelDisableVbrAudioEncoding": "غیرفعال کردن کدگذاری صوتی VBR", + "LabelDropLyricsHere": "متن ترانه را اینجا رها کنید یا برای جستوجو کلیک کنید.", + "LabelDuration": "مدت زمان" } diff --git a/src/strings/fi.json b/src/strings/fi.json index 407686b373..6667c81d7b 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -1664,8 +1664,8 @@ "MediaInfoVideoRangeType": "Videon aluetyyppi", "LabelVideoRangeType": "Videon aluetyyppi", "VideoRangeTypeNotSupported": "Videon aluetyyppiä ei tueta", - "LabelVppTonemappingContrastHelp": "Käytä kontrastin vahvistusta VPP-sävykartoituksen kanssa. Suositus- ja oletusarvo on 1.", - "LabelVppTonemappingBrightnessHelp": "Käytä kirkkauden vahvistusta VPP-sävykartoituksen kanssa. Suositus- ja oletusarvot ovat 10 ja 0.", + "LabelVppTonemappingContrastHelp": "Käytä kontrastin vahvistusta VPP-sävykartoituksen kanssa. Suositusarvo on 1.", + "LabelVppTonemappingBrightnessHelp": "Käytä kirkkauden vahvistusta VPP-sävykartoituksen kanssa. Suositusarvo on 16.", "LabelVppTonemappingContrast": "VPP-sävykartoituksen kontrastin vahvistus", "LabelVppTonemappingBrightness": "VPP-sävykartoituksen kirkkauden vahvistus", "IgnoreDtsHelp": "Valinnan poistaminen voi korjata joitakin ongelmia, kuten puuttuvan äänen kanavilla joilla on erilliset ääni- ja videovirrat.", @@ -1754,7 +1754,7 @@ "LogLevel.Critical": "Kriittinen", "LogLevel.None": "Ei mitään", "HeaderEpisodesStatus": "Jaksojen tila", - "AllowSegmentDeletionHelp": "Poista vanhat osiot kun ne on lähetetty päätteelle. Tämän ansiosta transkoodattua tiedostoa ei tarvitse säilyttää kokonaan. Toimii vain rajoituksen ollessa käytössä. Poista käytöstä, jos kohtaat toisto-ongelmia.", + "AllowSegmentDeletionHelp": "Poista vanhat osiot kun ne on ladattu päätteelle. Tämän ansiosta transkoodattua tiedostoa ei tarvitse säilyttää kokonaan. Poista käytöstä, jos kohtaat toisto-ongelmia.", "AllowSegmentDeletion": "Poista osiot", "LabelThrottleDelaySeconds": "Rajoita kun on kulunut", "LabelThrottleDelaySecondsHelp": "Aika sekunneissa, jonka jälkeen transkoodausta rajoitetaan. Tämän on oltava riittävän suuri, jotta päätelaite kykenee ylläpitämään reilua puskuria. Toimii vain rajoituksen ollessa käytössä.", @@ -1920,11 +1920,11 @@ "AllowTonemappingSoftwareHelp": "Sävykartoitus voi muuttaa videon dynaamista aluetta HDR:stä SDR:ään säilyttäen silti kuvan yksityiskohdat ja värin, jotka ovat erittäin tärkeitä alkuperäisen kohtauksen tiedon säilyttämiseksi. Tällä hetkellä se toimii ainoastaan 10bit HDR10, -HLG, ja DoVi-videoiden kanssa.", "Editor": "Ohjaus", "Letterer": "Kirjoittaja", - "LibraryScanFanoutConcurrencyHelp": "Samanaikaisten suoritettavien kirjastoskannausten maksimimäärä. Mikäli tämä arvo on asetettu 0, määrä valitaan järjestelmän prosessorin säikeiden lukumäärän mukaan. VAROITUS: Tämän arvon asettaminen liian korkeaksi voi aiheuttaa ongelmia verkkotiedostojärjestelmissä. Jos koet ongelmatilanteista, laske tätä numeroa.", + "LibraryScanFanoutConcurrencyHelp": "Samanaikaisten suoritettavien kirjastoskannausten maksimimäärä. Mikäli tämä arvo on jätetty tyhjäksi, määrä valitaan järjestelmän prosessorin säikeiden lukumäärän mukaan. VAROITUS: Tämän arvon asettaminen liian korkeaksi voi aiheuttaa ongelmia verkkotiedostojärjestelmissä. Jos koet ongelmatilanteista, laske tätä numeroa.", "SaveLyricsIntoMediaFoldersHelp": "Sanoitusten tallentaminen äänitiedoston kanssa samaan sijaintiin helpottaa niiden hallintaa.", "SelectPreferredTranscodeVideoAudioCodecHelp": "Valitse ensisijainen äänikoodekki videomateriaalin transkoodaamiseen. Jos ensisijainen koodekki ei ole tuettu, serveri käyttää seuraavaksi parasta koodekkia.", "LabelTrickplayAccelEncoding": "Käyttöönota rautakiihdytetty MJPEG enkoodaus", - "LabelTrickplayAccelEncodingHelp": "Tällä hetkellä ainoastaan käytettävissä QSV, VAAPI ja VideoToolbox, tällä valinnalla ei ole vaikutusta muihin rautakiihdytysmetodeihin.", + "LabelTrickplayAccelEncodingHelp": "Tällä hetkellä ainoastaan käytettävissä QSV, VA-API, VideoToolbox ja RKMPP. Tällä valinnalla ei ole vaikutusta muihin rautakiihdytysmetodeihin.", "HeaderVideoAdvanced": "Edistynyt video", "PlaylistPublicDescription": "Salli tämän soittolistan katsominen jokaiselle kirjautuneelle käyttäjälle.", "DateModified": "Muokkauspäivämäärä", @@ -1985,5 +1985,12 @@ "Retry": "Yritä uudelleen", "Reset": "Nollaa", "ReplaceTrickplayImages": "Korvaa nykyiset trickplay kuvat", - "RenderPgsSubtitleHelp": "Renderöidäänkö PGS tekstitykset laitteen toimesta. Tällä voidaan välttää raskas tekstitysten poltto kiinteästi kuvaan palvelimen toimesta, mutta lisätään laitteen renderöintikuormaa." + "RenderPgsSubtitleHelp": "Renderöidäänkö PGS tekstitykset laitteen toimesta. Tällä voidaan välttää raskas tekstitysten poltto kiinteästi kuvaan palvelimen toimesta, mutta lisätään laitteen renderöintikuormaa.", + "HeaderPageNotFound": "Sivua ei löytynyt", + "PageNotFound": "Tämä ei ole etsimäsi sivu.", + "CopyLogSuccess": "Lokitietojen kopiointi onnistui.", + "DeleteServerConfirmation": "Haluatko varmasti poistaa tämän palvelimen?", + "LabelDevice": "Laite", + "MetadataImagesLoadError": "Metadata-asetusten lataus epäonnistui", + "LibraryNameInvalid": "Kirjastolla tulee olla nimi." } diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index 484f41f6cf..ba5afdda0f 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -215,7 +215,7 @@ "LabelVideo": "Vidéo", "DashboardArchitecture": "Architecture : {0}", "DashboardOperatingSystem": "Système d'exploitation : {0}", - "ConfigureDateAdded": "Définissez la façon dont la métadonnée \"Date d'ajout\" est déterminée dans le Tableau de bord > Bibliothèques > Paramètres NFO", + "ConfigureDateAdded": "Définissez la façon dont la métadonnée \"Date d'ajout\" est déterminée dans le Tableau de bord > Bibliothèques > Affichage", "Composer": "Compositeur(trice)", "CommunityRating": "Évaluation de la communauté", "ColorTransfer": "Transfert de couleur", @@ -1183,7 +1183,7 @@ "LabelNumberOfGuideDays": "Nombre de jours de guide à télécharger", "LabelOpenclDeviceHelp": "Le périphérique OpenCL qui sera utilisé pour le « tone mapping » HDR. Le chiffre a gauche du point est le numéro de plateforme, et celui de droite est le numéro de périphérique sur la plateforme. La valeur par défaut est 0.0. Le fichier d’application FFmpeg prenant en charge l’accélération OpenCL est requis.", "LabelParentNumber": "Numéro parent", - "LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’images qui peuvent être exécutés en parallèle. Une valeur de 0 entraînera une sélection automatique d’une limite selon le nombre de coeurs de votre système.", + "LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’images qui peuvent être exécutés en parallèle. Une valeur vide entraînera une sélection automatique d’une limite selon le nombre de coeurs de votre système.", "LabelPasswordResetProvider": "Fournisseur de récupération de mot de passe", "LabelPlayDefaultAudioTrack": "Lire la piste audio par défaut peu importe la langue", "LabelPostProcessor": "Application de post-traitement", @@ -1353,7 +1353,7 @@ "Letterer": "Lettreur", "Next": "Suivant", "LibraryScanFanoutConcurrency": "Limite de tâches de scan de médiathèque en parallèle", - "LibraryScanFanoutConcurrencyHelp": "Nombre maximal de tâches en parallèle pour les scans de médiathèque. Une valeur de 0 laissera le système choisir une limite en fonction du nombre de coeurs. ATTENTION: Définir une valeur trop élevée peut causer des problèmes avec les systèmes de fichers réseau. Si vous avez des problèmes, réduisez cette valeur.", + "LibraryScanFanoutConcurrencyHelp": "Nombre maximal de tâches en parallèle pour les scans de médiathèque. Une valeur vide laissera le système choisir une limite en fonction du nombre de coeurs. ATTENTION: Définir une valeur trop élevée peut causer des problèmes avec les systèmes de fichers réseau. Si vous avez des problèmes, réduisez cette valeur.", "OptionEveryday": "Tous les jours", "OptionForceRemoteSourceTranscoding": "Forcer le transcodage pour les sources de média externes comme la télé en direct", "OptionHasThemeVideo": "Générique", @@ -1943,5 +1943,19 @@ "LabelProcessPriorityHelp": "Un réglage inférieur ou supérieur déterminera la manière dont le processeur donne la priorité au processus de génération de trickplay ffmpeg par rapport aux autres processus. Si vous remarquez un ralentissement lors de la génération d'images trickplay mais que vous ne souhaitez pas arrêter complètement leur génération, essayez de réduire ce ralentissement en modifiant le nombre de threads.", "LabelTileWidthHelp": "Nombre maximum d'images par tuile dans la direction X.", "LabelTileHeight": "Hauteur des tuiles", - "LabelTileHeightHelp": "Nombre maximum d'images par tuile dans la direction Y." + "LabelTileHeightHelp": "Nombre maximum d'images par tuile dans la direction Y.", + "SettingsPageLoadError": "Échec du chargement de la page des paramètres", + "RetryWithGlobalSearch": "Réessayez avec une recherche globale", + "HeaderPageNotFound": "Page introuvable", + "PageNotFound": "Ceci n'est pas la page que vous cherchez.", + "MetadataNfoLoadError": "Échec du chargement des paramètres NFO des métadonnées", + "CopyLogSuccess": "Le contenu des journaux a été copié avec succès.", + "Retry": "Réessayer", + "DisplayLoadError": "Une erreur est survenue lors du chargement des données de configuration d'affichage.", + "LogLoadFailure": "Échec du chargement du fichier journal. Il est possible qu'il soit encore en cours d'écriture.", + "DeleteServerConfirmation": "Êtes-vous sûr de vouloir supprimer ce serveur ?", + "LastActive": "Dernière activation", + "LabelDevice": "Appareil", + "MetadataImagesLoadError": "Échec du chargement des paramètres de métadonnées", + "LibraryNameInvalid": "Le nom de la bibliothèque ne peut pas être vide." } diff --git a/src/strings/fr.json b/src/strings/fr.json index 08003713d1..cab7e3d56e 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -106,7 +106,7 @@ "ColorTransfer": "Transfert de couleur", "CommunityRating": "Note de la communauté", "Composer": "Compositeur", - "ConfigureDateAdded": "Définir comment la métadonnée 'Date d'ajout' est déterminée dans 'Tableau de bord' > 'Médiathèques' > 'Paramètres NFO'", + "ConfigureDateAdded": "Définir comment la métadonnée 'Date d'ajout' est déterminée dans 'Tableau de bord' > 'Médiathèques' > 'Affichage'", "ConfirmDeleteImage": "Supprimer l'image ?", "ConfirmDeleteItem": "Supprimer cet élément l'effacera à la fois du système de fichiers et de votre médiathèque. Voulez-vous vraiment continuer ?", "ConfirmDeleteItems": "Supprimer ces éléments les effacera à la fois du système de fichiers et de votre médiathèque. Voulez-vous vraiment continuer ?", @@ -1719,7 +1719,7 @@ "Short": "Court-métrage", "HeaderPerformance": "Performance", "LabelParallelImageEncodingLimit": "Limite de parallélisation de l'encodage d'image", - "LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’image autorisés à s’exécuter en parallèle. Si vous définissez cette valeur sur 0, la limite sera choisie en fonction du nombre de cœurs de votre système.", + "LabelParallelImageEncodingLimitHelp": "Nombre maximal d’encodages d’image autorisés à s’exécuter en parallèle. Si vous laissez cette valeur vide, la limite sera choisie en fonction du nombre de cœurs de votre système.", "LabelEnableAudioVbr": "Activer l’encodage audio VBR", "LabelEnableAudioVbrHelp": "Le débit binaire variable offre une qualité supérieure à la moyenne mais peut, dans de rares cas, causer des problèmes de mise en mémoire tampon et de compatibilité.", "LabelTonemappingMode": "Mode de mappage tonal", @@ -1883,7 +1883,7 @@ "HeaderLyricDownloads": "Téléchargements des paroles", "Illustrator": "Illustrateur", "Author": "Auteur", - "LibraryScanFanoutConcurrencyHelp": "Nombre maximal de tâches en parallèle pour les scans de bibliothèque. Si vous définissez cette valeur à 0, la limite sera choisie en fonction du nombre de cœurs de votre système. ATTENTION : Définir une valeur trop élevée peut causer des problèmes avec les systèmes de fichiers en réseau ; si vous rencontrez des problèmes, diminuez cette valeur.", + "LibraryScanFanoutConcurrencyHelp": "Nombre maximal de tâches en parallèle pour les scans de bibliothèque. Si vous laissez cette valeur vide, la limite sera choisie en fonction du nombre de cœurs de votre système. ATTENTION : Définir une valeur trop élevée peut causer des problèmes avec les systèmes de fichiers en réseau ; si vous rencontrez des problèmes, diminuez cette valeur.", "Colorist": "Coloriste", "Creator": "Créateur", "LibraryScanFanoutConcurrency": "Limite de tâches de scan de bibliothèque en parallèle", @@ -2002,5 +2002,16 @@ "NativeSubtitleStylingHelp": "Le style des sous-titres ne fonctionne pas sur certains appareils. Cependant, cela n'entraîne aucune perte de performances.", "DeleteServerConfirmation": "Êtes-vous sûr de vouloir supprimer ce serveur ?", "LastActive": "Dernière activation", - "LabelDevice": "Appareil" + "LabelDevice": "Appareil", + "MetadataNfoLoadError": "Échec du chargement des paramètres NFO des métadonnées", + "CopyLogSuccess": "Le contenu des journaux a été copié avec succès.", + "Retry": "Réessayer", + "LogLoadFailure": "Échec du chargement du fichier journal. Il est possible qu'il soit encore en cours d'écriture.", + "DisplayLoadError": "Une erreur est survenue lors du chargement des données de configuration d'affichage.", + "MetadataImagesLoadError": "Échec du chargement des paramètres de métadonnées", + "LibraryNameInvalid": "Le nom de la bibliothèque ne peut pas être vide.", + "HeaderPageNotFound": "Page introuvable", + "PageNotFound": "Ceci n'est pas la page que vous cherchez.", + "SettingsPageLoadError": "Échec du chargement de la page des paramètres", + "RetryWithGlobalSearch": "Réessayez avec une recherche globale" } diff --git a/src/strings/he.json b/src/strings/he.json index 020f7848dc..4af9b5333c 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -33,7 +33,7 @@ "ChannelNameOnly": "ערוץ {0} בלבד", "ChannelNumber": "מספר ערוץ", "Composer": "מלחין", - "ConfigureDateAdded": "‫הגדר כיצד תאריך ההוספה נקבע בלוח המחוונים ב- Dashboard > Libraries > NFO Settings", + "ConfigureDateAdded": "‫הגדר כיצד תאריך ההוספה נקבע בלוח המחוונים ב- Dashboard > Libraries > Display", "ConfirmDeleteImage": "למחוק את התמונה?", "ConfirmDeleteItem": "מחיקת פריט זה תמחק אותו הן ממערכת הקבצים והן מספריית המדיה שלך. האם אתה בטוח שברצונך להמשיך?", "ConfirmDeleteItems": "מחיקת פריטים אלה תמחק אותם הן ממערכת הקבצים והן מספריית המדיה שלך. האם אתה בטוח שברצונך להמשיך?", @@ -1366,7 +1366,7 @@ "LabelPublishedServerUri": "כתובות URI של השרת שיפורסמו", "LabelPublishedServerUriHelp": "יש לדרוס את ה-URI שבשימוש ג'ליפין, בהתבסס על כרטיס הרשת, או כתובת IP של הלקוח. למשל: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, או all=https://jellyfin.example.com", "LabelParallelImageEncodingLimit": "גבול קידוד תמונות במקביל", - "LabelParallelImageEncodingLimitHelp": "המספר המקסימלי של קידודי תמונות שירוצו במקביל. הגדרה של 0 תבחר ערך בהתאם למספר המעבדים במערכת שלך.", + "LabelParallelImageEncodingLimitHelp": "המספר המקסימלי של קידודי תמונות שירוצו במקביל. השארת ערך זה ריק תקבע מגבלה בהתאם למספר המעבדים במערכת שלך.", "LabelPlayDefaultAudioTrack": "ניגון פס הקול הדיפולטי ללא תלות בשפה", "LabelPublicHttpPortHelp": "מספר הפורט הפומבי אשר ימופה לפורט HTTP המקומי.", "LabelQsvDevice": "רכיב QSV", @@ -1472,7 +1472,7 @@ "LeaveBlankToNotSetAPassword": "ניתן להשאיר ריק כדי להימנע מהגדרת סיסמה.", "Letterer": "מכתב/ת", "LibraryScanFanoutConcurrency": "הגבלת מספר סריקות הספרייה המקבילות", - "LibraryScanFanoutConcurrencyHelp": "המספר המירבי של משימות מקבילות במהלך סריקת ספריות. הגדרה כ-0 תבחר גבול בהתבסס על מספר המעבדים במערכת שלך. אזהרה: הגדרת מספר גבוה מדי עלולה לגרום לבעיות עם מערכות קבצים ברשת. אם נתקלת בבעיה יש להוריד את המספר.", + "LibraryScanFanoutConcurrencyHelp": "המספר המירבי של משימות מקבילות במהלך סריקת ספריות. השארת ערך זה ריק תקבע גבול בהתבסס על מספר המעבדים במערכת שלך. אזהרה: הגדרת מספר גבוה מדי עלולה לגרום לבעיות עם מערכות קבצים ברשת. אם נתקלת בבעיה יש להוריד את המספר.", "LogLevel.Information": "מידע", "LogLevel.Warning": "אזהרה", "LogLevel.Error": "שגיאה", @@ -1931,5 +1931,18 @@ "CustomSubtitleStylingHelp": "עיצוב הכתוביות עובד ברוב המכשירים, אך גורר פגיעה נוספת בביצועים.", "LabelSubtitleStyling": "עיצוב כתוביות", "Native": "מקורי", - "NativeSubtitleStylingHelp": "עיצוב הכתוביות לא יעבוד על מכשירים מסוימים. עם זאת, לא תהיה פגיעה בביצועים." + "NativeSubtitleStylingHelp": "עיצוב הכתוביות לא יעבוד על מכשירים מסוימים. עם זאת, לא תהיה פגיעה בביצועים.", + "MetadataNfoLoadError": "קרתה שגיאה בתהליך טעינת הגדרות הNFO מטא-דאטה", + "HeaderPageNotFound": "דף זה לא נמצא", + "PageNotFound": "זה לא הדף שחיפשתם.", + "CopyLogSuccess": "תוכן הלוג הועתק ללוח בהצלחה.", + "LogLoadFailure": "נכשל בטעינת קובץ הלוג. ייתכן שעדיין ממשיך להיכתב לקובץ זה.", + "DisplayLoadError": "קרתה שגיאה בתהליך טעינת נתוני הגדרות התצוגה.", + "Retry": "נסה שנית", + "DeleteServerConfirmation": "האם אתה בטוח שברצונך למחוק שרת זה?", + "LabelDevice": "מכשיר", + "LastActive": "פעילות אחרונה", + "MetadataImagesLoadError": "קרתה שגיאה בתהליך טעינת הגדרות המטא-דאטה", + "LibraryNameInvalid": "שם הספרייה לא יכול להיות ריק.", + "SettingsPageLoadError": "נכשל בטעינת דף ההגדרות" } diff --git a/src/strings/hr.json b/src/strings/hr.json index 70357bf3e4..2b82e04a8f 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -1133,7 +1133,7 @@ "ClearQueue": "Očisti red", "Bwdif": "BWDIF", "ButtonPlayer": "Reproduktor", - "AllowTonemappingHelp": "Tonsko preslikavanje može transformirati dinamički raspon videozapisa iz HDR u SDR zadržavajući detalje slike i boje, što su vrlo važne informacije za predstavljanje izvorne scene. Trenutačno radi samo pri transkodiranju videozapisa s ugrađenim HDR10 ili HLG metapodacima. Ako reprodukcija nije glatka ili ne uspije, razmislite o isključivanju odgovarajućeg hardverskog dekodera HDR10 ili HLG videozapisa. Ovo zahtijeva odgovarajuće OpenCL ili CUDA runtime.", + "AllowTonemappingHelp": "Tonsko preslikavanje može transformirati dinamički raspon videozapisa iz HDR u SDR zadržavajući detalje slike i boje, što su vrlo važne informacije za predstavljanje izvorne scene. Trenutačno radi samo pri prekodiranju videozapisa s ugrađenim HDR10 ili HLG metapodatcima. Ako reprodukcija nije glatka ili ne uspije, razmislite o isključivanju odgovarajućeg hardverskog dekodera HDR10 ili HLG videozapisa. Ovo zahtijeva odgovarajući GPGPU runtime.", "LabelCreateHttpPortMap": "Omogući automatsko mapiranje ulaza za HTTP i HTTPS promet.", "LabelChromecastVersion": "Google Cast verzija", "LabelCertificatePasswordHelp": "Ako Vaš certifikat zahtjeva lozinku, molimo unesite je ovdje.", @@ -1564,5 +1564,25 @@ "CoverArtist": "Ilustrator omota", "Creator": "Autor", "MessageImageTypeNotSelected": "Molimo odaberite vrstu slike u padajućem izborniku.", - "AllowFmp4TranscodingContainerHelp": "Dopusti fMP4 spremnik transkodiranja za ovaj tuner za omogućavanje HEVC i HDR sadržaja. Nisu svi tuneri kompatibilni s ovim spremnikom. Isključite ovu opciju ako imate problema s reprodukcijom." + "AllowFmp4TranscodingContainerHelp": "Dopusti fMP4 spremnik transkodiranja za ovaj tuner za omogućavanje HEVC i HDR sadržaja. Nisu svi tuneri kompatibilni s ovim spremnikom. Isključite ovu opciju ako imate problema s reprodukcijom.", + "Custom": "Prilagođeno", + "Retry": "Pokušaj ponovno", + "DisplayLoadError": "Dogodila se pogreška tijekom prikazivanja podataka za konfiguraciju.", + "EnableLibrary": "Uključite biblioteku", + "EnableLibraryHelp": "Isključivanje bibliotekeće ju sakriti od svih korisnika.", + "AlwaysBurnInSubtitleWhenTranscoding": "Uvijek ureži titlove tijekom prekodiranja", + "AlwaysRemuxFlacAudioFilesHelp": "Ako imate datoteke koje Vaš preglednik ne želi izvoditi ili kada neprecizno izračuna vremenske oznake, uključite ovo kao zaobilazak.", + "AlwaysRemuxMp3AudioFilesHelp": "Ako imate datoteke za koje Vaš preglednik neprecizno izračunava vremenske oznake, uključite ovo kao zaobilazak.", + "EditLyrics": "Uredi tekst pjesme", + "EnableDts": "Uključi DTS (DCA)", + "EnableDtsHelp": "Uključite samo ako Vaš uređaj podržava DTS ili je spojen na kompatibilni audio receiver ili će se stvarati problemi sa izvođenjem.", + "Alternate": "Alternativno", + "AlternateDVD": "Alternativni DVD", + "DeleteServerConfirmation": "Jeste li sigurni da želite obrisati ovaj poslužitelj?", + "EnableHi10pHelp": "Uključi za izbjegavanje transkodiranja H.264 10-bitnih videozapisa. Isključite ovu opciju ako videozapis prikazuje prazne slike.", + "Anime": "Anime", + "EnableHi10p": "Uključi H.264 High 10 Profil", + "EnableTrueHd": "Uključi TrueHD", + "Editor": "Uređivač", + "DateModified": "Datum izmjenjivanja" } diff --git a/src/strings/hu.json b/src/strings/hu.json index bf62e8b964..b5776e06b7 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1976,5 +1976,21 @@ "LabelTrickplayKeyFrameOnlyExtractionHelp": "Csak kulcsképkockák kinyerése a jelentősen gyorsabb számítás érdekében, de kevésbé pontos időzítéssel. Ha a beállított hardveres dekódoló nem támogatja ezt a módot, akkor a szoftveres dekódoló lesz használva.", "DeleteServerConfirmation": "Biztos, hogy törli ezt a kiszolgálót?", "VideoCodecTagNotSupported": "A videókodek-címke nem támogatott", - "LabelTrickplayKeyFrameOnlyExtraction": "Képek előállítása csak kulcsképkockákból" + "LabelTrickplayKeyFrameOnlyExtraction": "Képek előállítása csak kulcsképkockákból", + "HeaderPageNotFound": "Az oldal nem található", + "LabelMediaSegmentProviders": "Médiaszegmens szolgáltatók", + "MediaSegmentProvidersHelp": "Engedélyezd és tedd sorba a médiaszegmens szolgáltatókat preferencia (prioritás) alapján.", + "MetadataNfoLoadError": "Nem sikerült a metaadat NFO beállításokat betölteni", + "PageNotFound": "Ez nem az oldal, amit keresel.", + "SettingsPageLoadError": "Nem sikerült betölteni a beállítások oldalt", + "CustomSubtitleStylingHelp": "A feliratstílus működni fog a legtöbb eszközön, de további teljesítményt igényel.", + "LabelSubtitleStyling": "Feliratstílus", + "CopyLogSuccess": "A napló tartalma sikeresen másolva lett.", + "DisplayLoadError": "Egy hibába ütköztünk a kijelző beállításainak betöltése közben.", + "LabelDevice": "Eszköz", + "LastActive": "Legutóbb aktív", + "PreferNonstandardArtistsTagHelp": "Használja a nem szabványos ARTISTS címkét az ARTIST címke helyett, ha elérhető.", + "Penciller": "Grafikus", + "MetadataImagesLoadError": "Nem sikerült betölteni a metaadat beállításokat", + "LibraryNameInvalid": "A könyvtár neve nem lehet üres." } diff --git a/src/strings/it.json b/src/strings/it.json index cc68d7247d..c151801b0c 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1721,7 +1721,7 @@ "LabelEnableAudioVbr": "Abilita codifica audio VBR", "LabelEnableAudioVbrHelp": "Il bitrate variabile offre una migliore qualità rispetto al rapporto bitrate medio, ma in alcuni rari casi può causare problemi di buffering e compatibilità.", "LabelParallelImageEncodingLimit": "Limite codifica parallela delle immagini", - "LabelParallelImageEncodingLimitHelp": "Numero massimo di codifiche di immagini che possono essere eseguite in parallelo. Impostandolo su 0 sceglierai un limite basato sul numero di core del sistema.", + "LabelParallelImageEncodingLimitHelp": "Numero massimo di codifiche di immagini che possono essere eseguite in parallelo. Se vuoto sceglierai un limite basato sul numero di core del sistema.", "PreferEmbeddedExtrasTitlesOverFileNames": "Preferisci i titoli incorporati ai nomi dei file per gli extra", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Gli extra hanno spesso lo stesso nome incorporato del parent, controlla questo per usare comunque titoli incorporati per loro.", "SaveRecordingImagesHelp": "Salva le immagini dal fornitore di elenchi EPG insieme ai media.", @@ -1886,7 +1886,7 @@ "PlaylistPublic": "Consenti accesso pubblico", "PlaylistPublicDescription": "Consenti che questa playlist sia visibile ad ogni utente loggato.", "HeaderLyricDownloads": "Scarica testi", - "LibraryScanFanoutConcurrencyHelp": "Massimo numero di task parallele durante la scansione delle librerie. Se impostato a 0 sarà utilizzato il numero di core del sistema. ATTENZIONE: impostare un numero troppo alto potrebbe causare problemi sui network filesystem. In caso di problemi ridurre il numero.", + "LibraryScanFanoutConcurrencyHelp": "Massimo numero di task parallele durante la scansione delle librerie. Se vuoto sarà utilizzato il numero di core del sistema. ATTENZIONE: impostare un numero troppo alto potrebbe causare problemi sui network filesystem. In caso di problemi ridurre il numero.", "LabelSelectPreferredTranscodeVideoAudioCodec": "Codec audio preferito per la transcodica durante la riproduzione video", "LibraryScanFanoutConcurrency": "Massimo numero di task durante la scansione", "Colorist": "Colorista", @@ -2008,5 +2008,10 @@ "Retry": "Riprova", "LogLoadFailure": "Non sono riuscito a caricare il file di log. Potrebbe essere tutt'ora in fase di scrittura.", "DisplayLoadError": "Errore durante il caricamento dei dati di configurazione del display.", - "MetadataImagesLoadError": "Caricamento metadati delle immagini fallito" + "MetadataImagesLoadError": "Caricamento metadati delle immagini fallito", + "MetadataNfoLoadError": "Errore nel caricamento dei metadati NFO", + "HeaderPageNotFound": "Pagina non trovata", + "PageNotFound": "Questa non è la pagina che stai cercando.", + "SettingsPageLoadError": "Errore nel caricamento della pagina di configurazione", + "RetryWithGlobalSearch": "Prova di nuovo con la ricerca globale" } diff --git a/src/strings/ko.json b/src/strings/ko.json index 41a154f9fa..ec9f8c1150 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -1019,7 +1019,7 @@ "Ended": "종료", "EndsAtValue": "{0}에 종료", "HeaderDateIssued": "발행일", - "ConfigureDateAdded": "'추가 된 날짜' 메타데이터가 대시보드>라이브러리>NFO 설정 에서 결정되는 방식 구성", + "ConfigureDateAdded": "'추가 된 날짜' 메타데이터가 대시보드 > 라이브러리 > 디스플레이에서 결정되는 방식 구성", "EnableStreamLoopingHelp": "라이브 스트림에 몇 초의 데이터만 포함되어 있고 지속적으로 요청해야 하는 경우, 이 옵션을 활성화하십시오. 필요하지 않은 경우, 이 기능을 사용하면 문제가 발생할 수 있습니다.", "BurnSubtitlesHelp": "트랜스코딩할 때 영상에 자막을 구울 지 설정합니다. 성능상 사용하지 않는 것이 좋습니다. [자동] 으로 설정하면 이미지 기반 자막(VobSub, PGS, SUB, IDX 등)과 일부 ASS, SSA자막을 굽습니다.", "EnableNextVideoInfoOverlay": "재생 중에 다음 비디오 정보 표시", @@ -1089,7 +1089,7 @@ "HeaderUpcomingOnTV": "방송 예정", "HeaderTranscodingProfileHelp": "트랜스코딩이 필요할 때 사용될 포맷을 지정하기 위해 트랜스코딩 프로필을 추가합니다.", "HeaderResponseProfileHelp": "응답 프로파일을 통해 특정 미디어를 재생했을 때 장치로 전송되는 정보를 사용자화할 수 있습니다.", - "HeaderPlayOn": "여기부터 재생", + "HeaderPlayOn": "재생 기기", "HeaderNavigation": "탐색", "HeaderKeepSeries": "시리즈 유지", "HeaderEnabledFieldsHelp": "데이터 변경을 방지하기 위해서는 필드를 비활성화하여 잠그세요.", @@ -1764,7 +1764,7 @@ "GoHome": "홈으로", "GridView": "그리드 뷰", "LabelBackdropScreensaverInterval": "배경 화면보호기 간격", - "LabelBackdropScreensaverIntervalHelp": "배경 화면보호기를 사용할 때 서로 다른 배경으로 바뀌는 간격 시간(초)", + "LabelBackdropScreensaverIntervalHelp": "배경 화면보호기를 사용할 때 서로 다른 배경으로 바뀌는 간격 시간 (초).", "ListView": "리스트 뷰", "BackdropScreensaver": "배경 화면보호기", "LogoScreensaver": "로고 화면보호기", @@ -1988,5 +1988,7 @@ "LabelDevice": "장치", "LastActive": "마지막 활동", "DeleteServerConfirmation": "이 서버를 삭제하시겠습니까?", - "LibraryNameInvalid": "라이브러리 이름은 비워둘 수 없고 공백으로 시작하거나 끝날 수 없습니다." + "LibraryNameInvalid": "라이브러리 이름은 비워둘 수 없습니다.", + "Inker": "잉커", + "Retry": "재시도" } diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index e7a64f6c32..0faabd2c98 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -1185,5 +1185,7 @@ "DeleteEntireSeries": "Ištrinti {0} epizodus", "DeleteLyrics": "Ištrinti žodžius", "DeleteServerConfirmation": "Ar tikrai ištrinti šį serverį?", - "Anime": "Anime" + "Anime": "Anime", + "AllowStreamSharingHelp": "Leiskite „Jellyfin“ dublikuoti MPEG-TS srautą iš imtuvo ir bendrinti šį dublikuotą srautą su klientais. Tai naudinga, kai imtuvas turi bendrą srautų kiekio apribojimą, tačiau tai taip pat gali sukelti atkūrimo problemų.", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Įrašykite visus subtitrus į vaizdą, kai pradedamas transkodavimas. Tai užtikrina subtitrų sinchronizaciją po transkodavimo, tačiau sumažina transkodavimo greitį." } diff --git a/src/strings/lv.json b/src/strings/lv.json index 913fa7e24e..c63d2db07f 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -689,7 +689,7 @@ "LabelReleaseDate": "Izlaiduma datums", "LabelPreferredSubtitleLanguage": "Ieteicamā subtitru valoda", "LabelPlayerDimensions": "Atskaņotāja dimensijas", - "LabelParentalRating": "Vecāku reitings", + "LabelParentalRating": "Vecuma reitings", "LabelMonitorUsers": "Uzraudzīt aktivitāti no", "LabelMinResumePercentageHelp": "Vienumi tiek uzskatīti par neatskaņotiem, ja apturēti pirms šī laika.", "LabelMinResumePercentage": "Minimālais turpināšanas procents", @@ -1349,7 +1349,7 @@ "LabelDummyChapterCountHelp": "Maksimālais nodaļu attēlu skaits, kas tiks ekstraktēts no katra multivides faila.", "LabelChapterImageResolutionHelp": "Izvilkto nodaļu attēlu izšķirtspēja. Šīs vērtības maiņa neietekmēs esošās fiktīvās nodaļas.", "LabelParallelImageEncodingLimit": "Paralēlas attēlu kodēšanas limits", - "LabelParallelImageEncodingLimitHelp": "Maksimālais attēlu kodējumu skaits, kurus atļauts palaist paralēli. Nosakot 0, tiks izvēlēts ierobežojums, kas balstīts uz jūsu sistēmas kodolu skaitu.", + "LabelParallelImageEncodingLimitHelp": "Maksimālais attēlu kodējumu skaits, kurus atļauts palaist paralēli. Atstājot tukšu, tiks izvēlēts ierobežojums, kas balstīts uz jūsu sistēmas kodolu skaitu.", "HeaderDummyChapter": "Nodaļu attēli", "EnableCardLayout": "Padarīt redzamu CardBox", "MessageConfirmDeleteGuideProvider": "Vai tiešām vēlaties izdzēst šo ceļveža pakalpojumu sniedzēju?", @@ -1748,7 +1748,7 @@ "LabelBuildVersion": "Kompilācijas versija", "SelectAudioNormalizationHelp": "Audioceliņa pastiprinājums — pielāgo katra celiņa skaļumu, lai tie tiktu atskaņoti ar tādu pašu skaļumu. Albuma pastiprinājums - pielāgo visus albuma audio, saglabājot albuma dinamisko diapazonu. Pārslēdzoties starp \"Izslēgts\" un pārējām iespējām, ir nepieciešams pārstartēt pašreizējo atskaņošanu.", "LibraryScanFanoutConcurrency": "Paralēlās bibliotēkas skenēšanas uzdevumu ierobežojums", - "LibraryScanFanoutConcurrencyHelp": "Maksimālais paralēlo uzdevumu skaits bibliotēkas skenēšanas laikā. Iestatot 0, tiks izvēlēts ierobežojums, pamatojoties uz jūsu sistēmas kodolu skaitu. BRĪDINĀJUMS: Pārāk liels skaitlis var radīt problēmas tīkla failu sistēmām. Ja novērojat problēmas, samaziniet šo skaitli.", + "LibraryScanFanoutConcurrencyHelp": "Maksimālais paralēlo uzdevumu skaits bibliotēkas skenēšanas laikā. Atstājot tukšu, tiks izvēlēts ierobežojums, pamatojoties uz jūsu sistēmas kodolu skaitu. BRĪDINĀJUMS: Pārāk liels skaitlis var radīt problēmas tīkla failu sistēmām. Ja novērojat problēmas, samaziniet šo skaitli.", "PlaylistPublic": "Atļaut publisku piekļuvi", "PlaylistPublicDescription": "Ļaut šo atskaņošanas sarakstu skatīt jebkuram autentificētam lietotājam.", "Rate": "Vertējums", @@ -1912,5 +1912,40 @@ "MediaSegmentType.Preview": "Priekšskatījums", "MediaSegmentType.Recap": "Iepr. kopsavilkums", "MoviesAndShows": "Filmas un seriāli", - "HeaderMediaSegmentActions": "Darbības ar multivides segmentiem" + "HeaderMediaSegmentActions": "Darbības ar multivides segmentiem", + "CopyLogSuccess": "Žurnāla saturs pārkopēts veiksmīgi.", + "LastActive": "Pēdējo reizi redzēts", + "DisplayLoadError": "Ielādējot displeja konfigurācijas datus radās kļūda.", + "LabelSaveTrickplayLocally": "Saglabāt trickplay attēlus kopā ar media failu(-iem)", + "LabelDevice": "Ierīce", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Iemontēt visus subtitrus pie transkodēšanas. Tas nodrošinās subtitru sinhronizāciju pēc transkodēšanas, bet transkodēšana notiks lēnāk.", + "AlwaysRemuxMp3AudioFilesHelp": "Ja eksistē faili, kuriem pārlūkprogramma nepareizi kalkulē laikspiedolus, iespējojiet šo kā alternatīvu risinājumu.", + "DeleteServerConfirmation": "Vai tiešām vēlaties nodzēst šo serveri?", + "MetadataNfoLoadError": "Neizdevās ielādēt metadatu NFO iestatījumus", + "MoveToBottom": "Novilkt uz apakšu", + "LyricDownloadersHelp": "Iespējo un sakārto vēlamās dziesmu vārdu lejuplādes sev vēlamā prioritātē.", + "PlaylistError.UpdateFailed": "Atjauninot sarakstu radās kļūda", + "MoveToTop": "Pacelt pašā augšā", + "RenderPgsSubtitle": "Eksperimentāla PGS subtitru renderēšana", + "PreviewLyrics": "Apskatīt vārdus", + "MetadataImagesLoadError": "Neizdevās ielādēt metadatu iestatījumus", + "LibraryNameInvalid": "Bibliotēkas nosaukumu nevar atstāt tukšu.", + "MediaInfoDoViTitle": "DV nosaukums", + "MediaInfoDvVersionMinor": "DV papildversija", + "MediaInfoDvLevel": "DV līmenis", + "Trickplay": "Trickplay", + "MediaInfoDvProfile": "DV profils", + "MediaInfoDvVersionMajor": "DV pamatversija", + "LabelImageIntervalHelp": "Intervāli milisekundēs starp katriem jaunajiem trickplay attēliem.", + "LabelImageInterval": "Attēlu intervāli", + "LabelScanBehavior": "Skenēšanas uzvedība", + "LabelWidthResolutions": "Izķirtspējas platums", + "LabelTrickplayKeyFrameOnlyExtraction": "Ģenerēt attēlus tikai no atslēg-kadriem", + "LabelScanBehaviorHelp": "Noklusējuma uzvedība nebloķē media pievienošanu bibliotēkai pirms trickplay ģenerēšana ir pabeigta. Bloķēšana nodrošinās trickplay failu izveidošanu pirms media ir pievienota bibliotēkai, bet tas padarīs skenēšanu stipri ilgāku.", + "OptionExtractTrickplayImage": "Iespējot trickplay attēlu izvilkšanu", + "ExtractTrickplayImagesHelp": "Trickplay attēli līdzinās sadaļu attēliem, bet tie tiek saģenerēti visam satura garumam un tiek lietoti kā priekšskatījums kad ātri ritina cauri video.", + "LabelExtractTrickplayDuringLibraryScan": "Izgūt trickplay attēlus bibliotēkas skenēšanas laikā", + "LabelJpegQualityHelp": "Trickplay attēlu JPEG kompresijas kvalitātes lielums.", + "LogLoadFailure": "Neizdevās ielādēt žurnālfailu. Iespējams tas tiek aizvien izmantots žurnāla ierakstu saglabāšanai.", + "SettingsPageLoadError": "Neizdevās ielādēt iestatījumu lapu" } diff --git a/src/strings/nb.json b/src/strings/nb.json index b6ca20013a..6b64461c89 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -84,7 +84,7 @@ "ColorSpace": "Fargeutvalg", "ColorTransfer": "Overføring av farger", "Composer": "Komponist", - "ConfigureDateAdded": "Konfigurer hvordan metadata for \"Dato lagt til\" bestemmes på Dashbord > Bibliotek > NFO Innstillinger", + "ConfigureDateAdded": "Konfigurer hvordan metadata for \"Dato lagt til\" bestemmes på Dashbord > Bibliotek > Vis", "ConfirmDeleteImage": "Slett bilde?", "ConfirmDeleteItem": "Sletting av elementet vil slette det fra både filsystemet og biblioteket. Er du sikker på at du vil fortsette?", "ConfirmDeleteItems": "Sletting av disse elementene vil slette dem fra både filsystemet og mediebiblioteket. Er du sikker på at du vil fortsette?", @@ -173,7 +173,7 @@ "HeaderBranding": "Merking", "HeaderCancelRecording": "Avbryt opptak", "HeaderCancelSeries": "Avbryt serie", - "HeaderCastAndCrew": "Skuespillere & mannskap", + "HeaderCastAndCrew": "Medvirkende", "HeaderChannelAccess": "Kanal-tilgang", "HeaderCodecProfile": "Kodekprofil", "HeaderCodecProfileHelp": "Kodekprofiler indikerer begrensningene til en enhet ved avspilling av bestemte kodeker. Hvis en begrensning gjelder vil mediet bli omkodet, selv om kodeken er konfigurert for direkteavspilling.", @@ -439,7 +439,7 @@ "LabelLineup": "Oppstilling", "LabelLocalHttpServerPortNumber": "Lokal HTTP portnummer", "LabelLocalHttpServerPortNumberHelp": "TCP portnummeret for HTTP-serveren.", - "LabelLockItemToPreventChanges": "Lås dette elementet for å hindre fremtidige endringer", + "LabelLockItemToPreventChanges": "Lås dette elementet for å forhindre fremtidige endringer i metadata", "LabelLoginDisclaimer": "Ansvarsfraskrivelse ved innlogging", "LabelLoginDisclaimerHelp": "En melding som vises på bunnen av innloggingssiden.", "LabelLogs": "Logger", @@ -1353,7 +1353,7 @@ "MessageGetInstalledPluginsError": "En feil oppstod ved henting av listen over installerte tillegg.", "MessagePluginInstallError": "En feil oppstod ved installasjon av tillegget.", "ThumbCard": "Miniatyrbildekort", - "SpecialFeatures": "Spesialfunksjoner", + "SpecialFeatures": "Ekstra innhold", "PosterCard": "Plakatkort", "Video": "Video", "Subtitle": "Undertekst", @@ -1720,7 +1720,7 @@ "Studio": "Studio", "SubtitleCyan": "Turkis", "UserMenu": "Brukermenyen", - "Featurette": "Novellefilm", + "Featurette": "Featurette", "LabelTonemappingMode": "Tonemappingsmodus", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Ekstramateriale har ofte det samme innebygde navnet som det opprinnelige materialet. Kryss av for denne for å bruke den innebygde tittelen likevel.", "LabelSyncPlayNoGroups": "Ingen grupper tilgjengelig", @@ -1731,7 +1731,7 @@ "TonemappingModeHelp": "Velg tonemappingsmodus. Hvis du merker overeksponerte høylysområder, prøv å bytt til RGB-modus.", "EnableAudioNormalizationHelp": "Lydnormalisering vil legge på en konstant lydforsterkning for å holde gjennomsnittet på ønsket nivå (-18db).", "LabelEnableLUFSScan": "Slå på LUFS-skanning", - "LabelParallelImageEncodingLimitHelp": "Høyeste antall bildeenkodinger som tillates å kjøre parallelt. Hvis du setter denne til 0, velges en grense basert på antall prosessorkjerne i systemet.", + "LabelParallelImageEncodingLimitHelp": "Maksimalt antall bildeenkodinger som kan kjøres parallelt. Hvis dette feltet står tomt, vil grensen velges basert på antall kjerner i systemet ditt.", "LabelChapterImageResolutionHelp": "Oppløsningen til kapittelbildene. Enring av dette vil ikke ha noen effekt på eksisterende kapittelbilder.", "LabelParallelImageEncodingLimit": "Parallell bildeenkodingsgrense", "LabelEnableLUFSScanHelp": "Klienter kan normalisere lydnivå for å få lik lydstyrke på tvers av spor. Dette vil gjøre bibliotekskanning lengre og bruke flere ressurser.", @@ -1992,5 +1992,20 @@ "LabelDevice": "Enhet", "LastActive": "Sist aktiv", "DeleteServerConfirmation": "Er du sikker på du ønsker å fjerne denne tjeneren?", - "LibraryNameInvalid": "Biblioteksnavn kan ikke være tom eller inneholde mellomrom." + "LibraryNameInvalid": "Biblioteksnavnet kan ikke være tomt.", + "MetadataNfoLoadError": "Kunne ikke laste metadata NFO instillinger", + "PageNotFound": "Dette er ikke siden du ser etter.", + "SettingsPageLoadError": "Kunne ikke laste inn innstillingssiden", + "HeaderPageNotFound": "Side ikke funnet", + "CopyLogSuccess": "Logginnhold kopiert vellykket.", + "LogLoadFailure": "Kunne ikke laste inn loggfilen. Den kan fortsatt være i bruk og skrives til.", + "AutoSubtitleStylingHelp": "Denne modusen vil automatisk bytte mellom den innebygde og egendefinerte undertekststilingen basert på enhetstypen din.", + "CustomSubtitleStylingHelp": "Undertekststilingen vil fungere på de fleste enheter, men medfører en ekstra belastning på ytelsen.", + "Custom": "Egendefinert", + "DisplayLoadError": "Det oppstod en feil under lasting av skjermkonfigurasjonsdata.", + "NativeSubtitleStylingHelp": "Undertekststilingen vil ikke fungere på noen enheter. Den medfører imidlertid ingen ekstra belastning på ytelsen.", + "LabelSubtitleStyling": "Undertekstiling", + "Native": "Innebygd", + "Retry": "Prøv igjen", + "MetadataImagesLoadError": "Kunne ikke laste inn metadata-innstillinger" } diff --git a/src/strings/nl.json b/src/strings/nl.json index 635dd0b1d5..2ab3480cfc 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -98,7 +98,7 @@ "ColorPrimaries": "Primaire kleuren", "ColorSpace": "Kleurbereik", "ColorTransfer": "Kleuroverdracht", - "CommunityRating": "Beoordeling gemeenschap", + "CommunityRating": "Beoordeling publiek", "Composer": "Componist", "ConfigureDateAdded": "Stel in hoe de metadata voor 'Datum toegevoegd' wordt bepaald in Controlepaneel > Bibliotheken > Weergave", "ConfirmDeleteImage": "Afbeelding verwijderen?", @@ -430,7 +430,7 @@ "LabelCertificatePasswordHelp": "Als je certificaat een wachtwoord vereist, vul het dan hier in.", "LabelChannels": "Kanalen", "LabelCollection": "Collectie", - "LabelCommunityRating": "Beoordeling gemeenschap", + "LabelCommunityRating": "Beoordeling publiek", "LabelContentType": "Inhoudstype", "LabelCountry": "Land/regio", "LabelCriticRating": "Beoordeling critici", @@ -821,7 +821,7 @@ "OptionAutomaticallyGroupSeries": "Automatisch series samenvoegen die over meerdere mappen zijn verspreid", "OptionAutomaticallyGroupSeriesHelp": "Series die verspreid zijn over meerdere mappen binnen deze bibliotheek worden automatisch samengevoegd tot één serie.", "OptionBluray": "BD", - "OptionCommunityRating": "Beoordeling gemeenschap", + "OptionCommunityRating": "Beoordeling publiek", "OptionCriticRating": "Beoordeling critici", "OptionCustomUsers": "Aangepast", "OptionDaily": "Dagelijks", @@ -1717,7 +1717,7 @@ "Featurette": "Featurette", "Short": "Korte film", "HeaderPerformance": "Prestaties", - "LabelParallelImageEncodingLimitHelp": "Maximaal aantal afbeeldingscoderingen dat tegelijkertijd mag lopen. Bij een instelling van 0 wordt een limiet gekozen gebaseerd op het aantal processorkernen in je systeem.", + "LabelParallelImageEncodingLimitHelp": "Maximaal aantal afbeeldingscoderingen dat tegelijkertijd mag lopen. Wanneer leeg gelaten wordt er een limiet gekozen gebaseerd op het aantal processorkernen in je systeem.", "LabelParallelImageEncodingLimit": "Limiet gelijktijdige afbeeldingscoderingen", "LabelEnableAudioVbr": "VBR-audiocodering inschakelen", "LabelEnableAudioVbrHelp": "Een variabele bitsnelheid biedt een betere verhouding tussen kwaliteit en gemiddelde bitsnelheid, maar kan in zeldzame gevallen tot bufferen of compatibiliteitsproblemen leiden.", @@ -1890,7 +1890,7 @@ "Letterer": "Beletteraar", "Penciller": "Schetser", "Translator": "Vertaler", - "LibraryScanFanoutConcurrencyHelp": "Maximaal aantal gelijktijdige taken tijdens bibliotheekscans. Bij een instelling van 0 wordt een limiet gekozen gebaseerd op het aantal processorkernen in je systeem. WAARSCHUWING: een te hoge instelling kan problemen veroorzaken met netwerkbestandssystemen; verlaag dit getal als je problemen tegenkomt.", + "LibraryScanFanoutConcurrencyHelp": "Maximaal aantal gelijktijdige taken tijdens bibliotheekscans. Wanneer leeg gelaten wordt er een limiet gekozen gebaseerd op het aantal processorkernen in je systeem. WAARSCHUWING: een te hoge instelling kan problemen veroorzaken met netwerkbestandssystemen; verlaag dit getal als je problemen tegenkomt.", "LibraryScanFanoutConcurrency": "Limiet gelijktijdige bibiotheekscantaken", "LabelSelectPreferredTranscodeVideoAudioCodec": "Gewenste geluidscodec bij afspelen video", "SelectPreferredTranscodeVideoAudioCodecHelp": "Selecteer de gewenste geluidscodec om naartoe te transcoderen bij video-inhoud. Als de voorkeurscodec niet wordt ondersteund, gebruikt de server de beste codec die wel beschikbaar is.", @@ -1980,7 +1980,7 @@ "MediaSegmentAction.Skip": "Overslaan", "MediaSegmentType.Commercial": "Reclame", "MediaSegmentType.Intro": "Intro", - "MediaSegmentType.Outro": "Outro", + "MediaSegmentType.Outro": "Aftiteling", "MediaSegmentType.Preview": "Vooruitblik", "MediaSegmentType.Recap": "Terugblik", "PlaylistError.UpdateFailed": "Fout bij bijwerken afspeellijst", @@ -2007,5 +2007,10 @@ "Retry": "Opnieuw proberen", "LogLoadFailure": "Laden van logboekbestand mislukt. Mogelijk wordt er nog actief naar geschreven.", "DisplayLoadError": "Er is een fout opgetreden bij het laden van de weergaveconfiguratiegegevens.", - "MetadataImagesLoadError": "Laden van metadata-instellingen mislukt" + "MetadataImagesLoadError": "Laden van metadata-instellingen mislukt", + "MetadataNfoLoadError": "Laden van metadata-NFO-instellingen mislukt", + "PageNotFound": "Dit is niet de pagina die je zoekt.", + "HeaderPageNotFound": "Pagina niet gevonden", + "SettingsPageLoadError": "Laden van instellingenpagina mislukt", + "RetryWithGlobalSearch": "Alles doorzoeken" } diff --git a/src/strings/pl.json b/src/strings/pl.json index 5d5fde498e..9cabc1fdca 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -1718,7 +1718,7 @@ "HeaderPerformance": "Wydajność", "Featurette": "Film średniometrażowy", "Short": "Film krótkometrażowy", - "LabelParallelImageEncodingLimitHelp": "Maksymalna liczba kodowań obrazów, które mogą być uruchomione równolegle. Ustawienie wartości na 0 spowoduje wybór limitu w oparciu o specyfikacje Twojego systemu.", + "LabelParallelImageEncodingLimitHelp": "Maksymalna liczba kodowań obrazów, które mogą być uruchomione równolegle. Pozostawienie tego pola pustego spowoduje wybór limitu w oparciu o specyfikacje Twojego systemu.", "LabelParallelImageEncodingLimit": "Limit kodowań obrazów, które mogą być uruchomione równolegle", "LabelEnableAudioVbrHelp": "Zmienna przepływność bitów oferuje lepsze proporcje jakości do przepustowości w porównaniu z przepływnością średnią, ale w niektórych rzadkich przypadkach może powodować problemy z buforowaniem i zgodnością.", "LabelEnableAudioVbr": "Włącz kodowanie audio VBR", @@ -1892,7 +1892,7 @@ "Penciller": "Rysownik", "Translator": "Tłumacz", "LibraryScanFanoutConcurrency": "Limit zadań równoległego skanowania bibliotek", - "LibraryScanFanoutConcurrencyHelp": "Maksymalna liczba zadań równoległych podczas skanowania bibliotek. Ustawienie tej opcji na 0 spowoduje wybranie limitu na podstawie liczby rdzeni systemu. OSTRZEŻENIE: ustawienie zbyt dużej liczby może powodować problemy z sieciowymi systemami plików; jeśli napotkasz problemy, obniż tę liczbę.", + "LibraryScanFanoutConcurrencyHelp": "Maksymalna liczba zadań równoległych podczas skanowania bibliotek. Pozostawienie tego pola pustego spowoduje wybranie limitu na podstawie liczby rdzeni systemu. OSTRZEŻENIE: ustawienie zbyt dużej liczby może powodować problemy z sieciowymi systemami plików; jeśli napotkasz problemy, obniż tę liczbę.", "LabelSelectPreferredTranscodeVideoAudioCodec": "Preferowany transkodowany kodek audio podczas odtwarzania wideo", "SelectPreferredTranscodeVideoAudioCodecHelp": "Wybierz preferowany kodek audio, na który chcesz transkodować zawartość wideo. Jeśli preferowany kodek nie jest obsługiwany, serwer użyje następnego najlepszego dostępnego kodeka.", "Alternate": "Alternatywne", @@ -2008,5 +2008,11 @@ "Retry": "Ponów", "LogLoadFailure": "Nie udało się załadować pliku dziennika. Nadal może być aktywnie zapisywany.", "DisplayLoadError": "Wystąpił błąd podczas ładowania danych konfiguracji wyświetlania.", - "MetadataImagesLoadError": "Nie udało się załadować ustawień metadanych" + "MetadataImagesLoadError": "Nie udało się załadować ustawień metadanych", + "MetadataNfoLoadError": "Nie udało się załadować ustawień metadanych NFO", + "HeaderPageNotFound": "Nie znaleziono strony", + "PageNotFound": "To nie jest strona, której szukasz.", + "SettingsPageLoadError": "Nie udało się załadować strony ustawień", + "RetryWithGlobalSearch": "Ponów, korzystając z wyszukiwania globalnego", + "StreamCountExceedsLimit": "Liczba strumieni przekracza limit" } diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 92124b3a5f..0f1b77e56c 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -1702,7 +1702,7 @@ "LabelChapterImageResolution": "Resolução", "LabelChapterImageResolutionHelp": "A resolução das imagens do capítulo extraídas. Alterar isso não terá efeito nos capítulos fictícios existentes.", "LabelParallelImageEncodingLimit": "Limite de codificação paralela de imagens", - "LabelParallelImageEncodingLimitHelp": "Número máximo de codificações de imagem permitidas para execução em paralelo. Definir como 0 escolherá um limite com base nas especificações do sistema.", + "LabelParallelImageEncodingLimitHelp": "Número máximo de codificações de imagem permitidas para execução em paralelo. Se deixares este campo vazio, será escolhido um limite baseado na contagem de núcleos do teu sistema.", "GetThePlugin": "Obter Plugin", "Notifications": "Notificações", "NotificationsMovedMessage": "A funcionalidade de notificações foi movida para o plugin Webhook.", @@ -2001,5 +2001,8 @@ "LibraryNameInvalid": "O nome da biblioteca não pode estar vazio.", "CopyLogSuccess": "Conteúdos do registo copiados com sucesso.", "Retry": "Tentar novamente", - "LogLoadFailure": "Falha ao carregar o ficheiro de registos. É possível que atualmente esteja a ser escrito." + "LogLoadFailure": "Falha ao carregar o ficheiro de registos. É possível que atualmente esteja a ser escrito.", + "MetadataNfoLoadError": "Falha ao carregar as definições de metadados NFO", + "SettingsPageLoadError": "Falha ao carregar a página de definições", + "RetryWithGlobalSearch": "Tentar novamente com uma pesquisa global" } diff --git a/src/strings/pt.json b/src/strings/pt.json index 6787d53884..0905114fb2 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -1421,7 +1421,7 @@ "LabelParallelImageEncodingLimit": "Limite de codificação de imagens em paralelo", "LabelEnableLUFSScan": "Ativar a verificação LUFS", "LabelEnableLUFSScanHelp": "Os clientes podem normalizar a reprodução de áudio para obter o mesmo volume entre as faixas. Isso fará com que as varreduras da biblioteca sejam mais longas e consumam mais recursos.", - "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.", + "LabelParallelImageEncodingLimitHelp": "Número máximo de codificações de imagem permitidas para execução em paralelo. Se deixares este campo vazio, será escolhido um limite baseado na contagem de núcleos do teu sistema.", "GoHome": "Ir ao início", "GridView": "Vista em grelha", "HeaderConfirmRepositoryInstallation": "Confirmar a instalação do repositório de extensões", @@ -1996,5 +1996,8 @@ "LabelDevice": "Dispositivo", "LastActive": "Última atividade", "DeleteServerConfirmation": "Tens a certeza de que queres eliminar este servidor?", - "LibraryNameInvalid": "O nome da biblioteca não pode estar vazio." + "LibraryNameInvalid": "O nome da biblioteca não pode estar vazio.", + "MetadataNfoLoadError": "Falha ao carregar as definições de metadados NFO", + "SettingsPageLoadError": "Falha ao carregar a página de definições", + "RetryWithGlobalSearch": "Tentar novamente com uma pesquisa global" } diff --git a/src/strings/ro.json b/src/strings/ro.json index 7614678174..9d92b5dbcd 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -1678,7 +1678,7 @@ "LabelChapterImageResolution": "Rezoluție", "LabelChapterImageResolutionHelp": "Rezoluția imaginilor extrase din capitole. Modificarea acestui parametru nu va avea niciun efect asupra capitolelor fictive existente.", "LabelParallelImageEncodingLimit": "Limita encodărilor simultane", - "LabelParallelImageEncodingLimitHelp": "Numărul maxim de encodări ale imaginilor care sunt permise să ruleze simultan. Setarea acestei valori la 0 va alege automat o limită bazată pe specificațiile tehnice ale sistemului.", + "LabelParallelImageEncodingLimitHelp": "Numărul maxim de encodări ale imaginilor care sunt permise să ruleze simultan. Lăsând această opțiune goală, se va alege automat o limită bazată pe specificațiile tehnice ale sistemului.", "HeaderDummyChapter": "Imaginile Capitolelor", "HeaderRecordingMetadataSaving": "Înregistrarea Metadatelor", "EnableSplashScreen": "Activează ecranul splash", @@ -1947,24 +1947,24 @@ "LabelSubtitleStyling": "Stilul subtitrarilor", "LabelQsvDevice": "Dispozitiv QSV", "LabelQsvDeviceHelp": "Specificați dispozitivul pentru Intel QSV pe un sistem multi-GPU. Pe Linux, acesta este nodul de randare, de exemplu, /dev/dri/renderD128. Pe Windows, acesta este indexul dispozitivului care începe de la 0. Lăsați necompletat dacă nu știți ce faceți.", - "LibraryScanFanoutConcurrencyHelp": "Numărul maxim de sarcini paralele în timpul scanărilor bibliotecii. Setarea acestui număr la 0 va alege o limită bazată pe numărul de nuclee ale sistemului dumneavoastră. ATENȚIE: Setarea unui număr prea mare poate cauza probleme cu sistemele de fișiere de rețea; dacă întâmpinați probleme, reduceți acest număr.", + "LibraryScanFanoutConcurrencyHelp": "Numărul maxim de sarcini paralele în timpul scanărilor bibliotecii. Lăsând această opțiune goală, se va alege o limită bazată pe numărul de nuclee ale sistemului dumneavoastră. ATENȚIE: Setarea unui număr prea mare poate cauza probleme cu sistemele de fișiere de rețea; dacă întâmpinați probleme, reduceți acest număr.", "NoLyricsSearchResultsFound": "Nu au fost găsite versuri.", "PluginDisableError": "A apărut o eroare la dezactivarea pluginului.", "MoveToBottom": "Mută la final", "MediaSegmentType.Preview": "Prezentări", "MoviesAndShows": "Filme și seriale", - "MessageCancelSeriesTimerError": "A apărut o eroare la anularea temporizatorului serialului.", - "MessageCancelTimerError": "A apărut o eroare la anularea temporizatorului.", - "PlaylistError.CreateFailed": "Eroare la creare playlist.", + "MessageCancelSeriesTimerError": "A apărut o eroare la anularea temporizatorului serialului", + "MessageCancelTimerError": "A apărut o eroare la anularea temporizatorului", + "PlaylistError.CreateFailed": "Eroare la creare playlist", "MediaSegmentType.Recap": "Rezumat", "PlaylistPublicDescription": "Permite ca acest playlist să fie vizualizat de orice utilizator conectat.", "LyricDownloadersHelp": "Activează și ordonează descărcătoarele de versuri preferate în funcție de prioritate.", - "PlaylistError.AddFailed": "Eroare la adăugarea în playlist.", + "PlaylistError.AddFailed": "Eroare la adăugarea în playlist", "PlaylistPublic": "Permite accesul public", "PluginEnableError": "A apărut o eroare la activarea pluginului.", "LibraryInvalidItemIdError": "Biblioteca se află într-o stare invalidă și nu poate fi editată. Este posibil să întâmpinați un bug: calea din baza de date nu este calea corectă pe sistemul de fișiere.", "MediaSegmentAction.AskToSkip": "Cere să sari peste", - "PlaylistError.UpdateFailed": "Eroare la actualizarea playlistului.", + "PlaylistError.UpdateFailed": "Eroare la actualizarea playlistului", "CopyLogSuccess": "Conținutul jurnalului a fost copiat cu succes.", "PasswordMissingSaveError": "Noua parolă nu poate fi goală.", "Retry": "Reîncearcă", @@ -2002,5 +2002,15 @@ "LabelTrickplayAccelEncodingHelp": "În prezent, această opțiune este disponibilă doar pe QSV, VA-API, VideoToolbox și RKMPP; nu are efect asupra altor metode de accelerare hardware.", "SaveLyricsIntoMediaFolders": "Salvează versurile în folderele media", "RenderPgsSubtitleHelp": "Determină dacă clientul ar trebui să redea subtitrările PGS în locul subtitrărilor încorporate. Aceasta poate evita transcodarea pe server, în schimbul performanței de redare pe client.", - "SelectPreferredTranscodeVideoAudioCodecHelp": "Selectează codec-ul audio preferat pentru transcodare pentru conținutul video. Dacă codec-ul preferat nu este suportat, serverul va utiliza următorul codec disponibil." + "SelectPreferredTranscodeVideoAudioCodecHelp": "Selectează codec-ul audio preferat pentru transcodare pentru conținutul video. Dacă codec-ul preferat nu este suportat, serverul va utiliza următorul codec disponibil.", + "MetadataNfoLoadError": "Nu s-au putut încărca setările metadata NFO", + "MessageSplitVersionsError": "A apărut o eroare în timpul divizării versiunilor", + "HeaderPageNotFound": "Pagina nu a fost găsită", + "PageNotFound": "Aceasta nu este pagina pe care o cauți.", + "NativeSubtitleStylingHelp": "Stilizarea subtitrărilor nu va funcționa pe unele dispozitive. Totuși, acest lucru nu afectează performanța.", + "DisplayLoadError": "A apărut o eroare în timpul încărcării datelor de configurare a afișajului.", + "Penciller": "Creionist", + "MetadataImagesLoadError": "Nu s-au putut încărca setările metadata", + "SettingsPageLoadError": "Încărcarea paginii de setări a eșuat", + "LabelDelimiterWhitelist": "Lista albă de delimitare" } diff --git a/src/strings/ru.json b/src/strings/ru.json index ebfc3d3230..077ae84f60 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -774,7 +774,7 @@ "MediaInfoLayout": "Компоновка", "MediaInfoLevel": "Уровень", "MediaInfoPath": "Путь", - "MediaInfoPixelFormat": "Пикс. формат", + "MediaInfoPixelFormat": "Формат пикселей", "MediaInfoProfile": "Профиль", "MediaInfoRefFrames": "Опорные кадры", "MediaInfoResolution": "Разрешение", @@ -1699,7 +1699,7 @@ "LabelEnableAudioVbr": "Включить кодировку звука VBR", "LabelEnableAudioVbrHelp": "Переменный битрейт обеспечивает лучшее соотношение качества к среднему, но в некоторых редких случаях может вызвать проблемы с буферизацией и совместимостью.", "LabelParallelImageEncodingLimit": "Ограничение на параллельное кодирование изображений", - "LabelParallelImageEncodingLimitHelp": "Максимальное количество кодировок изображений, которые разрешено выполнять параллельно. Установив это значение равным 0, вы выберете ограничение, основанное на количестве ядер вашей системы.", + "LabelParallelImageEncodingLimitHelp": "Максимальное количество кодировок изображений, которые разрешено выполнять параллельно. Оставив это значение пустым, вы выберете ограничение, основанное на количестве ядер вашей системы.", "HeaderPerformance": "Производительность", "LabelDummyChapterDurationHelp": "Интервал между изображениями разделов. Установите значение 0, чтобы отключить генерацию изображений разделов. Изменение этого параметра не повлияет на существующие изображения разделов.", "LabelChapterImageResolutionHelp": "Разрешение созданных изображений разделов. Изменение этого параметра не повлияет на существующие изображения разделов.", @@ -1799,7 +1799,7 @@ "ChannelResolutionUHD4K": "UHD (4K)", "DeleteName": "Удалить {0}", "LabelBuildVersion": "Версия сборки", - "AirPlay": "AirPlay", + "AirPlay": "Трансляция", "AllowContentWithTagsHelp": "Отображать контент с хотя бы одним из заданных тэгов.", "BlockContentWithTagsHelp": "Скрывать контент с хотя бы одним из заданных тэгов.", "ConfirmDeleteSeries": "Удаление сериала приведёт к удалению ВСЕХ {0} эпизодов и из файловой системы, и из вашей библиотеки. Вы уверены, что хотите продолжить?", @@ -1906,7 +1906,7 @@ "EnableTrueHd": "Включить TrueHD", "EnableTrueHdHelp": "Включайте только в том случае, если ваше устройство поддерживает TrueHD или подключено к совместимому аудиоресиверу, в противном случае это может привести к сбою воспроизведения.", "AllowTonemappingSoftwareHelp": "Тонмаппинг может преобразовать динамический диапазон видео из HDR в SDR, сохраняя при этом детали изображения и цвета, которые являются очень важной информацией для отображения исходной сцены. В настоящее время работает только с 10-битными видео HDR10, HLG и DoVi.", - "LibraryScanFanoutConcurrencyHelp": "Максимальное количество параллельных задач при сканировании библиотеки. Установка значения 0 приведет к выбору ограничения в зависимости от количества ядер вашей системы. ВНИМАНИЕ: Установка слишком большого значения может вызвать проблемы с сетевыми файловыми системами; если у вас возникнут проблемы, уменьшите это число.", + "LibraryScanFanoutConcurrencyHelp": "Максимальное количество параллельных задач при сканировании библиотеки. Установка пустого значения приведет к выбору ограничения в зависимости от количества ядер вашей системы. ВНИМАНИЕ: Установка слишком большого значения может вызвать проблемы с сетевыми файловыми системами; если у вас возникнут проблемы, уменьшите это число.", "LabelTrickplayKeyFrameOnlyExtractionHelp": "Извлечение только ключевых кадров для значительно более быстрой обработки с менее точной синхронизацией. Если настроенный аппаратный декодер не поддерживает этот режим, вместо него будет использоваться программный декодер.", "MoveToBottom": "Перейти вниз", "MoveToTop": "Перейти наверх", @@ -2006,5 +2006,13 @@ "DeleteServerConfirmation": "Вы уверены, что хотите удалить этот сервер?", "LogLoadFailure": "Не удалось загрузить файл логов. Возможно, в него активно пишутся логи.", "CopyLogSuccess": "Логи успешно скопированы.", - "Retry": "Повторить" + "Retry": "Повторить", + "MetadataNfoLoadError": "Не удалось загрузить настройки NFO метаданных", + "DisplayLoadError": "Произошла ошибка при загрузке данных конфигурации дисплея.", + "MetadataImagesLoadError": "Не удалось загрузить настройки метаданных", + "HeaderPageNotFound": "Станица не найдена", + "PageNotFound": "Это не та страница, которую вы искали.", + "SettingsPageLoadError": "Не удалось загрузить страницу параметров", + "RetryWithGlobalSearch": "Повторите попытку с помощью глобального поиска", + "StreamCountExceedsLimit": "Количество потоков превышает предельное значение" } diff --git a/src/strings/sk.json b/src/strings/sk.json index 5e07ae3ebc..8811c156c7 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1706,7 +1706,7 @@ "LabelEnableAudioVbr": "Povoliť kódovanie zvuku VBR", "HeaderPerformance": "Výkon", "AllowCollectionManagement": "Povoliť tomuto používateľovi spravovať kolekcie", - "LabelParallelImageEncodingLimitHelp": "Maximálny počet kódovaní obrázkov, ktoré môžu bežať paralelne. Nastavením tejto hodnoty na 0 sa zvolí limit na základe špecifikácie vášho systému.", + "LabelParallelImageEncodingLimitHelp": "Maximálny počet kódovaní obrázkov, ktoré môžu bežať paralelne. Ak túto položku necháte prázdnu, zvolí sa limit na základe počtu CPU jadier vášho systému.", "TonemappingModeHelp": "Vyberte režim mapovania tónov. Ak sa vyskytnú preexponované svetlé miesta, skúste prepnúť na režim RGB.", "Featurette": "Stredne dlhý film", "Short": "Krátky film", @@ -1891,7 +1891,7 @@ "SaveLyricsIntoMediaFoldersHelp": "Uloženie textov piesní k zvukovým súborom umožní ich jednoduchšie spravovanie.", "Translator": "Prekladateľ", "PlaylistPublicDescription": "Povoliť zobrazenie tohto playlistu každému prihlásenému používateľovi.", - "LibraryScanFanoutConcurrencyHelp": "Maximálny počet paralelných úloh počas skenovania knižnice. Nastavením tejto hodnoty na 0 sa zvolí limit na základe počtu jadier CPU vášho systému. UPOZORNENIE: Nastavenie príliš vysokého čísla môže spôsobiť problémy so sieťovými súborovými systémami, Ak sa vyskytnú problémy, znížte toto číslo.", + "LibraryScanFanoutConcurrencyHelp": "Maximálny počet paralelných úloh počas skenovania knižnice. Ak túto položku necháte prázdnu, zvolí sa limit na základe počtu CPU jadier vášho systému. UPOZORNENIE: Nastavenie príliš vysokého čísla môže spôsobiť problémy so sieťovými súborovými systémami, Ak sa vyskytnú problémy, znížte toto číslo.", "LibraryScanFanoutConcurrency": "Limit úloh paralelného skenovania knižnice", "LabelSelectPreferredTranscodeVideoAudioCodec": "Preferovaný zvukový kodek pre prekódovanie počas prehrávania videa", "SelectPreferredTranscodeVideoAudioCodecHelp": "Vyberte preferovaný zvukový kodek pre prekódovanie počas prehrávania videa. Ak preferovaný kodek nie je podporovaný, server použije ďalší najlepší dostupný kodek.", @@ -2008,5 +2008,9 @@ "Retry": "Opakovať", "LogLoadFailure": "Nepodarilo sa načítať súbor logu. Je možné, že sa do neho práve aktívne zapisuje.", "MetadataImagesLoadError": "Nepodarilo sa načítať nastavenia metadát", - "DisplayLoadError": "Pri načítavaní konfiguračných údajov displeja došlo k chybe." + "DisplayLoadError": "Pri načítavaní konfiguračných údajov displeja došlo k chybe.", + "MetadataNfoLoadError": "Nepodarilo sa načítať nastavenia NFO metadát", + "HeaderPageNotFound": "Stránka nebola nájdená", + "PageNotFound": "Toto nie je stránka, ktorú hľadáš.", + "SettingsPageLoadError": "Nepodarilo sa načítať stránku s nastaveniami" } diff --git a/src/strings/te.json b/src/strings/te.json index a436618d9a..8957d7fbb7 100644 --- a/src/strings/te.json +++ b/src/strings/te.json @@ -1306,7 +1306,7 @@ "ConfirmDeleteItems": "ఈ అంశాలను తొలగించడం వలన ఫైల్ సిస్టమ్ మరియు మీ మీడియా లైబ్రరీ రెండింటి నుండి తొలగించబడతాయి. మీరు ఖచ్చితంగా కొనసాగాలని అనుకుంటున్నారా?", "ConfirmDeleteItem": "ఈ అంశాన్ని తొలగిస్తే అది ఫైల్ సిస్టమ్ మరియు మీ మీడియా లైబ్రరీ రెండింటి నుండి తొలగించబడుతుంది. మీరు ఖచ్చితంగా కొనసాగాలని అనుకుంటున్నారా?", "ConfirmDeleteImage": "చిత్రాన్ని తొలగించాలా?", - "ConfigureDateAdded": "లైబ్రరీ సెట్టింగుల క్రింద డాష్‌బోర్డ్‌లో జోడించిన తేదీ ఎలా నిర్ణయించబడుతుందో కాన్ఫిగర్ చేయండి", + "ConfigureDateAdded": "'జోడించిన తేదీ' కోసం మెటాడేటా ఎలా నిర్ణయించబడుతుందో డాష్‌బోర్డ్ > గ్రంథాలయాలు > ప్రదర్శనలో సెటప్ చేయండి", "Composer": "స్వరకర్త", "CommunityRating": "సంఘం రేటింగ్", "ColorTransfer": "రంగు బదిలీ", @@ -1544,5 +1544,33 @@ "AllowTonemappingSoftwareHelp": "వాయు మాపనం అనేది వీడియో యొక్క చైతన్యవంతమైన పరిధిని హెచ్‌డిఆర్ నుండి యస్డిఆర్ కి మార్చగలదు, అదే సమయంలో అసలు దృశ్యాన్ని సూచించడానికి చాలా ముఖ్యమైన సమాచారం అయిన చిత్ర వివరాలు మరియు రంగులను నిర్వహిస్తుంది. ప్రస్తుతం ఇది 10బిట్ హెచ్‌డిఆర్10, హెచ్‌ఎల్‌జి మరియు డోవి వీడియోలతో మాత్రమే పనిచేస్తుంది.", "AlwaysRemuxFlacAudioFilesHelp": "మీ విహరిణి ఆటలాడుట చేయడానికి తిరస్కరించిన వరుసలు ఉంటే లేదా సమయ కొలతలను తప్పుగా లెక్కిస్తే, దీన్ని ఒక పరిష్కారంగా ప్రారంభించండి.", "AlwaysRemuxMp3AudioFilesHelp": "మీ విహరిణి సమయ కొలతలను తప్పుగా లెక్కించే వరుసలు మీ వద్ద ఉంటే, దీన్ని ఒక పరిష్కారంగా ప్రారంభించండి.", - "Anime": "అనిమే" + "Anime": "అనిమే", + "SelectAudioNormalizationHelp": "ట్రాక్ పెరుగుట - ప్రతి ట్రాక్ యొక్క పరిమాణమును సర్దుబాటు చేస్తుంది, తద్వారా అవి ఒకే శబ్ద తీవ్రతతో ప్లేబ్యాక్ అవుతాయి. సేకరణ పుస్తకం పెరుగుట - సేకరణ పుస్తకం యొక్క క్రియాశీలకపరిధిని ఉంచుతూ, సేకరణ పుస్తకంలోని అన్ని ట్రాక్‌ల పరిమాణమును మాత్రమే సర్దుబాటు చేస్తుంది. \"ఆఫ్\" మరియు ఇతర ఎంపికల మధ్య మారడానికి ప్రస్తుత ప్లేబ్యాక్‌ను పునఃప్రారంభించాలి.", + "Console": "కన్సోల్", + "Colorist": "రంగాల వ్యవహారి", + "Conductor": "కండక్టర్", + "CoverArtist": "కవర్ ఆర్టిస్ట్", + "ConfirmDeleteSeries": "ఈ సిరీస్‌ను తొలగించడం వలన ఫైల్ సిస్టమ్ మరియు మీ మీడియా లైబ్రరీ రెండింటి నుండి అన్ని {0} ఎపిసోడ్‌లు తొలగించబడతాయి. మీరు ఖచ్చితంగా కొనసాగించాలనుకుంటున్నారా?", + "Creator": "సృష్టికర్త", + "CopyLogSuccess": "లాగ్ కంటెంట్‌లు విజయవంతంగా అనుకరణ చేయబడ్డాయి.", + "Copy": "అనుకరణ", + "CopyFailed": "అనుకరణ చేయడం సాధ్యం కాలేదు", + "Copied": "అనుకరణ చేయబడింది", + "Cursive": "గొలుసుకట్టు", + "Custom": "ఆచారం", + "ConfirmDeleteLyrics": "ఈ లిరిక్స్‌ను తొలగించడం వలన అవి ఫైల్ సిస్టమ్ మరియు మీ మీడియా లైబ్రరీ రెండింటి నుండి తొలగించబడతాయి. మీరు ఖచ్చితంగా కొనసాగించాలనుకుంటున్నారా?", + "EnableRewatchingNextUp": "తదుపరి దానిలో తిరిగి చూడటం ప్రారంభించండి", + "Editor": "సంపాదకుడు", + "EnableDtsHelp": "మీ పరికరం డిటిఎస్ కి మద్దతు ఇస్తే లేదా అనుకూలమైన ఆడియో రిసీవర్‌కు కనెక్ట్ చేయబడి ఉంటే మాత్రమే ప్రారంభించండి, లేకుంటే అది ప్లేబ్యాక్ వైఫల్యానికి కారణం కావచ్చు.", + "EnableDts": "డిటిఎస్ (డిసిఎ) ని ప్రారంభించండి", + "EnableLibrary": "గ్రాండాలయానీ ప్రారంభించండి", + "EnableLibraryHelp": "గ్రంధాలయాని నిలిపివేయడం వలన అది అన్ని వినియోగదారు వీక్షణల నుండి దాచబడుతుంది.", + "EnableSmoothScroll": "మృదువైన స్క్రోల్‌ను ప్రారంభించండి", + "EnableTrueHd": "ట్రూ హెచ్డి ని ప్రారంభించండి", + "EditLyrics": "సాహిత్యాన్ని సవరించండి", + "EnableHi10p": "H.264 హై 10 ప్రొఫైల్‌ను ప్రారంభించు", + "DownloadAll": "అన్నీ డౌన్‌లోడ్ చేసుకోండి", + "EnableCardLayout": "దృశ్య కార్డ్‌బాక్స్‌ను ప్రదర్శించు", + "EnableHi10pHelp": "H.264 10-బిట్ వీడియోలను ట్రాన్స్‌కోడ్ చేయకుండా ఉండటానికి ప్రారంభించండి. వీడియో ఖాళీ ఫ్రేమ్‌లను ప్రదర్శిస్తే ఈ ఎంపికను నిలిపివేయండి.", + "EnableRewatchingNextUpHelp": "'తదుపరిది' విభాగాలలో ఇప్పటికే చూసిన ఎపిసోడ్‌లను చూపించడాన్ని ప్రారంభించండి." } diff --git a/src/strings/uk.json b/src/strings/uk.json index 32df04c914..fc94c3c0f9 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1244,7 +1244,7 @@ "Primary": "Постер", "PreviousTrack": "Перейти до попереднього", "PreviousChapter": "Попередня сцена", - "Previous": "Попередні", + "Previous": "Назад", "Preview": "Попередній перегляд", "Premieres": "Прем’єри", "Premiere": "Прем’єра", @@ -1381,7 +1381,7 @@ "NextUp": "Далі", "NextTrack": "Перейти до наступного", "NextChapter": "Наступна сцена", - "Next": "Наступні", + "Next": "Вперед", "News": "Новини", "TabDirectPlay": "Пряме відтворення", "TypeOptionPluralMovie": "Фільми", @@ -1716,7 +1716,7 @@ "Featurette": "Художник", "HeaderPerformance": "Продуктивність", "LabelParallelImageEncodingLimit": "Обмеження на паралельне кодування зображень", - "LabelParallelImageEncodingLimitHelp": "Максимальна кількість кодувань зображень, які дозволено запускати паралельно. Якщо встановити значення 0, буде обрано обмеження на основі кількості ядер у вашій системі.", + "LabelParallelImageEncodingLimitHelp": "Максимальна кількість кодувань зображень, які дозволено запускати паралельно. Якщо залишити значення пустим, буде обрано обмеження на основі кількості ядер у вашій системі.", "LabelEnableAudioVbrHelp": "Змінний бітрейт забезпечує краще співвідношення якості до середнього бітрейту, але в деяких рідкісних випадках може спричинити проблеми з буферизацією та сумісністю.", "LabelEnableAudioVbr": "Увімкнути VBR", "Select": "Обрати", @@ -1885,7 +1885,7 @@ "PlaylistPublicDescription": "Дозволити переглядати цього плейлиста будь-якому зареєстрованому користувачеві.", "HeaderLyricDownloads": "Завантаження текстів пісень", "SaveLyricsIntoMediaFolders": "Зберігати тексти пісень в теках з медіафайлами", - "LibraryScanFanoutConcurrencyHelp": "Максимальна кількість паралельних завдань під час сканування медіатеки. Якщо встановити значення 0, буде обрано обмеження на основі кількості ядер у вашій системі. ПОПЕРЕДЖЕННЯ: Занадто високе значення цього параметра може спричинити проблеми з мережевими файловими системами; якщо ви зіткнулися з такими проблемами, зменшіть це значення.", + "LibraryScanFanoutConcurrencyHelp": "Максимальна кількість паралельних завдань під час сканування медіатеки. Якщо залишити значення пустим, буде обрано обмеження на основі кількості ядер у вашій системі. ПОПЕРЕДЖЕННЯ: Занадто високе значення цього параметра може спричинити проблеми з мережевими файловими системами; якщо ви зіткнулися з такими проблемами, зменшіть це значення.", "LibraryScanFanoutConcurrency": "Обмеження на паралельне сканування медіатек", "Inker": "Inker", "Penciller": "Penciler", @@ -2005,5 +2005,9 @@ "Retry": "Повторити", "LogLoadFailure": "Не вдалося завантажити файл журналу. Можливо, до нього ще ведеться активний запис.", "DisplayLoadError": "Виникла помилка під час завантаження даних конфігурації дисплея.", - "MetadataImagesLoadError": "Не вдалося завантажити налаштування метаданих" + "MetadataImagesLoadError": "Не вдалося завантажити налаштування метаданих", + "MetadataNfoLoadError": "Не вдалося завантажити налаштування метаданих NFO", + "HeaderPageNotFound": "Сторінку не знайдено", + "PageNotFound": "Це не та сторінка, яку ви шукаєте.", + "SettingsPageLoadError": "Не вдалося завантажити сторінку налаштувань" } diff --git a/src/strings/vi.json b/src/strings/vi.json index d69f0d6f68..fcfc0dc525 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1706,7 +1706,7 @@ "SubtitleMagenta": "Đỏ Sậm", "SubtitleRed": "Đỏ", "SubtitleWhite": "Trắng", - "LabelParallelImageEncodingLimitHelp": "Số lượng mã hóa hình ảnh tối đa được phép chạy song song. Đặt giá trị này thành 0 sẽ chọn giới hạn dựa trên thông số kỹ thuật hệ thống của bạn.", + "LabelParallelImageEncodingLimitHelp": "Số lượng mã hóa hình ảnh tối đa được phép chạy song song. Để trống sẽ chọn giới hạn dựa trên số lõi hệ thống của bạn.", "SecondarySubtitles": "Phụ đề phụ", "HeaderPerformance": "Hiệu suất", "LabelParallelImageEncodingLimit": "Giới hạn mã hóa hình ảnh song song", @@ -1797,7 +1797,7 @@ "HeaderLyricDownloads": "Tải Xuống Lời Bài Hát", "LabelSelectPreferredTranscodeVideoAudioCodec": "Bộ giải mã âm thanh chuyển mã ưa thích khi phát lại video", "LibraryScanFanoutConcurrency": "Giới hạn tác vụ quét thư viện song song", - "LibraryScanFanoutConcurrencyHelp": "Số lượng tác vụ song song tối đa trong quá trình quét thư viện. Đặt là 0 sẽ chọn một giới hạn dựa trên số lõi trên hệ thống của bạn. CẢNH BÁO: Đặt số này quá cao có thể gây ra vấn đề với hệ thống tệp mạng; nếu gặp sự cố, hãy giảm số này xuống thấp.", + "LibraryScanFanoutConcurrencyHelp": "Số lượng tác vụ song song tối đa lúc quét thư viện. Để trống sẽ chọn một giới hạn dựa trên số lõi trên hệ thống của bạn. CẢNH BÁO: Đặt số này quá cao có thể gây ra vấn đề với hệ thống tệp mạng; nếu gặp sự cố, hãy giảm số này xuống thấp.", "Lyrics": "Lời bài hát", "PlaybackError.ASS_RENDER_ERROR": "Đã xảy ra lỗi trong trình kết xuất phụ đề ASS/SSA.", "PlaybackError.FATAL_HLS_ERROR": "Đã xảy ra lỗi nghiêm trọng trong luồng HLS.", @@ -2005,5 +2005,11 @@ "Retry": "Thử lại", "LogLoadFailure": "Không tải được tệp nhật ký. Nó vẫn có thể được viết tích cực.", "DisplayLoadError": "Đã xảy ra lỗi trong khi tải dữ liệu cấu hình hiển thị.", - "MetadataImagesLoadError": "Không tải được cài đặt dữ liệu mô tả" + "MetadataImagesLoadError": "Không tải được cài đặt dữ liệu mô tả", + "MetadataNfoLoadError": "Tải cài đặt dữ liệu mô tả NFO thất bại", + "PageNotFound": "Đây không phải là trang bạn đang tìm kiếm.", + "HeaderPageNotFound": "Không tìm thấy trang", + "SettingsPageLoadError": "Tải trang cài đặt thất bại", + "StreamCountExceedsLimit": "Số lượng luồng vượt quá giới hạn", + "RetryWithGlobalSearch": "Thử lại với tìm kiếm toàn hệ thống" } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index bdde9c32e6..5104fdb7b9 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -168,7 +168,7 @@ "Episodes": "剧集", "ErrorAddingListingsToSchedulesDirect": "我们将阵容添加到您的Schedules Direct帐户时出错。 Schedules Direct只允许有限的账号排序。 您可能需要在继续前直接登入Schedules Direct 网站并删除其他列表。", "ErrorAddingMediaPathToVirtualFolder": "添加媒体路径时发生错误。请确认路径是有效的,并且Jellyfin有对该位置的访问权。", - "ErrorAddingTunerDevice": "添加协调器设备时发生错误。请确认它是可访问的然后再试一次。", + "ErrorAddingTunerDevice": "添加调谐器设备时发生错误。请确认它是可访问的然后再试一次。", "ErrorAddingXmlTvFile": "访问 XmlTV 文件时发生错误。请确认该文件是否存在然后再试一次。", "ErrorGettingTvLineups": "下载 电视节目表 时发生错误。请确认你的信息是否正确,然后再试。", "ErrorStartHourGreaterThanEnd": "结束时间必须在开始时间后。", @@ -758,7 +758,7 @@ "MessageDirectoryPickerLinuxInstruction": "对于Arch Linux、 CentOS、Debian、Fedora、OpenSuse、Ubuntu上的Linux系统,你必须授权系统服务用户访问你存储位置。", "MessageDownloadQueued": "下载已列队。", "MessageEnablingOptionLongerScans": "启用此选项可能会大大延长媒体库扫描时间。", - "MessageFileReadError": "读取文件发生错误。", + "MessageFileReadError": "读取文件时发生错误,请重试。", "MessageForgotPasswordFileCreated": "已在服务器上创建了以下文件, 并包含有关后续步骤说明", "MessageForgotPasswordInNetworkRequired": "请连接你的家庭网络后再试一次以开始密码重置流程。", "MessageInvalidForgotPasswordPin": "无效的或过期的 PIN码。请再试一次。", @@ -900,7 +900,7 @@ "OptionReportByteRangeSeekingWhenTranscoding": "转码时,报告服务器支持的字节查询", "OptionReportByteRangeSeekingWhenTranscodingHelp": "这是一些设备必需的,不用赶时间。", "OptionRequirePerfectSubtitleMatch": "仅下载与视频文件完全匹配的字幕", - "OptionRequirePerfectSubtitleMatchHelp": "要求完全匹配将会筛选字幕,以仅包括已经通过的确切视频文件,进行测试和验证的字幕。取消选中此项,将会以过多的类似视频文件的字幕下载,也会增加错误或不正确字幕文件的概率。", + "OptionRequirePerfectSubtitleMatchHelp": "要求完美匹配将会筛选字幕,以仅包含那些已经过测试并验证与您的确切视频文件相匹配的字幕。取消勾选此项将增加字幕下载的可能性,但会增加字幕时间轴错位或文本错误的概率。", "OptionResElement": "'res' 元素", "OptionResumable": "可恢复播放", "OptionSaveMetadataAsHidden": "保存媒体资料和图像为隐藏文件", @@ -1381,8 +1381,8 @@ "SubtitleVerticalPositionHelp": "文字出现的行号。正数表示由上到下,负数表示由下到上。", "LabelSubtitleVerticalPosition": "垂直位置", "PreviousTrack": "上一集", - "MessageGetInstalledPluginsError": "获取已安装插件列表时出现错误。", - "MessagePluginInstallError": "安装插件时出现错误。", + "MessageGetInstalledPluginsError": "获取已安装插件列表时发生错误。", + "MessagePluginInstallError": "安装插件时发生错误。", "NextTrack": "下一集", "LabelUnstable": "不稳定", "PlaybackRate": "播放速度", @@ -1717,7 +1717,7 @@ "SubtitleYellow": "黄色", "Featurette": "花絮", "Short": "短片", - "LabelParallelImageEncodingLimitHelp": "允许并行运行的最大图像编码数量。 将其设置为 0 将根据您的系统核心数量选择限制。", + "LabelParallelImageEncodingLimitHelp": "允许并行运行的最大图像编码数量。将其留空则会根据您的系统核心数量选择限制。", "HeaderPerformance": "性能", "LabelParallelImageEncodingLimit": "并行图像编码限制", "LabelEnableAudioVbr": "启用 VBR 音频编码", @@ -1892,7 +1892,7 @@ "Penciller": "线稿师", "Translator": "译者", "LibraryScanFanoutConcurrency": "并行媒体库扫描任务限制", - "LibraryScanFanoutConcurrencyHelp": "媒体库扫描期间并行任务的最大数量。将其设置为 0 将根据您的系统核心数量选择限制。警告:将此数字设置得太高可能会导致网络文件系统出现问题; 如果您遇到问题,请降低此数字。", + "LibraryScanFanoutConcurrencyHelp": "媒体库扫描期间并行任务的最大数量。将其留空则将根据您的系统核心数量选择限制。警告:将此数字设置得太高可能会导致网络文件系统出现问题; 如果您遇到问题,请降低此数字。", "LabelSelectPreferredTranscodeVideoAudioCodec": "转码播放视频时首选的音频编码", "SelectPreferredTranscodeVideoAudioCodecHelp": "选择转码播放视频时首选的音频编码方式。如果首选的音频编码不被支持,服务器将使用下一个最佳的音频编码。", "Regional": "区域", @@ -1906,11 +1906,11 @@ "LabelNoChangelog": "这个版本并没有更改日志。", "LabelNotInstalled": "未安装", "LabelRepository": "仓库", - "PluginDisableError": "在安装插件时发生错误。", - "PluginEnableError": "在启用插件的时候发生错误。", - "PluginLoadConfigError": "在获取插件配置页面的时候发生错误。", - "PluginLoadRepoError": "在从仓库获取插件详情的时候发生了错误。", - "PluginUninstallError": "在卸载插件的时候发生了错误。", + "PluginDisableError": "禁用插件时发生错误。", + "PluginEnableError": "启用插件时发生错误。", + "PluginLoadConfigError": "获取插件配置页面时发生错误。", + "PluginLoadRepoError": "从仓库获取插件详情时发生错误。", + "PluginUninstallError": "卸载插件时发生错误。", "HeaderNextItemPlayingInValue": "下一个 {0} 在 {1} 播放", "AndOtherArtists": "{0} 和 {1} 位其他艺术家。", "PasswordMissingSaveError": "新密码不能为空。", @@ -2003,5 +2003,14 @@ "LabelDevice": "设备", "LastActive": "上次活跃", "DeleteServerConfirmation": "您确定要删除此服务器吗?", - "LibraryNameInvalid": "媒体库名称不能为空。" + "LibraryNameInvalid": "媒体库名称不能为空。", + "CopyLogSuccess": "已成功复制日志内容。", + "Retry": "重试", + "DisplayLoadError": "加载显示配置时发生错误。", + "MetadataImagesLoadError": "加载元数据设置时发生错误", + "MetadataNfoLoadError": "无法加载元数据 NFO 设置", + "HeaderPageNotFound": "未找到页面", + "PageNotFound": "这不是您正在寻找的页面。", + "LogLoadFailure": "无法加载日志文件,可能正在被写入中。", + "SettingsPageLoadError": "加载设置页面时发生错误" } diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index c5df0ec2eb..c96aa8c289 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -194,7 +194,7 @@ "OptionUnairedEpisode": "尚未播放的劇集", "OptionWakeFromSleep": "從休眠中恢復", "OptionWeekly": "每週", - "ParentalRating": "Parental Rating", + "ParentalRating": "家長分級", "Play": "播放", "Record": "錄影", "Refresh": "重新整理", @@ -1279,5 +1279,25 @@ "LogLoadFailure": "無法載入日誌檔。其他程序可能仍在寫入中。", "CoverArtist": "翻唱藝人", "Creator": "創作者", - "CopyLogSuccess": "已複製日誌內容。" + "CopyLogSuccess": "已複製日誌內容。", + "DisplayLoadError": "載入顯示配置時發生錯誤。", + "MetadataNfoLoadError": "無法載入 NFO 元數據設定", + "Mixer": "混合器", + "MetadataSettingChangeHelp": "更改元數據設定將會影響之後新增的內容。若要更新現有內容,請打開詳細資訊頁面並點擊「刷新」按鈕,或使用「元數據管理器」進行批量刷新。", + "MoreFromValue": "更多來自 {0} 的內容", + "MixedMoviesShows": "混合的電影和節目", + "MetadataImagesLoadError": "無法載入元數據設定", + "MoreMediaInfo": "媒體資訊", + "MoveToTop": "移至頂部", + "MoviesAndShows": "電影及節目", + "MusicArtist": "音樂藝人", + "MusicAlbum": "音樂專輯", + "MoveRight": "向右移動", + "MoveToBottom": "移至底部", + "MoveLeft": "向左移動", + "PasswordResetComplete": "密碼已重設。", + "HeaderPageNotFound": "找不到頁面", + "PageNotFound": "這不是你要找的頁面。", + "PasswordMatchError": "密碼和確認密碼必須一致。", + "PasswordRequiredForAdmin": "管理員帳戶必須設定密碼。" } diff --git a/src/themes/appletv/theme.css b/src/themes/appletv/theme.scss similarity index 100% rename from src/themes/appletv/theme.css rename to src/themes/appletv/theme.scss diff --git a/src/themes/blueradiance/theme.css b/src/themes/blueradiance/theme.scss similarity index 100% rename from src/themes/blueradiance/theme.css rename to src/themes/blueradiance/theme.scss diff --git a/src/themes/dark/theme.css b/src/themes/dark/theme.scss similarity index 100% rename from src/themes/dark/theme.css rename to src/themes/dark/theme.scss diff --git a/src/themes/light/theme.css b/src/themes/light/theme.scss similarity index 100% rename from src/themes/light/theme.css rename to src/themes/light/theme.scss diff --git a/src/themes/purplehaze/theme.css b/src/themes/purplehaze/theme.scss similarity index 100% rename from src/themes/purplehaze/theme.css rename to src/themes/purplehaze/theme.scss diff --git a/src/themes/wmc/theme.css b/src/themes/wmc/theme.scss similarity index 100% rename from src/themes/wmc/theme.css rename to src/themes/wmc/theme.scss diff --git a/src/utils/dashboard.js b/src/utils/dashboard.js index e67a80b66c..9b468730d6 100644 --- a/src/utils/dashboard.js +++ b/src/utils/dashboard.js @@ -61,7 +61,7 @@ export async function serverAddress() { let config; try { config = await resp.json(); - } catch (err) { + } catch { return; } @@ -105,7 +105,7 @@ export function logout() { // Reset cached views viewContainer.reset(); webSettings.getMultiServer().then(multi => { - multi ? navigate('selectserver.html') : navigate('login.html'); + multi ? navigate('selectserver') : navigate('login'); }); }); } @@ -191,7 +191,7 @@ export function selectServer() { if (window.NativeShell && typeof window.NativeShell.selectServer === 'function') { window.NativeShell.selectServer(); } else { - navigate('selectserver.html'); + navigate('selectserver'); } } diff --git a/src/utils/number.ts b/src/utils/number.ts index 553280c1fe..af7e5f7307 100644 --- a/src/utils/number.ts +++ b/src/utils/number.ts @@ -9,6 +9,7 @@ function toLocaleStringSupportsOptions() { * @returns {number} Randomly generated number. */ export function randomInt(min: number, max: number): number { + // eslint-disable-next-line sonarjs/pseudo-random return Math.floor(Math.random() * (max - min + 1)) + min; } diff --git a/webpack.common.js b/webpack.common.js index 0a4f543a2d..b66f0b7611 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -1,3 +1,4 @@ +const fg = require('fast-glob'); const path = require('path'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const CopyPlugin = require('copy-webpack-plugin'); @@ -33,24 +34,25 @@ try { const NODE_MODULES_REGEX = /[\\/]node_modules[\\/]/; +const THEMES = fg.globSync('themes/**/*.scss', { cwd: path.resolve(__dirname, 'src') }); +const THEMES_BY_ID = THEMES.reduce((acc, theme) => { + acc[theme.substring(0, theme.lastIndexOf('/'))] = `./${theme}`; + return acc; +}, {}); + const config = { context: path.resolve(__dirname, 'src'), target: 'browserslist', + entry: { + 'main.jellyfin': './index.jsx', + ...THEMES_BY_ID + }, resolve: { extensions: ['.tsx', '.ts', '.js'], modules: [ path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules') - ], - alias: { - '@mui/base': '@mui/base/legacy', - '@mui/lab': '@mui/lab/legacy', - '@mui/material': '@mui/material/legacy', - '@mui/private-theming': '@mui/private-theming/legacy', - '@mui/styled-engine': '@mui/styled-engine/legacy', - '@mui/system': '@mui/system/legacy', - '@mui/utils': '@mui/utils/legacy' - } + ] }, plugins: [ new DefinePlugin({ @@ -69,13 +71,14 @@ const config = { filename: 'index.html', template: 'index.html', // Append file hashes to bundle urls for cache busting - hash: true + hash: true, + chunks: [ + 'main.jellyfin', + 'serviceworker' + ] }), new CopyPlugin({ patterns: [ - { - from: 'themes/**/*.{css,jpg}' - }, { from: 'assets/**', globOptions: { @@ -116,6 +119,15 @@ const config = { typescript: { configFile: path.resolve(__dirname, 'tsconfig.json') } + }), + new MiniCssExtractPlugin({ + filename: pathData => { + if (pathData.chunk?.name?.startsWith('themes/')) { + return '[name]/theme.css'; + } + return '[name].[contenthash].css'; + }, + chunkFilename: '[name].[contenthash].css' }) ], output: { @@ -123,6 +135,12 @@ const config = { pathData.chunk.name === 'serviceworker' ? '[name].js' : '[name].bundle.js' ), chunkFilename: '[name].[contenthash].chunk.js', + assetModuleFilename: pathData => { + if (pathData.filename.startsWith('assets/') || pathData.filename.startsWith('themes/')) { + return '[path][base][query]'; + } + return '[hash][ext][query]'; + }, path: path.resolve(__dirname, 'dist'), publicPath: '' }, @@ -186,6 +204,13 @@ const config = { include: [ path.resolve(__dirname, 'node_modules/@jellyfin/libass-wasm'), path.resolve(__dirname, 'node_modules/@jellyfin/sdk'), + path.resolve(__dirname, 'node_modules/@mui/base'), + path.resolve(__dirname, 'node_modules/@mui/lab'), + path.resolve(__dirname, 'node_modules/@mui/material'), + path.resolve(__dirname, 'node_modules/@mui/private-theming'), + path.resolve(__dirname, 'node_modules/@mui/styled-engine'), + path.resolve(__dirname, 'node_modules/@mui/system'), + path.resolve(__dirname, 'node_modules/@mui/utils'), path.resolve(__dirname, 'node_modules/@mui/x-date-pickers'), path.resolve(__dirname, 'node_modules/@react-hook/latest'), path.resolve(__dirname, 'node_modules/@react-hook/passive-layout-effect'), @@ -290,33 +315,46 @@ const config = { }] }, { - test: /\.s[ac]ss$/i, - use: [ - DEV_MODE ? 'style-loader' : MiniCssExtractPlugin.loader, - 'css-loader', + test: /\.(sa|sc|c)ss$/i, + oneOf: [ { - loader: 'postcss-loader', - options: { - postcssOptions: { - config: path.resolve(__dirname, 'postcss.config.js') - } - } + // Themes always need to use the MiniCssExtractPlugin since they are loaded directly + include: [ + path.resolve(__dirname, 'src/themes/') + ], + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '/' + } + }, + 'css-loader', + { + loader: 'postcss-loader', + options: { + postcssOptions: { + config: path.resolve(__dirname, 'postcss.config.js') + } + } + }, + 'sass-loader' + ] }, - 'sass-loader' - ] - }, - { - test: /\.css$/i, - use: [ - DEV_MODE ? 'style-loader' : MiniCssExtractPlugin.loader, - 'css-loader', { - loader: 'postcss-loader', - options: { - postcssOptions: { - config: path.resolve(__dirname, 'postcss.config.js') - } - } + use: [ + DEV_MODE ? 'style-loader' : MiniCssExtractPlugin.loader, + 'css-loader', + { + loader: 'postcss-loader', + options: { + postcssOptions: { + config: path.resolve(__dirname, 'postcss.config.js') + } + } + }, + 'sass-loader' + ] } ] }, @@ -343,10 +381,4 @@ const config = { } }; -if (!DEV_MODE) { - config.plugins.push(new MiniCssExtractPlugin({ - filename: '[name].[contenthash].css' - })); -} - module.exports = config; diff --git a/webpack.dev.js b/webpack.dev.js index a6288a80ce..58c5fbbd68 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -1,11 +1,11 @@ -const common = require('./webpack.common'); const { merge } = require('webpack-merge'); +const common = require('./webpack.common'); + module.exports = merge(common, { // In order for live reload to work we must use "web" as the target not "browserslist" target: process.env.WEBPACK_SERVE ? 'web' : 'browserslist', mode: 'development', - entry: { 'main.jellyfin': './index.jsx' }, devtool: 'eval-cheap-module-source-map', module: { rules: [ diff --git a/webpack.prod.js b/webpack.prod.js index 8b2c9aad5e..e45f83f19d 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -1,10 +1,11 @@ -const common = require('./webpack.common'); const { merge } = require('webpack-merge'); +const common = require('./webpack.common'); + module.exports = merge(common, { mode: 'production', entry: { - 'main.jellyfin': './index.jsx', + ...common.entry, 'serviceworker': './serviceworker.js' } });