Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
25ec1fc
fix display bug on homepage
henryk86 Sep 14, 2025
dc0116c
added plguin feature to features list
henryk86 Sep 14, 2025
a94e6af
Update de.json
henryk86 Sep 14, 2025
8fb8721
fix gh-239
henryk86 Sep 23, 2025
a5f66f3
Merge branch 'update-packages-to-latest-available-versions' of https:…
henryk86 Sep 23, 2025
c43741c
gh-201 added tonies player page as a standalone player, updated all u…
henryk86 Sep 28, 2025
4de2fb7
gh-201 added real standalone mode
henryk86 Sep 29, 2025
22a90a0
gh-201 improved player, added tracklist modal and volume control
henryk86 Sep 29, 2025
de8d47b
gh-201 cleanup
henryk86 Sep 29, 2025
7fa2809
separated play pause handling
henryk86 Sep 29, 2025
209a423
minor improvement
henryk86 Oct 1, 2025
3aa52c3
updated packages
henryk86 Oct 2, 2025
576df7c
hide NaN or Infinity Durations
henryk86 Oct 2, 2025
72df07f
added slider for fast crolling through carousel
henryk86 Oct 2, 2025
13f062a
moved fullscreen to card
henryk86 Oct 4, 2025
42d8031
disabled fullscreen on ios for now as its not working...
henryk86 Oct 4, 2025
7c01c43
implemented workaround IOS Fullscreen (actually only a fullpageonly)
henryk86 Oct 4, 2025
4182038
fixed track list align
henryk86 Oct 4, 2025
3e32403
gh-201 add switching between footer and fullsize player
henryk86 Oct 4, 2025
1769855
fix to avoid flickering when choosing a new tonie to play
henryk86 Oct 4, 2025
a4db748
minor view height optimization
henryk86 Oct 4, 2025
497803d
updated changelog page
henryk86 Oct 5, 2025
cc090e2
updated packages, renamed tonies audio player to audioplayer and chan…
henryk86 Oct 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,17 @@ Your app is ready to be deployed!

