From 25ec1fcbcf10611a42b63922899a9fd64ec69dec Mon Sep 17 00:00:00 2001 From: henryk86 <166761451+henryk86@users.noreply.github.com> Date: Sun, 14 Sep 2025 11:39:55 +0200 Subject: [PATCH 01/22] fix display bug on homepage --- src/components/tonies/ToniesList.tsx | 222 ++++++++++++++------------- 1 file changed, 114 insertions(+), 108 deletions(-) diff --git a/src/components/tonies/ToniesList.tsx b/src/components/tonies/ToniesList.tsx index 274fd0da..90f34ba1 100644 --- a/src/components/tonies/ToniesList.tsx +++ b/src/components/tonies/ToniesList.tsx @@ -658,133 +658,139 @@ export const ToniesList: React.FC<{ }, ]; - const noDataTonies = ( - -

{t("tonies.noData")}

-

{t("tonies.noDataText")}

- - } - /> - ); - - if (loading) { - return ; - } else { - return ( -
+ const listActions = ( + <> +
+ +
+ {isHelpModalOpen && ( + setIsHelpModalOpen(false)} /> + )} + {showFilter ? ( + setCollapsed(!collapsed)} + bordered={false} + /> + ) : ( + "" + )} +
- +
+ {selectionMode && ( +
+ {selectedTonies.length} {t("tonies.selectMode.selected")} +
+ )} +
+
+ + + +
- {isHelpModalOpen && ( - setIsHelpModalOpen(false)} /> - )} - {showFilter ? ( - setCollapsed(!collapsed)} - bordered={false} - /> - ) : ( - "" - )} -
+ {selectionMode && (
-
- {selectionMode && ( -
- {selectedTonies.length} {t("tonies.selectMode.selected")} -
- )} -
-
- - + setSelectedTonies(tonieCards.map((c) => c.ruid))} + > + {t("tonies.selectMode.selectAll")} + + + setNoCloud( + tonieCards, + selectedTonies, + t, + overlay, + addNotification, + true, + handleUpdateCard + ) + } + disabled={selectedTonies.length === 0} + > + {t("tonies.selectMode.setNoCloud")} + + exportToCSV(tonieCards, selectedTonies, t)} + disabled={selectedTonies.length === 0} + > + + {t("tonies.selectMode.exportCsv")} -
+
- {selectionMode && ( -
- setSelectedTonies(tonieCards.map((c) => c.ruid))} - > - {t("tonies.selectMode.selectAll")} - - - setNoCloud( - tonieCards, - selectedTonies, - t, - overlay, - addNotification, - true, - handleUpdateCard - ) - } - disabled={selectedTonies.length === 0} - > - {t("tonies.selectMode.setNoCloud")} - - exportToCSV(tonieCards, selectedTonies, t)} - disabled={selectedTonies.length === 0} - > - - {t("tonies.selectMode.exportCsv")} - - -
- )} + )} +
+ + ); + + const noDataTonies = ( + +

{t("tonies.noData")}

+

{t("tonies.noDataText")}

+ } + /> + ); + + if (loading) { + return ; + } else { + return ( +
+ {!readOnly ? listActions : ""} Date: Sun, 14 Sep 2025 12:55:29 +0200 Subject: [PATCH 02/22] added plguin feature to features list --- public/translations/de.json | 6 ++++++ public/translations/en.json | 6 ++++++ public/translations/es.json | 6 ++++++ public/translations/fr.json | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/public/translations/de.json b/public/translations/de.json index 4327b5b2..5ab54719 100644 --- a/public/translations/de.json +++ b/public/translations/de.json @@ -555,6 +555,12 @@ "01homeAssistantIntegration": "Home Assistant-Integration (MQTT)" }, "title": "MQTT-Client" + }, + "13plugins": { + "items": { + "01pluginFeature": "Erweitern Sie die TeddyCloud-Funktionalität durch benutzerdefinierte Plugins" + }, + "title": "TeddyCloud-Plugins" } }, "futureFeatures": { diff --git a/public/translations/en.json b/public/translations/en.json index 60fac405..fde3b886 100644 --- a/public/translations/en.json +++ b/public/translations/en.json @@ -555,6 +555,12 @@ "01homeAssistantIntegration": "Home Assistant integration (MQTT)" }, "title": "MQTT client" + }, + "13plugins": { + "items": { + "01pluginFeature": "extend TeddyCloud functionality by custom plugins" + }, + "title": "TeddyCloud Plugins" } }, "futureFeatures": { diff --git a/public/translations/es.json b/public/translations/es.json index d46f1610..eb199f90 100644 --- a/public/translations/es.json +++ b/public/translations/es.json @@ -555,6 +555,12 @@ "01homeAssistantIntegration": "Integración con Home Assistant (MQTT)" }, "title": "Cliente MQTT" + }, + "13plugins": { + "items": { + "01pluginFeature": "Extiende la funcionalidad de TeddyCloud mediante complementos personalizados" + }, + "title": "Complementos de TeddyCloud" } }, "futureFeatures": { diff --git a/public/translations/fr.json b/public/translations/fr.json index 0f7e2276..6a1c1334 100644 --- a/public/translations/fr.json +++ b/public/translations/fr.json @@ -555,6 +555,12 @@ "01homeAssistantIntegration": "Intégration Home Assistant (MQTT)" }, "title": "Client MQTT" + }, + "13plugins": { + "items": { + "01pluginFeature": "Étendez les fonctionnalités de TeddyCloud avec des plugins personnalisés" + }, + "title": "Plugins TeddyCloud" } }, "futureFeatures": { From a94e6af4124f2af21f4c45339d5de1b6cb571501 Mon Sep 17 00:00:00 2001 From: henryk86 <166761451+henryk86@users.noreply.github.com> Date: Sun, 14 Sep 2025 19:43:18 +0200 Subject: [PATCH 03/22] Update de.json --- public/translations/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/translations/de.json b/public/translations/de.json index 5ab54719..71789bbf 100644 --- a/public/translations/de.json +++ b/public/translations/de.json @@ -558,7 +558,7 @@ }, "13plugins": { "items": { - "01pluginFeature": "Erweitern Sie die TeddyCloud-Funktionalität durch benutzerdefinierte Plugins" + "01pluginFeature": "Erweiter die TeddyCloud-Funktionalität durch benutzerdefinierte Plugins" }, "title": "TeddyCloud-Plugins" } From 8fb87211ddece9f9cf86f5d419b0c270f5e3593b Mon Sep 17 00:00:00 2001 From: henryk86 <166761451+henryk86@users.noreply.github.com> Date: Tue, 23 Sep 2025 20:25:20 +0200 Subject: [PATCH 04/22] fix gh-239 --- src/components/audio/AudioContext.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/audio/AudioContext.tsx b/src/components/audio/AudioContext.tsx index 10eefd07..f47d08f7 100644 --- a/src/components/audio/AudioContext.tsx +++ b/src/components/audio/AudioContext.tsx @@ -75,7 +75,8 @@ export const AudioProvider: React.FC = ({ children }) => { } if (sourceElement.src != url) { - sourceElement.src = url; + // encodeUri (here or earlier) does not work, but this "dumb" replace does... + sourceElement.src = url.replace("+", "%2B").replace("#", "%23"); globalAudio.load(); } if (meta) { From c43741cd61c6ce9e5b17e3557eefab09ecf66ff1 Mon Sep 17 00:00:00 2001 From: henryk86 <166761451+henryk86@users.noreply.github.com> Date: Sun, 28 Sep 2025 21:19:06 +0200 Subject: [PATCH 05/22] gh-201 added tonies player page as a standalone player, updated all used packages --- package-lock.json | 851 +++++++++--------- package.json | 30 +- public/translations/de.json | 14 +- public/translations/en.json | 14 +- public/translations/es.json | 14 +- public/translations/fr.json | 14 +- src/App.tsx | 15 +- .../audio/StandAloneAudioPlayer.tsx | 292 ++++++ src/components/tonies/ToniesAudioPlayer.tsx | 220 +++++ src/components/tonies/ToniesSubNav.tsx | 17 + src/index.css | 9 + src/pages/community/ChangelogPage.tsx | 1 + src/pages/tonies/ToniesAudioPlayerPage.tsx | 142 +++ src/utils/browserUtils.tsx | 51 ++ vite.config.ts | 2 +- 15 files changed, 1242 insertions(+), 444 deletions(-) create mode 100644 src/components/audio/StandAloneAudioPlayer.tsx create mode 100644 src/components/tonies/ToniesAudioPlayer.tsx create mode 100644 src/pages/tonies/ToniesAudioPlayerPage.tsx diff --git a/package-lock.json b/package-lock.json index 2db9f7d1..29906d4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,57 +8,44 @@ "name": "teddycloud-web", "version": "0.6.5", "dependencies": { - "@ant-design/icons": "^6.0.0", + "@ant-design/icons": "^6.0.2", "@ant-design/v5-patch-for-react-19": "^1.0.3", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@remix-run/router": "^1.23.0", "@types/jest": "^30.0.0", - "@types/node": "^24.3.0", - "@types/react": "^19.1.11", - "@types/react-dom": "^19.1.7", + "@types/node": "^24.5.2", + "@types/react": "^19.1.15", + "@types/react-dom": "^19.1.9", "@types/w3c-web-serial": "^1.0.8", - "@vitejs/plugin-react": "^5.0.1", - "antd": "^5.27.1", + "@vitejs/plugin-react": "^5.0.4", + "antd": "^5.27.4", "esptool-js": "^0.5.7", "formik": "^2.4.6", - "i18next": "^25.4.1", + "i18next": "^25.5.2", "i18next-browser-languagedetector": "^8.2.0", "i18next-http-backend": "^3.0.2", "jszip": "^3.10.1", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-i18next": "^15.7.2", - "react-router-dom": "^7.8.2", - "react-syntax-highlighter": "^15.6.3", + "react-i18next": "^16.0.0", + "react-router-dom": "^7.9.3", + "react-syntax-highlighter": "^15.6.6", "styled-components": "^6.1.19", "typescript": "^5.9.2", - "vite": "^7.1.3", - "vite-plugin-svgr": "^4.3.0", + "vite": "^7.1.7", + "vite-plugin-svgr": "^4.5.0", "vite-tsconfig-paths": "^5.1.4", - "yup": "^1.7.0" + "yup": "^1.7.1" }, "devDependencies": { - "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@types/js-yaml": "^4.0.9", "@types/react-syntax-highlighter": "^15.5.13", - "concurrently": "^9.2.0", + "concurrently": "^9.2.1", "cross-env": "^10.0.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@ant-design/colors": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.0.tgz", @@ -112,9 +99,9 @@ } }, "node_modules/@ant-design/icons": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.0.0.tgz", - "integrity": "sha512-o0aCCAlHc1o4CQcapAwWzHeaW2x9F49g7P3IDtvtNXgHowtRWYb7kiubt8sQPFvfVIVU/jLw2hzeSlNt0FU+Uw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.0.2.tgz", + "integrity": "sha512-1U1+6afDP+w+6jDkxrmn/kwoFJvB/aD4mQ/+Rhkp+BBRAfgK46gxKb6VxnoS/hYDiRdhIjzilkCmi6pD7zjxCw==", "license": "MIT", "dependencies": { "@ant-design/colors": "^8.0.0", @@ -181,30 +168,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -421,25 +408,25 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -497,9 +484,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -520,17 +507,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.4", "debug": "^4.3.1" }, "engines": { @@ -538,9 +525,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -638,9 +625,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "cpu": [ "ppc64" ], @@ -654,9 +641,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], @@ -670,9 +657,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "cpu": [ "arm64" ], @@ -686,9 +673,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], @@ -702,9 +689,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "cpu": [ "arm64" ], @@ -718,9 +705,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], @@ -734,9 +721,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "cpu": [ "arm64" ], @@ -750,9 +737,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "cpu": [ "x64" ], @@ -766,9 +753,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "cpu": [ "arm" ], @@ -782,9 +769,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "cpu": [ "arm64" ], @@ -798,9 +785,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "cpu": [ "ia32" ], @@ -814,9 +801,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "cpu": [ "loong64" ], @@ -830,9 +817,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "cpu": [ "mips64el" ], @@ -846,9 +833,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], @@ -862,9 +849,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], @@ -878,9 +865,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "cpu": [ "s390x" ], @@ -894,9 +881,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -910,9 +897,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", "cpu": [ "arm64" ], @@ -926,9 +913,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -942,9 +929,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -958,9 +945,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -974,9 +961,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "cpu": [ "arm64" ], @@ -990,9 +977,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -1006,9 +993,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -1022,9 +1009,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -1038,9 +1025,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -1063,21 +1050,21 @@ } }, "node_modules/@jest/expect-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", - "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1" + "@jest/get-type": "30.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "license": "MIT", "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -1109,9 +1096,9 @@ } }, "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "license": "MIT", "dependencies": { "@jest/pattern": "30.0.1", @@ -1136,6 +1123,16 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1152,9 +1149,9 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1264,14 +1261,13 @@ } }, "node_modules/@rc-component/qrcode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", - "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.1.tgz", + "integrity": "sha512-g8eeeaMyFXVlq8cZUeaxCDhfIYjpao0l9cvm5gFwKXy/Vm1yDWV7h2sjH5jHYzdFedlVKBpATFB1VKMrHzwaWQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", - "classnames": "^2.3.2", - "rc-util": "^5.38.0" + "classnames": "^2.3.2" }, "engines": { "node": ">=8.x" @@ -1323,9 +1319,9 @@ } }, "node_modules/@rc-component/util": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.2.2.tgz", - "integrity": "sha512-p3zQr9Wu8BKncqmuW23olzBoAFsN8PYMS9FaI4JwJLwknH7DvfHAr1fwbfl9aAWw4Jva64ucpenbgG4fznLUSw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.3.0.tgz", + "integrity": "sha512-hfXE04CVsxI/slmWKeSh6du7sSKpbvVdVEZCa8A+2QWDlL97EsCYme2c3ZWLn1uC9FR21JoewlrhUPWO4QgO8w==", "license": "MIT", "dependencies": { "is-mobile": "^5.0.0", @@ -1346,15 +1342,15 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.32", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.32.tgz", - "integrity": "sha512-QReCdvxiUZAPkvp1xpAg62IeNzykOFA6syH2CnClif4YmALN1XKpB39XneL80008UbtMShthSVDKmrx05N1q/g==", + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz", + "integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==", "license": "MIT" }, "node_modules/@rollup/pluginutils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", - "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -1374,9 +1370,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.48.0.tgz", - "integrity": "sha512-aVzKH922ogVAWkKiyKXorjYymz2084zrhrZRXtLrA5eEx5SO8Dj0c/4FpCHZyn7MKzhW2pW4tK28vVr+5oQ2xw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", + "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", "cpu": [ "arm" ], @@ -1387,9 +1383,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.48.0.tgz", - "integrity": "sha512-diOdQuw43xTa1RddAFbhIA8toirSzFMcnIg8kvlzRbK26xqEnKJ/vqQnghTAajy2Dcy42v+GMPMo6jq67od+Dw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", + "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", "cpu": [ "arm64" ], @@ -1400,9 +1396,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.48.0.tgz", - "integrity": "sha512-QhR2KA18fPlJWFefySJPDYZELaVqIUVnYgAOdtJ+B/uH96CFg2l1TQpX19XpUMWUqMyIiyY45wje8K6F4w4/CA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", + "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", "cpu": [ "arm64" ], @@ -1413,9 +1409,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.48.0.tgz", - "integrity": "sha512-Q9RMXnQVJ5S1SYpNSTwXDpoQLgJ/fbInWOyjbCnnqTElEyeNvLAB3QvG5xmMQMhFN74bB5ZZJYkKaFPcOG8sGg==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", + "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", "cpu": [ "x64" ], @@ -1426,9 +1422,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.48.0.tgz", - "integrity": "sha512-3jzOhHWM8O8PSfyft+ghXZfBkZawQA0PUGtadKYxFqpcYlOYjTi06WsnYBsbMHLawr+4uWirLlbhcYLHDXR16w==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", + "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", "cpu": [ "arm64" ], @@ -1439,9 +1435,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.48.0.tgz", - "integrity": "sha512-NcD5uVUmE73C/TPJqf78hInZmiSBsDpz3iD5MF/BuB+qzm4ooF2S1HfeTChj5K4AV3y19FFPgxonsxiEpy8v/A==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", + "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", "cpu": [ "x64" ], @@ -1452,9 +1448,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.48.0.tgz", - "integrity": "sha512-JWnrj8qZgLWRNHr7NbpdnrQ8kcg09EBBq8jVOjmtlB3c8C6IrynAJSMhMVGME4YfTJzIkJqvSUSVJRqkDnu/aA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", + "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", "cpu": [ "arm" ], @@ -1465,9 +1461,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.48.0.tgz", - "integrity": "sha512-9xu92F0TxuMH0tD6tG3+GtngwdgSf8Bnz+YcsPG91/r5Vgh5LNofO48jV55priA95p3c92FLmPM7CvsVlnSbGQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", + "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", "cpu": [ "arm" ], @@ -1478,9 +1474,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.48.0.tgz", - "integrity": "sha512-NLtvJB5YpWn7jlp1rJiY0s+G1Z1IVmkDuiywiqUhh96MIraC0n7XQc2SZ1CZz14shqkM+XN2UrfIo7JB6UufOA==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", + "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", "cpu": [ "arm64" ], @@ -1491,9 +1487,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.48.0.tgz", - "integrity": "sha512-QJ4hCOnz2SXgCh+HmpvZkM+0NSGcZACyYS8DGbWn2PbmA0e5xUk4bIP8eqJyNXLtyB4gZ3/XyvKtQ1IFH671vQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", + "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", "cpu": [ "arm64" ], @@ -1503,10 +1499,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.48.0.tgz", - "integrity": "sha512-Pk0qlGJnhILdIC5zSKQnprFjrGmjfDM7TPZ0FKJxRkoo+kgMRAg4ps1VlTZf8u2vohSicLg7NP+cA5qE96PaFg==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", + "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", "cpu": [ "loong64" ], @@ -1517,9 +1513,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.48.0.tgz", - "integrity": "sha512-/dNFc6rTpoOzgp5GKoYjT6uLo8okR/Chi2ECOmCZiS4oqh3mc95pThWma7Bgyk6/WTEvjDINpiBCuecPLOgBLQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", + "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", "cpu": [ "ppc64" ], @@ -1530,9 +1526,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.48.0.tgz", - "integrity": "sha512-YBwXsvsFI8CVA4ej+bJF2d9uAeIiSkqKSPQNn0Wyh4eMDY4wxuSp71BauPjQNCKK2tD2/ksJ7uhJ8X/PVY9bHQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", + "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", "cpu": [ "riscv64" ], @@ -1543,9 +1539,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.48.0.tgz", - "integrity": "sha512-FI3Rr2aGAtl1aHzbkBIamsQyuauYtTF9SDUJ8n2wMXuuxwchC3QkumZa1TEXYIv/1AUp1a25Kwy6ONArvnyeVQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", + "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", "cpu": [ "riscv64" ], @@ -1556,9 +1552,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.48.0.tgz", - "integrity": "sha512-Dx7qH0/rvNNFmCcIRe1pyQ9/H0XO4v/f0SDoafwRYwc2J7bJZ5N4CHL/cdjamISZ5Cgnon6iazAVRFlxSoHQnQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", + "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", "cpu": [ "s390x" ], @@ -1569,9 +1565,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.0.tgz", - "integrity": "sha512-GUdZKTeKBq9WmEBzvFYuC88yk26vT66lQV8D5+9TgkfbewhLaTHRNATyzpQwwbHIfJvDJ3N9WJ90wK/uR3cy3Q==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", + "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", "cpu": [ "x64" ], @@ -1582,9 +1578,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.48.0.tgz", - "integrity": "sha512-ao58Adz/v14MWpQgYAb4a4h3fdw73DrDGtaiF7Opds5wNyEQwtO6M9dBh89nke0yoZzzaegq6J/EXs7eBebG8A==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", + "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", "cpu": [ "x64" ], @@ -1594,10 +1590,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", + "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.48.0.tgz", - "integrity": "sha512-kpFno46bHtjZVdRIOxqaGeiABiToo2J+st7Yce+aiAoo1H0xPi2keyQIP04n2JjDVuxBN6bSz9R6RdTK5hIppw==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", + "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", "cpu": [ "arm64" ], @@ -1608,9 +1617,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.48.0.tgz", - "integrity": "sha512-rFYrk4lLk9YUTIeihnQMiwMr6gDhGGSbWThPEDfBoU/HdAtOzPXeexKi7yU8jO+LWRKnmqPN9NviHQf6GDwBcQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", + "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", "cpu": [ "ia32" ], @@ -1620,10 +1629,23 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", + "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.48.0.tgz", - "integrity": "sha512-sq0hHLTgdtwOPDB5SJOuaoHyiP1qSwg+71TQWk8iDS04bW1wIE0oQ6otPiRj2ZvLYNASLMaTp8QRGUVZ+5OL5A==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", + "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", "cpu": [ "x64" ], @@ -1634,9 +1656,9 @@ ] }, "node_modules/@sinclair/typebox": { - "version": "0.34.40", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", - "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", + "version": "0.34.41", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.41.tgz", + "integrity": "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==", "license": "MIT" }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { @@ -1962,27 +1984,27 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.12.0" } }, "node_modules/@types/react": { - "version": "19.1.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", - "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", + "version": "19.1.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.15.tgz", + "integrity": "sha512-+kLxJpaJzXybyDyFXYADyP1cznTO8HSuBpenGlnKOAkH4hyNINiywvXS/tGJhsrGGP/gM185RA3xpjY0Yg4erA==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", - "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", "license": "MIT", "peerDependencies": { "@types/react": "^19.0.0" @@ -2038,15 +2060,15 @@ "license": "MIT" }, "node_modules/@vitejs/plugin-react": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.1.tgz", - "integrity": "sha512-DE4UNaBXwtVoDJ0ccBdLVjFTWL70NRuWNCxEieTI3lrq9ORB9aOCQEKstwDXBl87NvFdbqh/p7eINGyj0BthJA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz", + "integrity": "sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==", "license": "MIT", "dependencies": { - "@babel/core": "^7.28.3", + "@babel/core": "^7.28.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.32", + "@rolldown/pluginutils": "1.0.0-beta.38", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, @@ -2083,9 +2105,9 @@ } }, "node_modules/antd": { - "version": "5.27.1", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.27.1.tgz", - "integrity": "sha512-jGMSdBN7hAMvPV27B4RhzZfL6n6yu8yDbo7oXrlJasaOqB7bSDPcjdEy1kXy3JPsny/Qazb1ykzRI4EfcByAPQ==", + "version": "5.27.4", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.27.4.tgz", + "integrity": "sha512-rhArohoAUCxhkPjGI/BXthOrrjaElL4Fb7d4vEHnIR3DpxFXfegd4rN21IgGdiF+Iz4EFuUZu8MdS8NuJHLSVQ==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.2.1", @@ -2124,10 +2146,10 @@ "rc-resize-observer": "^1.4.3", "rc-segmented": "~2.7.0", "rc-select": "~14.16.8", - "rc-slider": "~11.1.8", + "rc-slider": "~11.1.9", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", - "rc-table": "~7.51.1", + "rc-table": "~7.53.0", "rc-tabs": "~15.7.0", "rc-textarea": "~1.10.2", "rc-tooltip": "~6.4.0", @@ -2200,6 +2222,15 @@ "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==", "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz", + "integrity": "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -2213,9 +2244,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", "funding": [ { "type": "opencollective", @@ -2232,9 +2263,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -2275,9 +2307,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001737", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", - "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "version": "1.0.30001745", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", "funding": [ { "type": "opencollective", @@ -2423,19 +2455,18 @@ "license": "MIT" }, "node_modules/concurrently": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", - "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", @@ -2573,15 +2604,15 @@ "license": "MIT" }, "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2615,9 +2646,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.208", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz", - "integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==", + "version": "1.5.227", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz", + "integrity": "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -2640,18 +2671,18 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -2661,32 +2692,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/escalade": { @@ -2725,17 +2756,17 @@ "license": "MIT" }, "node_modules/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -2937,9 +2968,9 @@ } }, "node_modules/i18next": { - "version": "25.4.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.4.1.tgz", - "integrity": "sha512-sYJX4Ap0SSho1JZppKvc9BeacbpNCdNvKuXMYPUGjDH0XTTdVXmm7UU3l4bvF8nqh70lZNBeLboRYwItBf9jOw==", + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.5.2.tgz", + "integrity": "sha512-lW8Zeh37i/o0zVr+NoCHfNnfvVw+M6FQbRp36ZZ/NyHDJ3NJVpp2HhAUyU9WafL5AssymNoOjMRB48mmx2P6Hw==", "funding": [ { "type": "individual", @@ -3102,48 +3133,48 @@ "license": "ISC" }, "node_modules/jest-diff": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", - "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.0.5" + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", - "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.0.5", - "pretty-format": "30.0.5" + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", - "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", - "pretty-format": "30.0.5", + "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -3152,14 +3183,14 @@ } }, "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-util": "30.0.5" + "jest-util": "30.2.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -3175,12 +3206,12 @@ } }, "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "license": "MIT", "dependencies": { - "@jest/types": "30.0.5", + "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -3405,9 +3436,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "license": "MIT" }, "node_modules/pako": { @@ -3536,9 +3567,9 @@ "license": "MIT" }, "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "license": "MIT", "dependencies": { "@jest/schemas": "30.0.5", @@ -3990,9 +4021,9 @@ } }, "node_modules/rc-slider": { - "version": "11.1.8", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz", - "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==", + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.9.tgz", + "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -4041,9 +4072,9 @@ } }, "node_modules/rc-table": { - "version": "7.51.1", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.51.1.tgz", - "integrity": "sha512-5iq15mTHhvC42TlBLRCoCBLoCmGlbRZAlyF21FonFnS/DIC8DeRqnmdyVREwt2CFbPceM0zSNdEeVfiGaqYsKw==", + "version": "7.53.1", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.53.1.tgz", + "integrity": "sha512-firAd7Z+liqIDS5TubJ1qqcoBd6YcANLKWQDZhFf3rfoOTt/UNPj4n3O+2vhl+z4QMqwPEUVAil661WHA8H8Aw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.1", @@ -4183,9 +4214,9 @@ } }, "node_modules/rc-virtual-list": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.1.tgz", - "integrity": "sha512-DCapO2oyPqmooGhxBuXHM4lFuX+sshQwWqqkuyFA+4rShLe//+GEPVwiDgO+jKtKHtbeYwZoNvetwfHdOf+iUQ==", + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -4229,16 +4260,16 @@ "license": "MIT" }, "node_modules/react-i18next": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.7.2.tgz", - "integrity": "sha512-xJxq7ibnhUlMvd82lNC4te1GxGUMoM1A05KKyqoqsBXVZtEvZg/fz/fnVzdlY/hhQ3SpP/79qCocZOtICGhd3g==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.0.0.tgz", + "integrity": "sha512-JQ+dFfLnFSKJQt7W01lJHWRC0SX7eDPobI+MSTJ3/gP39xH2g33AuTE7iddAfXYHamJdAeMGM0VFboPaD3G68Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { - "i18next": ">= 25.4.1", + "i18next": ">= 25.5.2", "react": ">= 16.8.0", "typescript": "^5" }, @@ -4270,9 +4301,9 @@ } }, "node_modules/react-router": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.2.tgz", - "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.3.tgz", + "integrity": "sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -4292,12 +4323,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.8.2.tgz", - "integrity": "sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.3.tgz", + "integrity": "sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==", "license": "MIT", "dependencies": { - "react-router": "7.8.2" + "react-router": "7.9.3" }, "engines": { "node": ">=20.0.0" @@ -4389,9 +4420,9 @@ } }, "node_modules/rollup": { - "version": "4.48.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.0.tgz", - "integrity": "sha512-BXHRqK1vyt9XVSEHZ9y7xdYtuYbwVod2mLwOMFP7t/Eqoc1pHRlG/WdV2qNeNvZHRQdLedaFycljaYYM96RqJQ==", + "version": "4.52.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", + "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -4404,26 +4435,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.48.0", - "@rollup/rollup-android-arm64": "4.48.0", - "@rollup/rollup-darwin-arm64": "4.48.0", - "@rollup/rollup-darwin-x64": "4.48.0", - "@rollup/rollup-freebsd-arm64": "4.48.0", - "@rollup/rollup-freebsd-x64": "4.48.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.48.0", - "@rollup/rollup-linux-arm-musleabihf": "4.48.0", - "@rollup/rollup-linux-arm64-gnu": "4.48.0", - "@rollup/rollup-linux-arm64-musl": "4.48.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.48.0", - "@rollup/rollup-linux-ppc64-gnu": "4.48.0", - "@rollup/rollup-linux-riscv64-gnu": "4.48.0", - "@rollup/rollup-linux-riscv64-musl": "4.48.0", - "@rollup/rollup-linux-s390x-gnu": "4.48.0", - "@rollup/rollup-linux-x64-gnu": "4.48.0", - "@rollup/rollup-linux-x64-musl": "4.48.0", - "@rollup/rollup-win32-arm64-msvc": "4.48.0", - "@rollup/rollup-win32-ia32-msvc": "4.48.0", - "@rollup/rollup-win32-x64-msvc": "4.48.0", + "@rollup/rollup-android-arm-eabi": "4.52.3", + "@rollup/rollup-android-arm64": "4.52.3", + "@rollup/rollup-darwin-arm64": "4.52.3", + "@rollup/rollup-darwin-x64": "4.52.3", + "@rollup/rollup-freebsd-arm64": "4.52.3", + "@rollup/rollup-freebsd-x64": "4.52.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", + "@rollup/rollup-linux-arm-musleabihf": "4.52.3", + "@rollup/rollup-linux-arm64-gnu": "4.52.3", + "@rollup/rollup-linux-arm64-musl": "4.52.3", + "@rollup/rollup-linux-loong64-gnu": "4.52.3", + "@rollup/rollup-linux-ppc64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-gnu": "4.52.3", + "@rollup/rollup-linux-riscv64-musl": "4.52.3", + "@rollup/rollup-linux-s390x-gnu": "4.52.3", + "@rollup/rollup-linux-x64-gnu": "4.52.3", + "@rollup/rollup-linux-x64-musl": "4.52.3", + "@rollup/rollup-openharmony-arm64": "4.52.3", + "@rollup/rollup-win32-arm64-msvc": "4.52.3", + "@rollup/rollup-win32-ia32-msvc": "4.52.3", + "@rollup/rollup-win32-x64-gnu": "4.52.3", + "@rollup/rollup-win32-x64-msvc": "4.52.3", "fsevents": "~2.3.2" } }, @@ -4817,9 +4850,9 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "license": "MIT" }, "node_modules/update-browserslist-db": { @@ -4859,9 +4892,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", - "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", + "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", @@ -4933,12 +4966,12 @@ } }, "node_modules/vite-plugin-svgr": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", - "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz", + "integrity": "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==", "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.1.3", + "@rollup/pluginutils": "^5.2.0", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0" }, @@ -5107,9 +5140,9 @@ } }, "node_modules/yup": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.0.tgz", - "integrity": "sha512-VJce62dBd+JQvoc+fCVq+KZfPHr+hXaxCcVgotfwWvlR0Ja3ffYKaJBT8rptPOSKOGJDCUnW2C2JWpud7aRP6Q==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz", + "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==", "license": "MIT", "dependencies": { "property-expr": "^2.0.5", diff --git a/package.json b/package.json index 16a688f3..05bac019 100644 --- a/package.json +++ b/package.json @@ -4,41 +4,41 @@ "private": true, "homepage": "/web", "dependencies": { - "@ant-design/icons": "^6.0.0", + "@ant-design/icons": "^6.0.2", "@ant-design/v5-patch-for-react-19": "^1.0.3", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@remix-run/router": "^1.23.0", "@types/jest": "^30.0.0", - "@types/node": "^24.3.0", - "@types/react": "^19.1.11", - "@types/react-dom": "^19.1.7", + "@types/node": "^24.5.2", + "@types/react": "^19.1.15", + "@types/react-dom": "^19.1.9", "@types/w3c-web-serial": "^1.0.8", - "@vitejs/plugin-react": "^5.0.1", - "antd": "^5.27.1", + "@vitejs/plugin-react": "^5.0.4", + "antd": "^5.27.4", "esptool-js": "^0.5.7", "formik": "^2.4.6", - "i18next": "^25.4.1", + "i18next": "^25.5.2", "i18next-browser-languagedetector": "^8.2.0", "i18next-http-backend": "^3.0.2", "jszip": "^3.10.1", "react": "^19.1.1", "react-dom": "^19.1.1", - "react-i18next": "^15.7.2", - "react-router-dom": "^7.8.2", - "react-syntax-highlighter": "^15.6.3", + "react-i18next": "^16.0.0", + "react-router-dom": "^7.9.3", + "react-syntax-highlighter": "^15.6.6", "styled-components": "^6.1.19", "typescript": "^5.9.2", - "vite": "^7.1.3", - "vite-plugin-svgr": "^4.3.0", + "vite": "^7.1.7", + "vite-plugin-svgr": "^4.5.0", "vite-tsconfig-paths": "^5.1.4", - "yup": "^1.7.0" + "yup": "^1.7.1" }, "devDependencies": { - "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@types/js-yaml": "^4.0.9", "@types/react-syntax-highlighter": "^15.5.13", - "concurrently": "^9.2.0", + "concurrently": "^9.2.1", "cross-env": "^10.0.0" }, "scripts": { diff --git a/public/translations/de.json b/public/translations/de.json index 71789bbf..6b02b7c0 100644 --- a/public/translations/de.json +++ b/public/translations/de.json @@ -1879,6 +1879,7 @@ }, "selectMode": { "cancel": "Abbrechen", + "cancelButtonTooltip": "Auswahlmodus beenden", "exportCompleteInfoToJson": "Exportieren - vollständige Informationen - als JSON", "exportCsv": "Als CSV exportieren", "exportCsvTooltip": "Exportiert die Tonies/Tags als CSV-Datei mit Serien-, Episoden- und Modellinformationen (nicht dem zugewiesenen Inhalt)", @@ -1888,14 +1889,13 @@ "hideSelectedTags": "Tags ausblenden", "select": "Auswählen", "selectAll": "Alle auswählen", + "selectButtonTooltip": "Auswahlmodus aktivieren", "selected": "Tags/Tonies ausgewählt", "setLive": "Live aktivieren", "setNoCloud": "Cloud deaktivieren", "unselectAll": "Auswahl aufheben", "unsetLive": "Live deaktivieren", - "unsetNoCloud": "Cloud aktivieren", - "cancelButtonTooltip": "Auswahlmodus beenden", - "selectButtonTooltip": "Auswahlmodus aktivieren" + "unsetNoCloud": "Cloud aktivieren" }, "system-sounds": { "navigationTitle": "System Sounds", @@ -1996,6 +1996,14 @@ "showPagination": "Paginierung einblenden", "title": "Tonies" }, + "toniesaudioplayer": { + "enterFullscreen": "Vollbild starten", + "exitFullscreen": "Vollbild beenden", + "navigationTitle": "Tonies Audio Player", + "selectTonieToPlay": "Wähle einen Tonie/ein Tag zum Abspielen aus", + "title": "Tonies Audio Player", + "unknown": "Unbekannt" + }, "toniesExportList": "Tonies-Exportliste", "toniesExportListCreateDate": "Erstellt am", "unsetTonie": "Tonie/Tag" diff --git a/public/translations/en.json b/public/translations/en.json index fde3b886..a9c880c2 100644 --- a/public/translations/en.json +++ b/public/translations/en.json @@ -1879,6 +1879,7 @@ }, "selectMode": { "cancel": "Cancel", + "cancelButtonTooltip": "Cancel selection mode", "exportCompleteInfoToJson": "Export selected - complete info - to JSON", "exportCsv": "Export as CSV", "exportCsvTooltip": "Export tags as CSV file with series, episode and model info of the Tonie/tag (not the assigned content)", @@ -1888,14 +1889,13 @@ "hideSelectedTags": "Hide tags", "select": "Select", "selectAll": "Select all", + "selectButtonTooltip": "Enable selection mode", "selected": "Tags/Tonies selected", "setLive": "Enable live", "setNoCloud": "Disable cloud", "unselectAll": "Unselect all", "unsetLive": "Disable live", - "unsetNoCloud": "Enable cloud", - "cancelButtonTooltip": "Cancel selection mode", - "selectButtonTooltip": "Enable selection mode" + "unsetNoCloud": "Enable cloud" }, "system-sounds": { "navigationTitle": "System Sounds", @@ -1996,6 +1996,14 @@ "showPagination": "Show pagination", "title": "Tonies" }, + "toniesaudioplayer": { + "enterFullscreen": "Enter Fullscreen", + "exitFullscreen": "Exit Fullscreen", + "navigationTitle": "Tonies Audio Player", + "selectTonieToPlay": "Select a Tonie/tag to play", + "title": "Tonies Audio Player", + "unknown": "Unknown" + }, "toniesExportList": "Tonies export list", "toniesExportListCreateDate": "Generated on", "unsetTonie": "Tonie/Tag" diff --git a/public/translations/es.json b/public/translations/es.json index eb199f90..f62f5498 100644 --- a/public/translations/es.json +++ b/public/translations/es.json @@ -1879,6 +1879,7 @@ }, "selectMode": { "cancel": "Cancelar", + "cancelButtonTooltip": "Cancelar modo de selección", "exportCompleteInfoToJson": "Exportar - información completa - a JSON", "exportCsv": "Exportar como CSV", "exportCsvTooltip": "Exporta los Tonies/tags como archivo CSV con serie, episodio e información del modelo (no el contenido asignado)", @@ -1888,14 +1889,13 @@ "hideSelectedTags": "Ocultar tags", "select": "Seleccionar", "selectAll": "Seleccionar todo", + "selectButtonTooltip": "Activar modo de selección", "selected": "Tags/Tonies seleccionados", "setLive": "Activar live", "setNoCloud": "Desactivar cloud", "unselectAll": "Deseleccionar todo", "unsetLive": "Desactivar live", - "unsetNoCloud": "Activar cloud", - "cancelButtonTooltip": "Cancelar modo de selección", - "selectButtonTooltip": "Activar modo de selección" + "unsetNoCloud": "Activar cloud" }, "system-sounds": { "navigationTitle": "Sonidos del sistema", @@ -1996,6 +1996,14 @@ "showPagination": "Mostrar paginación", "title": "Tonies" }, + "toniesaudioplayer": { + "enterFullscreen": "Entrar en pantalla completa", + "exitFullscreen": "Salir de pantalla completa", + "navigationTitle": "Reproductor de Audio Tonies", + "selectTonieToPlay": "Selecciona un Tonie/etiqueta para reproducir", + "title": "Reproductor de Audio Tonies", + "unknown": "Desconocido" + }, "toniesExportList": "Lista de exportación de Tonies", "toniesExportListCreateDate": "Generado el", "unsetTonie": "Tonie/Tag" diff --git a/public/translations/fr.json b/public/translations/fr.json index 6a1c1334..5d31981f 100644 --- a/public/translations/fr.json +++ b/public/translations/fr.json @@ -1879,6 +1879,7 @@ }, "selectMode": { "cancel": "Annuler", + "cancelButtonTooltip": "Annuler le mode de sélection", "exportCompleteInfoToJson": "Exporter - informations complètes - en JSON", "exportCsv": "Exporter en CSV", "exportCsvTooltip": "Exportez les Tomies/tags au format CSV avec la série, l'épisode et les informations du modèle (pas le contenu assigné)", @@ -1888,14 +1889,13 @@ "hideSelectedTags": "Masquer les tags", "select": "Sélectionner", "selectAll": "Tout sélectionner", + "selectButtonTooltip": "Activer le mode de sélection", "selected": "Tags/Tonies sélectionnés", "setLive": "Activer live", "setNoCloud": "Désactiver cloud", "unselectAll": "Tout désélectionner", "unsetLive": "Désactiver live", - "unsetNoCloud": "Activer cloud", - "cancelButtonTooltip": "Annuler le mode de sélection", - "selectButtonTooltip": "Activer le mode de sélection" + "unsetNoCloud": "Activer cloud" }, "system-sounds": { "navigationTitle": "Sons du système", @@ -1996,6 +1996,14 @@ "showPagination": "Afficher la pagination", "title": "Tonies" }, + "toniesaudioplayer": { + "enterFullscreen": "Passer en plein écran", + "exitFullscreen": "Quitter le plein écran", + "navigationTitle": "Lecteur Audio Tonies", + "selectTonieToPlay": "Sélectionne un Tonie/étiquette à lire", + "title": "Lecteur Audio Tonies", + "unknown": "Inconnu" + }, "toniesExportList": "Liste d'export des Tonies", "toniesExportListCreateDate": "Généré le", "unsetTonie": "Tonie/Tag" diff --git a/src/App.tsx b/src/App.tsx index 5368a744..ba18b18c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,9 +1,7 @@ -import "./styles/matrix/matrix.css"; +import "@ant-design/v5-patch-for-react-19"; +import { ConfigProvider, Layout, theme } from "antd"; import { useEffect, useState } from "react"; import { Route, BrowserRouter as Router, Routes } from "react-router-dom"; -import { ConfigProvider, Layout, theme } from "antd"; -import "@ant-design/v5-patch-for-react-19"; - import { BulbOutlined, CodeOutlined, MoonOutlined, SunOutlined } from "@ant-design/icons"; import { TeddyCloudProvider } from "./TeddyCloudContext"; @@ -18,6 +16,8 @@ import { ContributionToniesJsonPage } from "./pages/community/ContributionTonies import { ContributorsPage } from "./pages/community/ContributorsPage"; import { FAQPage } from "./pages/community/FAQPage"; import { HowToGetSupportPage } from "./pages/community/HowToGetSupportPage"; +import { PluginListPage } from "./pages/community/PluginListPage"; +import { PluginPage } from "./pages/community/PluginPage"; import { TranslationsPage } from "./pages/community/TranslationsPage"; import { FeaturesPage } from "./pages/home/FeaturesPage"; import { HomePage } from "./pages/home/HomePage"; @@ -42,12 +42,12 @@ import { LibraryPage } from "./pages/tonies/LibraryPage"; import { SystemSoundsPage } from "./pages/tonies/SystemSoundsPage"; import { TeddyStudioPage } from "./pages/tonies/TeddyStudioPage"; import { TonieAudioPlaylistsPage } from "./pages/tonies/TonieAudioPlaylistsPage"; +import { ToniesAudioPlayerPage } from "./pages/tonies/ToniesAudioPlayerPage"; import { ToniesPage } from "./pages/tonies/ToniesPage"; +import { matrixAlgorithm } from "./styles/matrix/matrixAlgorithm"; import { detectColorScheme } from "./utils/browserUtils"; -import { PluginListPage } from "./pages/community/PluginListPage"; -import { PluginPage } from "./pages/community/PluginPage"; -import { matrixAlgorithm as matrixAlgorithm } from "./styles/matrix/matrixAlgorithm"; import MatrixRain from "./styles/matrix/matrixRain"; +import "./styles/matrix/matrix.css"; function App() { const { defaultAlgorithm, darkAlgorithm } = theme; @@ -133,6 +133,7 @@ function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/components/audio/StandAloneAudioPlayer.tsx b/src/components/audio/StandAloneAudioPlayer.tsx new file mode 100644 index 00000000..1a0d7ef7 --- /dev/null +++ b/src/components/audio/StandAloneAudioPlayer.tsx @@ -0,0 +1,292 @@ +import { PauseCircleOutlined, PlayCircleOutlined, StepBackwardOutlined, StepForwardOutlined } from "@ant-design/icons"; +import { Button, Card, Modal, Slider, Space, Typography } from "antd"; +import React, { useEffect, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { TonieCardProps } from "../../types/tonieTypes"; +import { supportsOggOpus } from "../../utils/browserUtils"; + +import logoImg from "../../assets/logo.png"; + +const { Title, Text } = Typography; + +interface StandAloneAudioPlayerProps { + tonieCard?: TonieCardProps; +} + +const StandAloneAudioPlayer: React.FC = ({ tonieCard }) => { + const audioRef = useRef(null); + const { t } = useTranslation(); + const [isPlaying, setIsPlaying] = useState(false); + const [progress, setProgress] = useState(0); + const [duration, setDuration] = useState(0); + const [currentTrackNo, setCurrentTrackNo] = useState(0); + const [currentTrackTitle, setCurrentTrackTitle] = useState(""); + const [isLoaded, setIsLoaded] = useState(false); + + useEffect(() => { + const audio = audioRef.current; + if (!audio || !validateSource(url)) return; + + while (audio.firstChild) { + audio.removeChild(audio.firstChild); + } + audio.load(); + + setIsPlaying(false); + setProgress(0); + setDuration(0); + setCurrentTrackNo(0); + setCurrentTrackTitle(""); + setIsLoaded(false); + + const pattern = /\/....04E0\?|(\?ogg)/; + const matches = pattern.test(url); + + let sourceElement = audio.querySelector("source"); + if (!sourceElement) { + sourceElement = document.createElement("source"); + audio.appendChild(sourceElement); + } + + if (matches) { + sourceElement.type = "audio/ogg"; + } + + const encodedUrl = url.replace("+", "%2B").replace("#", "%23"); + if (sourceElement.src !== encodedUrl) { + sourceElement.src = encodedUrl; + audio.load(); + } + + const onLoadedMetadata = () => { + setDuration(audio.duration || 0); + setIsLoaded(true); + + const globalAudio = document.getElementById("globalAudioPlayer") as HTMLAudioElement; + if (globalAudio) { + while (globalAudio.firstChild) { + globalAudio.removeChild(globalAudio.firstChild); + } + globalAudio.load(); + } + setIsPlaying(true); + audio.play(); + }; + + const onTimeUpdate = (e: Event) => handleTimeUpdate(e); + const onEnded = () => setIsPlaying(false); + + audio.addEventListener("loadedmetadata", onLoadedMetadata); + audio.addEventListener("canplay", onLoadedMetadata); + audio.addEventListener("timeupdate", onTimeUpdate); + audio.addEventListener("ended", onEnded); + + return () => { + audio.removeEventListener("loadedmetadata", onLoadedMetadata); + audio.removeEventListener("canplay", onLoadedMetadata); + audio.removeEventListener("timeupdate", onTimeUpdate); + audio.removeEventListener("ended", onEnded); + }; + }, [tonieCard]); + + // MediaSession + useEffect(() => { + const audio = audioRef.current; + if (!audio || !navigator.mediaSession || !tonieCard) return; + + navigator.mediaSession.metadata = new MediaMetadata({ + title: currentTrackTitle || tonieCard.tonieInfo.episode || "", + album: tonieCard.tonieInfo.episode || "", + artist: tonieCard.tonieInfo.series || "", + artwork: [{ src: tonieCard.tonieInfo.picture, sizes: "96x96,128x128,192x192,256x256,384x384,512x512" }], + }); + + navigator.mediaSession.setActionHandler("play", () => audio.play()); + navigator.mediaSession.setActionHandler("pause", () => audio.pause()); + navigator.mediaSession.setActionHandler("previoustrack", handlePrevTrackButton); + navigator.mediaSession.setActionHandler("nexttrack", handleNextTrackButton); + }, [currentTrackTitle, tonieCard]); + + if (!tonieCard) { + return ( + + } + styles={{ body: { padding: "0 24px 24px" } }} + > + {t("tonies.toniesaudioplayer.selectTonieToPlay")} + +
+
+ ); +}; diff --git a/src/components/tonies/ToniesSubNav.tsx b/src/components/tonies/ToniesSubNav.tsx index b7d889e1..03afdc71 100644 --- a/src/components/tonies/ToniesSubNav.tsx +++ b/src/components/tonies/ToniesSubNav.tsx @@ -11,6 +11,7 @@ import { UnorderedListOutlined, UserAddOutlined, FormatPainterOutlined, + PlayCircleOutlined, } from "@ant-design/icons"; import i18n from "../../i18n"; @@ -71,6 +72,22 @@ export const ToniesSubNav = () => { icon: React.createElement(UserOutlined), title: t("tonies.tonies.navigationTitle"), }, + { + key: "tonies-audio-player", + label: ( + { + setNavOpen(false); + setSubNavOpen(false); + }} + > + {t("tonies.toniesaudioplayer.navigationTitle")} + + ), + icon: React.createElement(PlayCircleOutlined), + title: t("tonies.toniesaudioplayer.navigationTitle"), + }, { key: "encoder", label: ( diff --git a/src/index.css b/src/index.css index fd34d574..2454a7e4 100644 --- a/src/index.css +++ b/src/index.css @@ -177,3 +177,12 @@ code { align-content: center; } /* end of workaround */ + +.pseudo-fullscreen { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 9999; +} diff --git a/src/pages/community/ChangelogPage.tsx b/src/pages/community/ChangelogPage.tsx index ee3e1f35..ab823bb3 100644 --- a/src/pages/community/ChangelogPage.tsx +++ b/src/pages/community/ChangelogPage.tsx @@ -48,6 +48,7 @@ export const ChangelogPage = () => { "gui: Stop auto scroll to top on page change when user manually scrolls", "gui: Show user entered model in tonies card header and information model if it's not found in tonies.(custom.)json", "gui: Added PluginTemplate download, thanks to b1u3n4z9u1 for preparing that template!", + "gui: Added Tonies Audio Player Page, first version, layout optimization to do https://github.com/toniebox-reverse-engineering/teddycloud_web/issues/201", "gui: Some refactoring", ], commits: [ diff --git a/src/pages/tonies/ToniesAudioPlayerPage.tsx b/src/pages/tonies/ToniesAudioPlayerPage.tsx new file mode 100644 index 00000000..72ba6f71 --- /dev/null +++ b/src/pages/tonies/ToniesAudioPlayerPage.tsx @@ -0,0 +1,142 @@ +import { useEffect, useState, useRef } from "react"; +import { useLocation } from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { Tooltip, Button } from "antd"; +import { FullscreenOutlined, FullscreenExitOutlined } from "@ant-design/icons"; + +import { TonieCardProps } from "../../types/tonieTypes"; +import { defaultAPIConfig } from "../../config/defaultApiConfig"; +import { TeddyCloudApi } from "../../api"; + +import BreadcrumbWrapper, { StyledContent, StyledLayout, StyledSider } from "../../components/StyledComponents"; +import { ToniesSubNav } from "../../components/tonies/ToniesSubNav"; +import { useTeddyCloud } from "../../TeddyCloudContext"; +import { NotificationTypeEnum } from "../../types/teddyCloudNotificationTypes"; +import { useTonieboxContent } from "../../components/utils/OverlayContentDirectories"; +import { ToniesAudioPlayer } from "../../components/tonies/ToniesAudioPlayer"; +import LoadingSpinner from "../../components/utils/LoadingSpinner"; +import { useFullscreen } from "../../utils/browserUtils"; + +const api = new TeddyCloudApi(defaultAPIConfig()); + +export const ToniesAudioPlayerPage = () => { + const { t } = useTranslation(); + const { addNotification } = useTeddyCloud(); + const contentRef = useRef(null); + const { isFullscreen, enterFullscreen, exitFullscreen } = useFullscreen(contentRef); + const location = useLocation(); + const searchParams = new URLSearchParams(location.search); + const linkOverlay = searchParams.get("overlay"); + const { overlay } = useTonieboxContent(linkOverlay); + + const [tonies, setTonies] = useState([]); + const [loading, setLoading] = useState(true); + //const [isFullscreen, setIsFullscreen] = useState(false); + + const toggleFullscreen = () => { + if (!document.fullscreenElement && contentRef.current) { + contentRef.current.requestFullscreen(); + enterFullscreen(); + } else { + document.exitFullscreen(); + exitFullscreen(); + } + }; + + useEffect(() => { + const fetchTonies = async () => { + setLoading(true); + try { + const tonieData = (await api.apiGetTagIndex(overlay ? overlay : "", true)).filter((item) => !item.hide); + setTonies( + tonieData.sort((a, b) => { + const seriesA = a.sourceInfo?.series || a.tonieInfo.series || "Unknown"; + const seriesB = b.sourceInfo?.series || b.tonieInfo.series || "Unknown"; + + if (seriesA < seriesB) return -1; + if (seriesA > seriesB) return 1; + + const episodeA = a.sourceInfo?.episode || a.tonieInfo.episode || ""; + const episodeB = b.sourceInfo?.episode || b.tonieInfo.episode || ""; + + if (episodeA < episodeB) return -1; + if (episodeA > episodeB) return 1; + + return 0; + }) + ); + } catch (error) { + addNotification( + NotificationTypeEnum.Error, + t("tonies.errorFetchingTonies"), + t("tonies.errorFetchingTonies") + ": " + error, + t("tonies.toniesaudioplayer.navigationTitle") + ); + console.log("error: fetching tonies failed: " + error); + } finally { + setLoading(false); + } + }; + + fetchTonies(); + }, [overlay]); + + return ( + <> + + + + + + +
+

{t("tonies.toniesaudioplayer.title")}

+ +
+ + {loading ? ( + + ) : ( + tonie.type === "tag") + .filter((tonie) => tonie.hide === false)} + overlay={overlay} + /> + )} +
+
+ + ); +}; diff --git a/src/utils/browserUtils.tsx b/src/utils/browserUtils.tsx index 7477e0e2..180b1d22 100644 --- a/src/utils/browserUtils.tsx +++ b/src/utils/browserUtils.tsx @@ -1,3 +1,5 @@ +import { RefObject, useEffect, useState } from "react"; + export const isSafari = () => { const ua = navigator.userAgent.toLowerCase(); return ua.includes("safari") && !ua.includes("chrome"); @@ -21,6 +23,55 @@ export const isIOS = () => { ); }; +export function useFullscreen(elementRef: RefObject) { + const [isFullscreen, setIsFullscreen] = useState(false); + + useEffect(() => { + const handler = () => { + setIsFullscreen(!!document.fullscreenElement); + }; + + document.addEventListener("fullscreenchange", handler); + return () => document.removeEventListener("fullscreenchange", handler); + }, []); + + const enterFullscreen = () => { + const el = elementRef.current; + if (!el) return; + + if (isIOS()) { + setIsFullscreen(true); + } else if (el.requestFullscreen) { + try { + el.requestFullscreen(); + setIsFullscreen(true); + } catch (err) { + console.warn("Fullscreen request failed, using pseudo fullscreen fallback:", err); + setIsFullscreen(true); + } + } else { + setIsFullscreen(true); + } + }; + + const exitFullscreen = () => { + if (isIOS()) { + setIsFullscreen(false); + } else if (document.fullscreenElement) { + try { + document.exitFullscreen(); + } catch (err) { + console.warn("Exiting fullscreen failed, using pseudo fullscreen fallback:", err); + setIsFullscreen(false); + } + } else { + setIsFullscreen(false); + } + }; + + return { isFullscreen, enterFullscreen, exitFullscreen }; +} + export const isVolumeControlSupported = (): boolean => { const testAudio = document.createElement("audio"); try { diff --git a/vite.config.ts b/vite.config.ts index db599d4f..cfaa5645 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -47,7 +47,7 @@ export default defineConfig(({ command, mode }) => { "/custom_img": { target: proxyUrl, changeOrigin: true, - rewrite: (path) => path.replace(/^\/custom_img/, "/custom_img"), + secure: false, }, }, }, From 4de2fb787443657e9e0ee91748e5ce689e4918ad Mon Sep 17 00:00:00 2001 From: henryk86 <166761451+henryk86@users.noreply.github.com> Date: Mon, 29 Sep 2025 20:41:22 +0200 Subject: [PATCH 06/22] gh-201 added real standalone mode --- public/translations/de.json | 4 +- public/translations/en.json | 4 +- public/translations/es.json | 4 +- public/translations/fr.json | 4 +- src/App.tsx | 6 +- src/pages/tonies/ToniesAudioPlayerPage.tsx | 128 +++++++++++++-------- 6 files changed, 99 insertions(+), 51 deletions(-) diff --git a/public/translations/de.json b/public/translations/de.json index 6b02b7c0..933b02e2 100644 --- a/public/translations/de.json +++ b/public/translations/de.json @@ -2002,7 +2002,9 @@ "navigationTitle": "Tonies Audio Player", "selectTonieToPlay": "Wähle einen Tonie/ein Tag zum Abspielen aus", "title": "Tonies Audio Player", - "unknown": "Unbekannt" + "unknown": "Unbekannt", + "openStandalone": "Player im Standalone-Modus öffnen", + "standaloneTitle": "Audio Player" }, "toniesExportList": "Tonies-Exportliste", "toniesExportListCreateDate": "Erstellt am", diff --git a/public/translations/en.json b/public/translations/en.json index a9c880c2..23fc746f 100644 --- a/public/translations/en.json +++ b/public/translations/en.json @@ -2002,7 +2002,9 @@ "navigationTitle": "Tonies Audio Player", "selectTonieToPlay": "Select a Tonie/tag to play", "title": "Tonies Audio Player", - "unknown": "Unknown" + "unknown": "Unknown", + "openStandalone": "Open Player in standalone mode", + "standaloneTitle": "Audio Player" }, "toniesExportList": "Tonies export list", "toniesExportListCreateDate": "Generated on", diff --git a/public/translations/es.json b/public/translations/es.json index f62f5498..f179e005 100644 --- a/public/translations/es.json +++ b/public/translations/es.json @@ -2002,7 +2002,9 @@ "navigationTitle": "Reproductor de Audio Tonies", "selectTonieToPlay": "Selecciona un Tonie/etiqueta para reproducir", "title": "Reproductor de Audio Tonies", - "unknown": "Desconocido" + "unknown": "Desconocido", + "openStandalone": "Abrir el reproductor en modo independiente", + "standaloneTitle": "Reproductor de Audio" }, "toniesExportList": "Lista de exportación de Tonies", "toniesExportListCreateDate": "Generado el", diff --git a/public/translations/fr.json b/public/translations/fr.json index 5d31981f..988b73c4 100644 --- a/public/translations/fr.json +++ b/public/translations/fr.json @@ -2002,7 +2002,9 @@ "navigationTitle": "Lecteur Audio Tonies", "selectTonieToPlay": "Sélectionne un Tonie/étiquette à lire", "title": "Lecteur Audio Tonies", - "unknown": "Inconnu" + "unknown": "Inconnu", + "openStandalone": "Ouvrir le lecteur en mode autonome", + "standaloneTitle": "Lecteur Audio" }, "toniesExportList": "Liste d'export des Tonies", "toniesExportListCreateDate": "Généré le", diff --git a/src/App.tsx b/src/App.tsx index ba18b18c..db76b59c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -133,7 +133,11 @@ function App() { } /> } /> } /> - } /> + } + /> + } /> } /> } /> } /> diff --git a/src/pages/tonies/ToniesAudioPlayerPage.tsx b/src/pages/tonies/ToniesAudioPlayerPage.tsx index 72ba6f71..139c47d6 100644 --- a/src/pages/tonies/ToniesAudioPlayerPage.tsx +++ b/src/pages/tonies/ToniesAudioPlayerPage.tsx @@ -1,8 +1,8 @@ import { useEffect, useState, useRef } from "react"; -import { useLocation } from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { Tooltip, Button } from "antd"; -import { FullscreenOutlined, FullscreenExitOutlined } from "@ant-design/icons"; +import { FullscreenOutlined, FullscreenExitOutlined, ExpandOutlined, ExportOutlined } from "@ant-design/icons"; import { TonieCardProps } from "../../types/tonieTypes"; import { defaultAPIConfig } from "../../config/defaultApiConfig"; @@ -19,9 +19,14 @@ import { useFullscreen } from "../../utils/browserUtils"; const api = new TeddyCloudApi(defaultAPIConfig()); -export const ToniesAudioPlayerPage = () => { +type ToniesAudioPlayerPageProps = { + standalone?: boolean; +}; + +export const ToniesAudioPlayerPage: React.FC = ({ standalone = false }) => { const { t } = useTranslation(); const { addNotification } = useTeddyCloud(); + const navigate = useNavigate(); const contentRef = useRef(null); const { isFullscreen, enterFullscreen, exitFullscreen } = useFullscreen(contentRef); const location = useLocation(); @@ -43,6 +48,11 @@ export const ToniesAudioPlayerPage = () => { } }; + const openStandalone = () => { + window.open("tcplayer", "_blank"); + navigate("/"); + }; + useEffect(() => { const fetchTonies = async () => { setLoading(true); @@ -81,7 +91,74 @@ export const ToniesAudioPlayerPage = () => { fetchTonies(); }, [overlay]); - return ( + const toniesAudioPlayerContent = ( + +
+

{t("tonies.toniesaudioplayer.title")}

+
+ +
+
+ + {loading ? ( + + ) : ( + tonie.type === "tag").filter((tonie) => tonie.hide === false)} + overlay={overlay} + /> + )} +
+ ); + + return standalone ? ( + <> + + + {toniesAudioPlayerContent} + + ) : ( <> @@ -94,48 +171,7 @@ export const ToniesAudioPlayerPage = () => { { title: t("tonies.toniesaudioplayer.navigationTitle") }, ]} /> - -
-

{t("tonies.toniesaudioplayer.title")}

- -
- - {loading ? ( - - ) : ( - tonie.type === "tag") - .filter((tonie) => tonie.hide === false)} - overlay={overlay} - /> - )} -
+ {toniesAudioPlayerContent} ); From 22a90a0cb66680fe52e0b05be9705b76407f1144 Mon Sep 17 00:00:00 2001 From: henryk86 <166761451+henryk86@users.noreply.github.com> Date: Mon, 29 Sep 2025 23:04:12 +0200 Subject: [PATCH 07/22] gh-201 improved player, added tracklist modal and volume control --- .../audio/StandAloneAudioPlayer.tsx | 127 +++++++++++++++++- src/components/tonies/ToniesAudioPlayer.tsx | 10 ++ .../utils/TonieInformationModal.tsx | 84 ++++++------ src/pages/tonies/ToniesAudioPlayerPage.tsx | 1 - 4 files changed, 175 insertions(+), 47 deletions(-) diff --git a/src/components/audio/StandAloneAudioPlayer.tsx b/src/components/audio/StandAloneAudioPlayer.tsx index 1a0d7ef7..9cdf4e11 100644 --- a/src/components/audio/StandAloneAudioPlayer.tsx +++ b/src/components/audio/StandAloneAudioPlayer.tsx @@ -1,9 +1,17 @@ -import { PauseCircleOutlined, PlayCircleOutlined, StepBackwardOutlined, StepForwardOutlined } from "@ant-design/icons"; -import { Button, Card, Modal, Slider, Space, Typography } from "antd"; +import { + MutedOutlined, + PauseCircleOutlined, + PlayCircleOutlined, + SoundOutlined, + StepBackwardOutlined, + StepForwardOutlined, + UnorderedListOutlined, +} from "@ant-design/icons"; +import { Button, Card, List, Modal, Slider, Space, Tooltip, Typography } from "antd"; import React, { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { TonieCardProps } from "../../types/tonieTypes"; -import { supportsOggOpus } from "../../utils/browserUtils"; +import { isIOS, supportsOggOpus } from "../../utils/browserUtils"; import logoImg from "../../assets/logo.png"; @@ -22,6 +30,14 @@ const StandAloneAudioPlayer: React.FC = ({ tonieCard const [currentTrackNo, setCurrentTrackNo] = useState(0); const [currentTrackTitle, setCurrentTrackTitle] = useState(""); const [isLoaded, setIsLoaded] = useState(false); + const [isTracklistVisible, setIsTracklistVisible] = useState(false); + const [volume, setVolume] = useState(100); + + useEffect(() => { + if (audioRef.current) { + audioRef.current.volume = volume / 100; + } + }, [volume]); useEffect(() => { const audio = audioRef.current; @@ -89,7 +105,6 @@ const StandAloneAudioPlayer: React.FC = ({ tonieCard }; }, [tonieCard]); - // MediaSession useEffect(() => { const audio = audioRef.current; if (!audio || !navigator.mediaSession || !tonieCard) return; @@ -136,6 +151,63 @@ const StandAloneAudioPlayer: React.FC = ({ tonieCard ); } + const openTracklist = () => { + setIsTracklistVisible(true); + }; + + const closeTracklist = () => { + setIsTracklistVisible(false); + }; + + const trackSecondsMatchSourceTracks = (tonieCard: TonieCardProps, tracksLength: number) => { + return tonieCard.trackSeconds?.length === tracksLength; + }; + + const getTrackStartTime = (tonieCard: TonieCardProps, index: number) => { + const trackSeconds = tonieCard.trackSeconds; + return (trackSeconds && trackSeconds[index]) || 0; + }; + + const tracklistModal = ( + + {tonieCard?.tonieInfo?.tracks?.length ? ( + ( + +
+ {trackSecondsMatchSourceTracks(tonieCard, tonieCard.tonieInfo.tracks?.length) ? ( + <> + { + setIsTracklistVisible(false); + handlePlayPause(getTrackStartTime(tonieCard, index)); + }} + />{" "} + + ) : ( + "" + )}{" "} +
+ {index + 1}. {track} +
+
+
+ )} + /> + ) : ( +

{t("tonies.toniesaudioplayer.noTracks", "No tracks available")}

+ )} +
+ ); + const tracks = tonieCard.sourceInfo?.tracks || tonieCard.tonieInfo.tracks || []; const trackSeconds = tonieCard.trackSeconds || []; @@ -153,10 +225,15 @@ const StandAloneAudioPlayer: React.FC = ({ tonieCard return true; }; - const handlePlayPause = () => { + const handlePlayPause = (startTime?: number) => { if (!audioRef.current || !isLoaded) return; const audio = audioRef.current; + + if (startTime) { + audio.currentTime = startTime; + } + if (isPlaying) { audio.pause(); setIsPlaying(false); @@ -246,6 +323,15 @@ const StandAloneAudioPlayer: React.FC = ({ tonieCard formatter: (val) => `${Math.floor((val || 0) / 60)}:${String(Math.floor((val || 0) % 60)).padStart(2, "0")}`, }} + marks={ + tonieCard.trackSeconds + ? tonieCard.trackSeconds.reduce((acc: Record, sec: number) => { + acc[sec] = " "; + return acc; + }, {}) + : undefined + } + style={{ marginBottom: 8 }} />
@@ -258,6 +344,12 @@ const StandAloneAudioPlayer: React.FC = ({ tonieCard
+