See the section about [deployment](https://vitejs.dev/guide/static-deploy.html) for more information.

### `npm run preview`

After building the app, you can test the optimized (minified) production build using this command.
Unlike React’s development mode, which enables features such as hot reloading, detailed error overlays, and repeated API calls for strict mode checks, the preview mode runs the app exactly as it will behave in production.

This means:

- API calls are executed only once (no double-invocation from React Strict Mode)
- Performance reflects the real-world production setup
- You can verify that your build works correctly before deployment

## Learn More

You can learn more in the [Vite documentation](https://vitejs.dev/guide/).
Expand Down
908 changes: 475 additions & 433 deletions package-lock.json

Large diffs are not rendered by default.

38 changes: 19 additions & 19 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,42 @@
"private": true,
"homepage": "/web",
"dependencies": {
"@ant-design/icons": "^6.0.0",
"@ant-design/icons": "^6.1.0",
"@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.6.2",
"@types/react": "^19.2.0",
"@types/react-dom": "^19.2.0",
"@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.3",
"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": "^19.2.0",
"react-dom": "^19.2.0",
"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",
"typescript": "^5.9.3",
"vite": "^7.1.9",
"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",
"cross-env": "^10.0.0"
"concurrently": "^9.2.1",
"cross-env": "^10.1.0"
},
"scripts": {
"start-http": "cross-env PORT=3000 vite",
Expand Down
27 changes: 24 additions & 3 deletions public/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,12 @@
"01homeAssistantIntegration": "Home Assistant-Integration (MQTT)"
},
"title": "MQTT-Client"
},
"13plugins": {
"items": {
"01pluginFeature": "Erweiter die TeddyCloud-Funktionalität durch benutzerdefinierte Plugins"
},
"title": "TeddyCloud-Plugins"
}
},
"futureFeatures": {
Expand Down Expand Up @@ -1873,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)",
Expand All @@ -1882,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",
Expand Down Expand Up @@ -1990,6 +1996,21 @@
"showPagination": "Paginierung einblenden",
"title": "Tonies"
},
"toniesaudioplayer": {
"enterFullscreen": "Vollbild starten",
"exitFullscreen": "Vollbild beenden",
"navigationTitle": "Audio Player",
"selectTonieToPlay": "Wähle einen Tonie/ein Tag zum Abspielen aus",
"title": "Audio Player",
"unknown": "Unbekannt",
"openStandalone": "Player im Standalone-Modus öffnen",
"standaloneTitle": "Audio Player",
"noTracks": "Keine Tracks verfügbar",
"openInTonieAudioPlayer": "Im Audio Player öffnen",
"continueInFooterAudioPlayer": "Im Fußbereich Audio Player fortsetzen",
"shrink": "Audio Player minimieren",
"expand": "Audio Player vergrößern"
},
"toniesExportList": "Tonies-Exportliste",
"toniesExportListCreateDate": "Erstellt am",
"unsetTonie": "Tonie/Tag"
Expand Down
27 changes: 24 additions & 3 deletions public/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down Expand Up @@ -1873,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)",
Expand All @@ -1882,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",
Expand Down Expand Up @@ -1990,6 +1996,21 @@
"showPagination": "Show pagination",
"title": "Tonies"
},
"toniesaudioplayer": {
"enterFullscreen": "Enter Fullscreen",
"exitFullscreen": "Exit Fullscreen",
"navigationTitle": "Audio Player",
"selectTonieToPlay": "Select a Tonie/tag to play",
"title": "Audio Player",
"unknown": "Unknown",
"openStandalone": "Open player in standalone mode",
"standaloneTitle": "Audio Player",
"noTracks": "No tracks available",
"openInTonieAudioPlayer": "Open in Audio Player",
"continueInFooterAudioPlayer": "Continue in footer audio player",
"shrink": "Minimize audio player",
"expand": "Expand audio player"
},
"toniesExportList": "Tonies export list",
"toniesExportListCreateDate": "Generated on",
"unsetTonie": "Tonie/Tag"
Expand Down
27 changes: 24 additions & 3 deletions public/translations/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down Expand Up @@ -1873,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)",
Expand All @@ -1882,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",
Expand Down Expand Up @@ -1990,6 +1996,21 @@
"showPagination": "Mostrar paginación",
"title": "Tonies"
},
"toniesaudioplayer": {
"enterFullscreen": "Entrar en pantalla completa",
"exitFullscreen": "Salir de pantalla completa",
"navigationTitle": "Reproductor de Audio",
"selectTonieToPlay": "Selecciona un Tonie/etiqueta para reproducir",
"title": "Reproductor de Audio",
"unknown": "Desconocido",
"openStandalone": "Abrir el reproductor en modo independiente",
"standaloneTitle": "Reproductor de Audio",
"noTracks": "No hay pistas disponibles",
"openInTonieAudioPlayer": "Abrir en Audio Player",
"continueInFooterAudioPlayer": "Continuar en el reproductor de audio del pie de página",
"shrink": "Minimizar el reproductor de audio",
"expand": "Ampliar el reproductor de audio"
},
"toniesExportList": "Lista de exportación de Tonies",
"toniesExportListCreateDate": "Generado el",
"unsetTonie": "Tonie/Tag"
Expand Down
27 changes: 24 additions & 3 deletions public/translations/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down Expand Up @@ -1873,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é)",
Expand All @@ -1882,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",
Expand Down Expand Up @@ -1990,6 +1996,21 @@
"showPagination": "Afficher la pagination",
"title": "Tonies"
},
"toniesaudioplayer": {
"enterFullscreen": "Passer en plein écran",
"exitFullscreen": "Quitter le plein écran",
"navigationTitle": "Lecteur Audio",
"selectTonieToPlay": "Sélectionne un Tonie/étiquette à lire",
"title": "Lecteur Audio",
"unknown": "Inconnu",
"openStandalone": "Ouvrir le lecteur en mode autonome",
"standaloneTitle": "Lecteur Audio",
"noTracks": "Aucune piste disponible",
"openInTonieAudioPlayer": "Ouvrir dans le lecteur audio",
"continueInFooterAudioPlayer": "Continuer dans le lecteur audio en bas",
"shrink": "Réduire le lecteur audio",
"expand": "Agrandir le lecteur audio"
},
"toniesExportList": "Liste d'export des Tonies",
"toniesExportListCreateDate": "Généré le",
"unsetTonie": "Tonie/Tag"
Expand Down
19 changes: 12 additions & 7 deletions src/App.tsx
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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";
Expand All @@ -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;
Expand Down Expand Up @@ -133,6 +133,11 @@ function App() {
<Route path="/home/toniemeeting" element={<TonieMeetingPage />} />
<Route path="/home/plugin/:pluginId" element={<PluginPage />} />
<Route path="/tonies" element={<ToniesPage />} />
<Route
path="/tonies/audioplayer"
element={<ToniesAudioPlayerPage standalone={false} />}
/>
<Route path="/audioplayer" element={<ToniesAudioPlayerPage standalone />} />
<Route path="/tonies/system-sounds" element={<SystemSoundsPage />} />
<Route path="/tonies/content" element={<ContentPage />} />
<Route path="/tonies/library" element={<LibraryPage />} />
Expand Down
3 changes: 2 additions & 1 deletion src/components/audio/AudioContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ export const AudioProvider: React.FC<AudioProviderProps> = ({ 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) {
Expand Down
Loading